'use client' import * as React from 'react' import { useRouter } from 'next/navigation' import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from '@/components/ui/command' import { Search, Star, BookOpen, Home, FileText, Code } from 'lucide-react' interface CommandMenuProps { open: boolean setOpen: (open: boolean) => void } export function CommandMenu({ open, setOpen }: CommandMenuProps) { const router = useRouter() const [search, setSearch] = React.useState('') const [results, setResults] = React.useState([]) const [loading, setLoading] = React.useState(false) // declare the async data fetching function const fetchData = React.useCallback(async () => { const response = await fetch(`/api/search?q=${encodeURIComponent(search)}`) const data = await response.json() setResults(data.results); }, []) React.useEffect(() => { const down = (e: KeyboardEvent) => { if (e.key === 'k' && (e.metaKey || e.ctrlKey)) { e.preventDefault() setOpen(!open) } } document.addEventListener('keydown', down) return () => document.removeEventListener('keydown', down) }, [open, setOpen]) React.useEffect(() => { if (!search) { return } setLoading(true) fetchData() console.log(results) setLoading(false) }, [search]) const runCommand = React.useCallback((command: () => void) => { setOpen(false) command() }, [setOpen]) const pages = [ { id: 'home', type: 'page', title: 'Home', url: '/', }, { id: 'browse', type: 'page', title: 'Browse Collections', url: '/browse', }, { id: 'search', type: 'page', title: 'Search', url: '/search', }, ] const getIcon = (type: string) => { switch (type) { case 'list': return case 'repo': return case 'page': return default: return } } return ( {loading ? (
) : (
No results found for "{search}"
)} {!search && ( {pages.map((page) => ( runCommand(() => router.push(page.url))} > {getIcon(page.type)} {page.title} ))} )} {results.length > 0 && ( {results.map((result: any) => ( runCommand(() => router.push(result.url))} > {getIcon(result.type)}
{result.title} {result.stars && ( {result.stars.toLocaleString()} )}
{result.description && ( {result.description} )} {result.category && ( {result.category} )}
))}
)} ) }