"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { CommandDialog, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, } from "@/components/ui/command"; import { Button } from "@/components/ui/button"; import { Search, Handshake, Users, Building2 } from "lucide-react"; type SearchResult = { id: number; type: "deal" | "contact" | "company"; title: string; subtitle: string; }; export function GlobalSearch() { const [open, setOpen] = useState(false); const [query, setQuery] = useState(""); const [results, setResults] = useState([]); const router = useRouter(); useEffect(() => { const down = (e: KeyboardEvent) => { if (e.key === "k" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); setOpen((o) => !o); } }; document.addEventListener("keydown", down); return () => document.removeEventListener("keydown", down); }, []); useEffect(() => { if (!query || query.length < 2) { setResults([]); return; } const timer = setTimeout(async () => { const res = await fetch(`/api/search?q=${encodeURIComponent(query)}`); if (res.ok) setResults(await res.json()); }, 200); return () => clearTimeout(timer); }, [query]); function handleSelect(result: SearchResult) { setOpen(false); setQuery(""); const paths = { deal: `/deals/${result.id}`, contact: `/contacts/${result.id}`, company: `/companies/${result.id}`, }; router.push(paths[result.type]); } const icons = { deal: Handshake, contact: Users, company: Building2, }; return ( <> No results found. {results.length > 0 && ( {results.map((r) => { const Icon = icons[r.type]; return ( handleSelect(r)} >
{r.title}
{r.subtitle}
); })}
)}
); }