From 5c3731528f8868cc7711b6c6bb0b237e70b26eb8 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:11:21 +0000 Subject: [PATCH] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- .../quick-add/quick-add-call-log.tsx | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/components/quick-add/quick-add-call-log.tsx b/src/components/quick-add/quick-add-call-log.tsx index 66c5521..8eccc5b 100644 --- a/src/components/quick-add/quick-add-call-log.tsx +++ b/src/components/quick-add/quick-add-call-log.tsx @@ -63,25 +63,54 @@ export function QuickAddCallLog() { useEffect(() => { if (!open) return; (async () => { - const [{ data: cs }, { data: ks }, { data: ct }] = await Promise.all([ + const [{ data: cs }, { data: ks }] = await Promise.all([ supabase.from("clients").select("id, name").is("archived_at", null).order("name"), supabase .from("cases") .select("id, case_number, title, client_id") .is("archived_at", null) .order("case_number", { ascending: false }), - supabase - .from("contacts") - .select("id, name, phone") - .is("archived_at", null) - .order("name"), ]); setClients(cs ?? []); setCases((ks ?? []) as CaseOpt[]); - setContacts((ct ?? []) as ContactOpt[]); })(); }, [open]); + // Server-side contact search (debounced). No preloaded list — every keystroke queries the DB. + const [contactQuery, setContactQuery] = useState(""); + const [contactResults, setContactResults] = useState([]); + const [contactSearching, setContactSearching] = useState(false); + const [selectedContact, setSelectedContact] = useState(null); + const [contactPopoverOpen, setContactPopoverOpen] = useState(false); + + useEffect(() => { + if (!open) return; + const term = contactQuery.trim(); + setContactSearching(true); + let cancelled = false; + const handle = setTimeout(async () => { + let q = supabase + .from("contacts") + .select("id, name, phone") + .is("archived_at", null) + .order("name") + .limit(25); + if (term) { + const esc = term.replace(/[%,]/g, " "); + q = q.or(`name.ilike.%${esc}%,phone.ilike.%${esc}%,email.ilike.%${esc}%,company.ilike.%${esc}%`); + } + const { data } = await q; + if (!cancelled) { + setContactResults((data ?? []) as ContactOpt[]); + setContactSearching(false); + } + }, 200); + return () => { + cancelled = true; + clearTimeout(handle); + }; + }, [open, contactQuery]); + const filteredCases = useMemo( () => (clientId ? cases.filter((k) => k.client_id === clientId) : cases), [cases, clientId],