'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'; /** Search suggestion item returned from the API */ interface SearchSuggestion { uuid: string; id?: string | number; // Excluded from API responses (ADR-019) type: string; title: string; documentNumber?: string; } 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 as SearchSuggestion[]).map((item) => ( { setQuery(item.title); // ADR-019: Use UUID for public routes router.push(`/${item.type}s/${item.uuid}`); setOpen(false); }} > {getIcon(item.type)} {item.title} {item.documentNumber} ))} )} {(!suggestions || suggestions.length === 0) && !isLoading && (
No suggestions found.
)}
); }