MCPcopy Create free account
hub / github.com/alibaba/open-code-review / useCommandSearch

Function useCommandSearch

pages/src/hooks/useCommandSearch.ts:13–69  ·  view source on GitHub ↗
(
  runSearch: (query: string, language: string) => SearchResult<S>[],
  language: string,
)

Source from the content-addressed store, hash-verified

11}
12
13export function useCommandSearch<S extends string>(
14 runSearch: (query: string, language: string) => SearchResult<S>[],
15 language: string,
16) {
17 const [searchOpen, setSearchOpen] = useState(false);
18 const [searchQuery, setSearchQuery] = useState('');
19 const [searchSelectedIdx, setSearchSelectedIdx] = useState(0);
20 const searchInputRef = useRef<HTMLInputElement>(null);
21
22 const searchResults = useMemo(
23 () => runSearch(searchQuery, language),
24 [runSearch, searchQuery, language],
25 );
26
27 /* Reset selection when results change */
28 useEffect(() => {
29 setSearchSelectedIdx(0);
30 }, [searchResults]);
31
32 /* ⌘K / Ctrl+K keyboard shortcut */
33 useEffect(() => {
34 const handleKeyDown = (e: KeyboardEvent) => {
35 if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
36 // Don't intercept when focused in other input/textarea (unless search is already open)
37 const activeEl = document.activeElement;
38 if (activeEl && (activeEl.tagName === 'INPUT' || activeEl.tagName === 'TEXTAREA') && !searchOpen) return;
39 e.preventDefault();
40 setSearchOpen(prev => !prev);
41 }
42 if (e.key === 'Escape') {
43 setSearchOpen(false);
44 }
45 };
46 window.addEventListener('keydown', handleKeyDown);
47 return () => window.removeEventListener('keydown', handleKeyDown);
48 }, [searchOpen]);
49
50 /* Focus input when search opens */
51 useEffect(() => {
52 if (searchOpen) {
53 setTimeout(() => searchInputRef.current?.focus(), 50);
54 } else {
55 setSearchQuery('');
56 }
57 }, [searchOpen]);
58
59 return {
60 searchOpen,
61 setSearchOpen,
62 searchQuery,
63 setSearchQuery,
64 searchSelectedIdx,
65 setSearchSelectedIdx,
66 searchInputRef,
67 searchResults,
68 };
69}
70

Callers 2

DocsPageFunction · 0.90
BlogPageFunction · 0.90

Calls

no outgoing calls

Tested by

no test coverage detected