'use client'; import type { ApiItemKind } from '@microsoft/api-extractor-model'; import { VscArrowRight } from '@react-icons/all-files/vsc/VscArrowRight'; import { VscSymbolClass } from '@react-icons/all-files/vsc/VscSymbolClass'; import { VscSymbolEnum } from '@react-icons/all-files/vsc/VscSymbolEnum'; import { VscSymbolField } from '@react-icons/all-files/vsc/VscSymbolField'; import { VscSymbolInterface } from '@react-icons/all-files/vsc/VscSymbolInterface'; import { VscSymbolMethod } from '@react-icons/all-files/vsc/VscSymbolMethod'; import { VscSymbolProperty } from '@react-icons/all-files/vsc/VscSymbolProperty'; import { VscSymbolVariable } from '@react-icons/all-files/vsc/VscSymbolVariable'; import { Dialog } from 'ariakit/dialog'; import { Command } from 'cmdk'; import { usePathname, useRouter } from 'next/navigation'; import { useEffect, useMemo, useState } from 'react'; import { useKey } from 'react-use'; import { useCmdK } from '~/contexts/cmdK'; import { client } from '~/util/search'; function resolveIcon(item: keyof typeof ApiItemKind) { switch (item) { case 'Class': return ; case 'Enum': return ; case 'Interface': return ; case 'Property': return ; case 'TypeAlias': return ; case 'Variable': return ; default: return ; } } export function CmdKDialog() { const pathname = usePathname(); const router = useRouter(); const dialog = useCmdK(); const [search, setSearch] = useState(''); const [searchResults, setSearchResults] = useState([]); const packageName = pathname?.split('/').slice(3, 4)[0]; const branchName = pathname?.split('/').slice(4, 5)[0]; const searchResultItems = useMemo( () => searchResults?.map((item, idx) => ( { router.push(item.path); dialog!.setOpen(false); }} >
{resolveIcon(item.kind)}

{item.name}

{item.summary}
{item.path}
)) ?? [], // eslint-disable-next-line react-hooks/exhaustive-deps [searchResults], ); useKey( (event) => { if (event.key === 'k' && (event.metaKey || event.ctrlKey)) { event.preventDefault(); return true; } return false; }, dialog!.toggle, { event: 'keydown', options: {} }, [], ); useEffect(() => { if (!dialog!.open) { setSearch(''); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [dialog!.open]); useEffect(() => { const searchDoc = async (searchString: string, version: string) => { const res = await client.index(`${packageName}-${version}`).search(searchString, { limit: 5 }); setSearchResults(res.hits); }; if (search && packageName) { void searchDoc(search, branchName?.replaceAll('.', '-') ?? 'main'); } else { setSearchResults([]); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [search]); return ( No results found {search ? searchResultItems : null} ); }