From 627f5fb43ac6b0af421bb53a1bf96c70b88923a0 Mon Sep 17 00:00:00 2001 From: yiliang114 <1204183885@qq.com> Date: Fri, 28 Nov 2025 10:04:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor(vscode-ide-companion):=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C=E6=80=A7?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除未使用的依赖项 qwen-code - 优化 completion 刷新逻辑,避免渲染循环 - 更新 CompletionMenu 组件,增加空状态提示 --- packages/vscode-ide-companion/NOTICES.txt | 6 --- .../vscode-ide-companion/src/webview/App.tsx | 7 ++- .../src/webview/components/CompletionMenu.tsx | 46 ++++++++++--------- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/packages/vscode-ide-companion/NOTICES.txt b/packages/vscode-ide-companion/NOTICES.txt index 5df0e664..2e801e9e 100644 --- a/packages/vscode-ide-companion/NOTICES.txt +++ b/packages/vscode-ide-companion/NOTICES.txt @@ -2323,12 +2323,6 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. License text not found. -============================================================ -@qwen-code/qwen-code@undefined -(git+https://github.com/QwenLM/qwen-code.git) - -License text not found. - ============================================================ react@19.1.0 (https://github.com/facebook/react.git) diff --git a/packages/vscode-ide-companion/src/webview/App.tsx b/packages/vscode-ide-companion/src/webview/App.tsx index 7bf364c9..88dfbb69 100644 --- a/packages/vscode-ide-companion/src/webview/App.tsx +++ b/packages/vscode-ide-companion/src/webview/App.tsx @@ -138,11 +138,16 @@ export const App: React.FC = () => { const completion = useCompletionTrigger(inputFieldRef, getCompletionItems); // When workspace files update while menu open for @, refresh items so the first @ shows the list + // Note: Avoid depending on the entire `completion` object here, since its identity + // changes on every render which would retrigger this effect and can cause a refresh loop. useEffect(() => { if (completion.isOpen && completion.triggerChar === '@') { + // Only refresh items; do not change other completion state to avoid re-renders loops completion.refreshCompletion(); } - }, [fileContext.workspaceFiles, completion]); + // Only re-run when the actual data source changes, not on every render + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fileContext.workspaceFiles, completion.isOpen, completion.triggerChar]); // Message submission const handleSubmit = useMessageSubmit({ diff --git a/packages/vscode-ide-companion/src/webview/components/CompletionMenu.tsx b/packages/vscode-ide-companion/src/webview/components/CompletionMenu.tsx index 8605d916..6a12ef2d 100644 --- a/packages/vscode-ide-companion/src/webview/components/CompletionMenu.tsx +++ b/packages/vscode-ide-companion/src/webview/components/CompletionMenu.tsx @@ -97,9 +97,7 @@ export const CompletionMenu: React.FC = ({ } }, [selected]); - if (items.length === 0) { - return null; - } + const isEmpty = items.length === 0; return (
= ({ }} >
- {items.map((item, index) => ( -
onSelect(item)} - onMouseEnter={() => setSelected(index)} - > - {item.icon && ( -
{item.icon}
- )} -
-
{item.label}
- {item.description && ( -
- {item.description} -
+ {isEmpty ? ( +
Type to search files…
+ ) : ( + items.map((item, index) => ( +
onSelect(item)} + onMouseEnter={() => setSelected(index)} + > + {item.icon && ( +
{item.icon}
)} +
+
{item.label}
+ {item.description && ( +
+ {item.description} +
+ )} +
-
- ))} + )) + )}
);