diff --git a/src/cli/components/SlashCommandAutocomplete.tsx b/src/cli/components/SlashCommandAutocomplete.tsx index c36a354..20f12ce 100644 --- a/src/cli/components/SlashCommandAutocomplete.tsx +++ b/src/cli/components/SlashCommandAutocomplete.tsx @@ -52,6 +52,8 @@ export function SlashCommandAutocomplete({ }: AutocompleteProps) { const [matches, setMatches] = useState([]); const [customCommands, setCustomCommands] = useState([]); + // Track if we should show "no matching commands" (non-empty query with no results) + const [showNoMatches, setShowNoMatches] = useState(false); // Load custom commands once on mount useEffect(() => { @@ -112,15 +114,23 @@ export function SlashCommandAutocomplete({ onAutocomplete: onAutocomplete ? (item) => onAutocomplete(item.cmd) : undefined, - onActiveChange, + // Disable automatic active state management - we handle it manually below + manageActiveState: false, }); + // Manually manage active state to include the "no matches" case + useEffect(() => { + const isActive = matches.length > 0 || showNoMatches; + onActiveChange?.(isActive); + }, [matches.length, showNoMatches, onActiveChange]); + // Update matches when input changes useEffect(() => { const result = extractSearchQuery(currentInput, cursorPosition); if (!result) { setMatches([]); + setShowNoMatches(false); return; } @@ -129,6 +139,7 @@ export function SlashCommandAutocomplete({ // If there's a space after the command, user has moved on - hide autocomplete if (hasSpaceAfter) { setMatches([]); + setShowNoMatches(false); return; } @@ -137,6 +148,8 @@ export function SlashCommandAutocomplete({ // If query is empty (just typed "/"), show all commands if (query.length === 0) { newMatches = allCommands; + setMatches(newMatches); + setShowNoMatches(false); } else { // Filter commands that contain the query (case-insensitive) // Match against the command name without the leading "/" @@ -145,9 +158,10 @@ export function SlashCommandAutocomplete({ const cmdName = item.cmd.slice(1).toLowerCase(); // Remove leading "/" return cmdName.includes(lowerQuery); }); + setMatches(newMatches); + // Show "no matches" message if query is non-empty and no results + setShowNoMatches(newMatches.length === 0); } - - setMatches(newMatches); }, [currentInput, cursorPosition, allCommands]); // Don't show if input doesn't start with "/" @@ -155,7 +169,16 @@ export function SlashCommandAutocomplete({ return null; } - // Don't show if no matches + // Show "no matching commands" message when query has content but no results + if (showNoMatches) { + return ( + + {" "}No matching commands + + ); + } + + // Don't show if no matches and query is empty (shouldn't happen, but safety check) if (matches.length === 0) { return null; }