diff --git a/components/layout/quick-search.tsx b/components/layout/quick-search.tsx index 411bb3b..be2ff20 100644 --- a/components/layout/quick-search.tsx +++ b/components/layout/quick-search.tsx @@ -103,24 +103,39 @@ export function QuickSearch() { useEffect(() => { if (!open || query.length < 2) { setResults([]); + setLoading(false); return; } setLoading(true); + setResults([]); + let cancelled = false; const timer = setTimeout(async () => { try { const res = await fetch(`/api/search?q=${encodeURIComponent(query)}`); - const data = await res.json(); - setResults(data.results || []); + if (!res.ok) { + throw new Error(`Search request failed with status ${res.status}`); + } + const data = (await res.json()) as { results?: SearchResult[] }; + if (!cancelled) { + setResults(Array.isArray(data.results) ? data.results : []); + } } catch (err) { console.error("Search error:", err); - setResults([]); + if (!cancelled) { + setResults([]); + } } finally { - setLoading(false); + if (!cancelled) { + setLoading(false); + } } }, 150); // 150ms debounce - return () => clearTimeout(timer); + return () => { + cancelled = true; + clearTimeout(timer); + }; }, [query, open]); // Keyboard shortcut @@ -202,6 +217,8 @@ export function QuickSearch() { {typeResults.slice(0, 5).map((result) => ( handleResultSelect(result)} > {result.type === "task" ? (