import { observer } from "mobx-react-lite"; import OverflowTip from "@/components/kit/OverflowTip"; import type { EditorRefActions } from "."; import type { Command } from "./commands"; import { SuggestionsPopup } from "./SuggestionsPopup"; import { useSuggestions } from "./useSuggestions"; interface CommandSuggestionsProps { editorRef: React.RefObject; editorActions: React.ForwardedRef; commands: Command[]; } /** * Command suggestions popup that appears when typing "/" in the editor. * Shows available editor commands like formatting options, insertions, etc. * * Usage: * - Type "/" to trigger * - Continue typing to filter commands * - Use Arrow keys to navigate, Enter/Tab to select */ const CommandSuggestions = observer(({ editorRef, editorActions, commands }: CommandSuggestionsProps) => { const { position, suggestions, selectedIndex, isVisible, handleItemSelect } = useSuggestions({ editorRef, editorActions, triggerChar: "/", items: commands, filterItems: (items, searchQuery) => { if (!searchQuery) return items; // Filter commands by prefix match for intuitive searching return items.filter((cmd) => cmd.name.toLowerCase().startsWith(searchQuery)); }, onAutocomplete: (cmd, word, index, actions) => { // Replace the trigger word with the command output actions.removeText(index, word.length); actions.insertText(cmd.run()); // Position cursor if command specifies an offset if (cmd.cursorOffset) { actions.setCursorPosition(actions.getCursorPosition() + cmd.cursorOffset); } }, }); if (!isVisible || !position) return null; return ( cmd.name} renderItem={(cmd) => /{cmd.name}} /> ); }); export default CommandSuggestions;