"use client"; import { useState, useCallback, useRef } from "react"; const TYPE_STYLES: Record = { Function: { color: "var(--accent)", bg: "var(--accent-glow)" }, Class: { color: "var(--green)", bg: "var(--green-dim)" }, Method: { color: "var(--yellow)", bg: "var(--yellow-dim)" }, }; interface Props { onSelect: (uid: string) => void; } export function SearchBar({ onSelect }: Props) { const [query, setQuery] = useState(""); const [results, setResults] = useState([]); const [open, setOpen] = useState(false); const requestIdRef = useRef(0); const debounceRef = useRef>(); const search = useCallback((q: string) => { setQuery(q); if (q.length < 2) { setResults([]); setOpen(false); return; } clearTimeout(debounceRef.current); debounceRef.current = setTimeout(async () => { const id = ++requestIdRef.current; try { const res = await fetch(`/api/symbols?q=${encodeURIComponent(q)}&limit=10`); const data = await res.json(); if (id === requestIdRef.current) { setResults(data.results || []); setOpen(true); } } catch {} }, 200); }, []); return (
search(e.target.value)} onFocus={() => results.length > 0 && setOpen(true)} onBlur={() => setTimeout(() => setOpen(false), 200)} className="w-72 pl-9 pr-3 py-1.5 rounded-lg text-xs border outline-none focus:border-[var(--accent)]" style={{ background: "var(--bg)", borderColor: "var(--border)", color: "var(--text)", }} />
{open && results.length > 0 && (
{results.map((r, i) => { const style = TYPE_STYLES[r.node_type] || TYPE_STYLES.Function; return ( ); })}
)}
); }