'use client'; import { useState, useCallback, useRef, useEffect } from 'react'; import { useRouter } from 'next/navigation'; const TYPE_ICONS: Record = { directive: '⚠️', bulletin: 'πŸ“’', component: 'πŸ”©', work_order: 'πŸ“', defect: 'πŸ› οΈ', specialist: 'πŸŽ“', aircraft: '✈️', }; export default function GlobalSearch() { const [query, setQuery] = useState(''); const [results, setResults] = useState([]); const [open, setOpen] = useState(false); const router = useRouter(); const ref = useRef(null); const timer = useRef(); const search = useCallback((q: string) => { if (q.length < 2) { setResults([]); return; } clearTimeout(timer.current); timer.current = setTimeout(async () => { try { const r = await fetch(`/api/v1/search/global?q=${encodeURIComponent(q)}`); const data = await r.json(); setResults(data.results || []); setOpen(true); } catch { setResults([]); } }, 300); }, []); useEffect(() => { const handler = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); }; document.addEventListener('mousedown', handler); return () => document.removeEventListener('mousedown', handler); }, []); return (
{ setQuery(e.target.value); search(e.target.value); }} onFocus={() => results.length > 0 && setOpen(true)} className="w-full px-3 py-2 text-sm rounded-lg bg-gray-100 border-0 focus:bg-white focus:ring-2 focus:ring-blue-500 transition-all" /> {open && results.length > 0 && (
{results.map((r, i) => ( ))}
)}
); }