diff --git a/apps/frontend/src/views/SearchView.jsx b/apps/frontend/src/views/SearchView.jsx index 5cea6c6..9aa5f63 100644 --- a/apps/frontend/src/views/SearchView.jsx +++ b/apps/frontend/src/views/SearchView.jsx @@ -76,7 +76,7 @@ function SearchView({ currentUser, onLoginRequest, initialQuery = '', onNavigate }, [currentUser]); useEffect(() => { - const searchMedicines = async () => { + const searchAll = async () => { if (searchQuery.trim().length < 2) { setMedicines([]); setProducts([]); @@ -85,27 +85,34 @@ function SearchView({ currentUser, onLoginRequest, initialQuery = '', onNavigate return; } setLoading(true); + const query = searchQuery.trim(); + try { - const response = await fetch(`/api/medicines/search?q=${encodeURIComponent(searchQuery)}`); - const data = await response.json(); - setMedicines(data); + // Run both searches in parallel for speed + const [medicinesRes, productsRes] = await Promise.allSettled([ + fetch(`/api/medicines/search?q=${encodeURIComponent(query)}`), + fetch(`/api/products/search?q=${encodeURIComponent(query)}`), + ]); + + // Only update if this search is still the current one + if (query !== searchQuery.trim()) return; + + if (medicinesRes.status === 'fulfilled' && medicinesRes.value.ok) { + const medicinesData = await medicinesRes.value.json(); + setMedicines(medicinesData); + } + + if (productsRes.status === 'fulfilled' && productsRes.value.ok) { + const productsData = await productsRes.value.json(); + setProducts(productsData.results || []); + } } catch (error) { - console.error('Error searching medicines:', error); + console.error('Search error:', error); } finally { setLoading(false); } - - try { - const productsResponse = await fetch(`/api/products/search?q=${encodeURIComponent(searchQuery)}`); - if (productsResponse.ok) { - const productsData = await productsResponse.json(); - setProducts(productsData.results || []); - } - } catch (err) { - console.error('Product search error:', err); - } }; - const timeoutId = setTimeout(searchMedicines, 300); + const timeoutId = setTimeout(searchAll, 300); return () => clearTimeout(timeoutId); }, [searchQuery]);