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} +
+ )} +
-
- ))} + )) + )}
);