"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Search, FileText, Clipboard, Image } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { searchApi } from "@/lib/api/search"; import { SearchResult } from "@/types/search"; import { useDebounce } from "@/hooks/use-debounce"; // We need to create this hook or implement debounce inline // Simple debounce hook implementation inline for now if not exists function useDebounceValue(value: T, delay: number): T { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; } export function GlobalSearch() { const router = useRouter(); const [open, setOpen] = useState(false); const [query, setQuery] = useState(""); const [suggestions, setSuggestions] = useState([]); const debouncedQuery = useDebounceValue(query, 300); useEffect(() => { if (debouncedQuery.length > 2) { searchApi.suggest(debouncedQuery).then(setSuggestions); setOpen(true); } else { setSuggestions([]); if (debouncedQuery.length === 0) setOpen(false); } }, [debouncedQuery]); const handleSearch = () => { if (query.trim()) { router.push(`/search?q=${encodeURIComponent(query)}`); setOpen(false); } }; const getIcon = (type: string) => { switch (type) { case "correspondence": return ; case "rfa": return ; case "drawing": return ; default: return ; } }; return (
0} onOpenChange={setOpen}>
setQuery(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSearch()} onFocus={() => { if (suggestions.length > 0) setOpen(true); }} />
{suggestions.map((item) => ( { setQuery(item.title); router.push(`/${item.type}s/${item.id}`); setOpen(false); }} > {getIcon(item.type)} {item.title} ))}
); }