'use client'; import { Search, Terminal, Settings2, LayoutGrid } from 'lucide-react'; import { useRouter } from 'next/navigation'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslations } from '@/components/locale-provider'; import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'; import { OWNER_NAV_ENTRIES, buildGuildSearchHref, buildGuildSearchIndex, type SearchIndexEntry, type SearchItemKind } from '@/lib/dashboard-search-index'; function kindIcon(kind: SearchItemKind) { switch (kind) { case 'command': return Terminal; case 'setting': return Settings2; default: return LayoutGrid; } } interface DashboardCommandPaletteProps { guildId?: string; mode?: 'guild' | 'owner'; } export function DashboardCommandPalette({ guildId, mode = 'guild' }: DashboardCommandPaletteProps) { const t = useTranslations(); const router = useRouter(); const [open, setOpen] = useState(false); const entries = useMemo(() => { if (mode === 'owner') { return OWNER_NAV_ENTRIES; } return buildGuildSearchIndex(); }, [mode]); useEffect(() => { function onKeyDown(event: KeyboardEvent) { if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'k') { event.preventDefault(); setOpen((prev) => !prev); } } window.addEventListener('keydown', onKeyDown); return () => window.removeEventListener('keydown', onKeyDown); }, []); const resolveLabel = useCallback( (entry: SearchIndexEntry) => { if (entry.labelOverride) { return entry.labelOverride; } if (entry.labelKey) { return t(entry.labelKey); } return entry.id; }, [t] ); function navigateTo(entry: SearchIndexEntry) { setOpen(false); if (mode === 'owner') { router.push(entry.href); return; } if (!guildId) { return; } const href = buildGuildSearchHref(guildId, entry); router.push(href); if (entry.hash) { window.setTimeout(() => { document.getElementById(entry.hash!)?.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 250); } } const pages = entries.filter((e) => e.kind === 'page'); const commands = entries.filter((e) => e.kind === 'command'); const settings = entries.filter((e) => e.kind === 'setting'); const isMac = typeof navigator !== 'undefined' && /Mac|iPhone|iPad/.test(navigator.platform || navigator.userAgent); return ( <> {t('search.empty')} {pages.length > 0 ? ( {pages.map((entry) => { const Icon = kindIcon(entry.kind); const label = resolveLabel(entry); return ( navigateTo(entry)} > {label} ); })} ) : null} {commands.length > 0 ? ( {commands.map((entry) => { const Icon = kindIcon(entry.kind); const label = resolveLabel(entry); return ( navigateTo(entry)} > {label} ); })} ) : null} {settings.length > 0 ? ( {settings.map((entry) => { const Icon = kindIcon(entry.kind); const label = resolveLabel(entry); return ( navigateTo(entry)} > {label} ); })} ) : null} ); }