"use client"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Search, FileText, Clipboard, Image, Loader2 } from "lucide-react"; import { Input } from "@/components/ui/input"; import { Command, CommandGroup, CommandItem, CommandList, } from "@/components/ui/command"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { useSearchSuggestions } from "@/hooks/use-search"; 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 debouncedQuery = useDebounceValue(query, 300); const { data: suggestions, isLoading } = useSearchSuggestions(debouncedQuery); useEffect(() => { if (debouncedQuery.length > 2 && suggestions && suggestions.length > 0) { setOpen(true); } else { if (debouncedQuery.length === 0) setOpen(false); } }, [debouncedQuery, suggestions]); 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 (
setQuery(e.target.value)} onKeyDown={(e) => e.key === "Enter" && handleSearch()} onFocus={() => { if (suggestions && suggestions.length > 0) setOpen(true); }} /> {isLoading && ( )}
e.preventDefault()}> {suggestions && suggestions.length > 0 && ( {suggestions.map((item: any) => ( { setQuery(item.title); // Assumption: item has type and id. // If type is missing, we might need a map or check usage in backend response router.push(`/${item.type}s/${item.id}`); setOpen(false); }} > {getIcon(item.type)} {item.title} {item.documentNumber} ))} )} {(!suggestions || suggestions.length === 0) && !isLoading && (
No suggestions found.
)}
); }