import { useCallback, useEffect, useRef, useState } from 'react' import { searchPages, type SearchResult } from '../lib/api.ts' interface Props { onSelectResult?: (result: SearchResult) => void } export default function SearchBar({ onSelectResult }: Props) { const [query, setQuery] = useState('') const [results, setResults] = useState([]) const [open, setOpen] = useState(false) const [loading, setLoading] = useState(false) const debounceRef = useRef | null>(null) const containerRef = useRef(null) const runSearch = useCallback(async (q: string) => { if (q.trim().length < 2) { setResults([]) setOpen(false) return } setLoading(true) try { const res = await searchPages(q.trim()) setResults(res) setOpen(true) } catch { setResults([]) } finally { setLoading(false) } }, []) useEffect(() => { if (debounceRef.current) clearTimeout(debounceRef.current) debounceRef.current = setTimeout(() => { void runSearch(query) }, 300) return () => { if (debounceRef.current) clearTimeout(debounceRef.current) } }, [query, runSearch]) useEffect(() => { const handler = (e: MouseEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setOpen(false) } } document.addEventListener('mousedown', handler) return () => document.removeEventListener('mousedown', handler) }, []) return (
setQuery(e.target.value)} onFocus={() => results.length > 0 && setOpen(true)} placeholder="Rechercher..." className=" w-full px-2 py-[2px] text-retro-sm font-retro bg-retro-white text-retro-black border border-retro-black shadow-retro-well placeholder:text-retro-darkgray " /> {loading && ( ... )}
{open && (
{results.length === 0 ? (
Aucun resultat.
) : (
    {results.map((r) => (
  • ))}
)}
)}
) }