From 3b47aa960592cbda0c14db201c48fb599d546e67 Mon Sep 17 00:00:00 2001 From: Admin Date: Sun, 12 Jul 2026 18:37:04 +0330 Subject: [PATCH] improvement: clinic/lab search button removed. search now happens on debounce. --- .../(dashboard)/organizations/page.tsx | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/frontend/src/app/[locale]/(dashboard)/organizations/page.tsx b/frontend/src/app/[locale]/(dashboard)/organizations/page.tsx index 65230c9..b61de88 100644 --- a/frontend/src/app/[locale]/(dashboard)/organizations/page.tsx +++ b/frontend/src/app/[locale]/(dashboard)/organizations/page.tsx @@ -48,6 +48,7 @@ export default function OrganizationsPage() { const { currentOrganization } = useAuth(); const [loading, setLoading] = useState(true); const toast = useToast(); + const { showError, setError: setToastError } = toast; const formatApiMessage = useCallback( (err: unknown): string => getUserFacingError(err, tErrors, tCommon('errorGeneric')), @@ -122,29 +123,44 @@ export default function OrganizationsPage() { void loadList(); }, []); - async function runSearch() { + useEffect(() => { + let cancelled = false; const q = query.trim(); + if (!q) { setMode('existing'); setSearchResults([]); setShowInviteForm(false); + setSearching(false); return; } - setSearching(true); - toast.setError(''); setMode('search'); setShowInviteForm(false); - try { - const res = await organizationApi.search(q); - setSearchResults(res.data); - } catch (e) { - toast.showError(formatApiMessage(e)); - setSearchResults([]); - } finally { - setSearching(false); - } - } + setSearching(true); + + const timeout = setTimeout(() => { + void (async () => { + setToastError(''); + try { + const res = await organizationApi.search(q); + if (cancelled) return; + setSearchResults(res.data); + } catch (e) { + if (cancelled) return; + showError(formatApiMessage(e)); + setSearchResults([]); + } finally { + if (!cancelled) setSearching(false); + } + })(); + }, 300); + + return () => { + cancelled = true; + clearTimeout(timeout); + }; + }, [query, formatApiMessage, showError, setToastError]); async function submitConnectionRequest(targetOrganizationId: string) { setPendingConnectionRowId(targetOrganizationId); @@ -315,33 +331,22 @@ export default function OrganizationsPage() { void runSearch()} placeholder={t('searchPlaceholder', { counterpart: counterpart.toLowerCase() })} actions={ - <> + query.trim() ? ( - {mode === 'search' && ( - - )} - + ) : undefined } /> - {loading ? ( + {loading || (mode === 'search' && searching) ? ( {tCommon('loadingEllipsis')}