import { useEffect, useMemo } from 'react' import { useNavigate } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { ServerIcon, WalletIcon, Building2Icon, FolderKanbanIcon, LayoutDashboardIcon, SearchIcon, } from 'lucide-react' import { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, } from '@cfdm/ui/components/command' import { snapshotQueryOptions } from '@/queries/snapshot' import { providerByIdMap } from '@/lib/billmanager' interface GlobalSearchProps { open: boolean onOpenChange: (open: boolean) => void } export function GlobalSearch({ open, onOpenChange }: GlobalSearchProps) { const navigate = useNavigate() const { data: snapshot } = useQuery({ ...snapshotQueryOptions(), enabled: open }) const providerById = snapshot ? providerByIdMap(snapshot.providers) : new Map() const go = (to: string, search?: Record) => { onOpenChange(false) void navigate({ to, search }) } const vpsItems = useMemo(() => snapshot?.vps ?? [], [snapshot]) const accountItems = useMemo(() => snapshot?.providerAccounts ?? [], [snapshot]) const projectItems = useMemo(() => snapshot?.serverProjects ?? [], [snapshot]) return ( Ничего не найдено go('/dashboard')}> Дашборд go('/vps')}> Все VPS {vpsItems.slice(0, 50).map((v) => ( go('/vps/$vpsId', { vpsId: v.id })}> {v.ip || v.dns || v.id} {v.project ? · {v.project} : null} ))} {accountItems.map((a) => ( go('/accounts')} > {a.name} ))} {projectItems.map((p) => { const row = p as { id: string; name: string } return ( go('/vps', { project: row.name })}> {row.name} ) })} {(snapshot?.providers ?? []).map((p) => ( go('/providers')}> {p.name} ))} ) } export function useGlobalSearchHotkey(onOpen: () => void) { useEffect(() => { const handler = (e: KeyboardEvent) => { if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'k') { e.preventDefault() onOpen() } } window.addEventListener('keydown', handler) return () => window.removeEventListener('keydown', handler) }, [onOpen]) } export function GlobalSearchTrigger({ onClick }: { onClick: () => void }) { return ( ) }