From 9e786f2966a6109dfa9170f28b332e64fc6e97a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoni=20Nu=C3=B1ez=20Romeu?= Date: Mon, 13 Jul 2026 15:27:47 +0200 Subject: [PATCH] feat(frontend): integrate product search into PublicView with filter tabs --- apps/frontend/src/views/PublicView.jsx | 63 +++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/apps/frontend/src/views/PublicView.jsx b/apps/frontend/src/views/PublicView.jsx index aa383c9..22dd84c 100644 --- a/apps/frontend/src/views/PublicView.jsx +++ b/apps/frontend/src/views/PublicView.jsx @@ -2,6 +2,7 @@ import React, { useState, useEffect, useMemo } from 'react'; import '../App.css'; import SearchBar from '../components/SearchBar'; import MedicineResults from '../components/MedicineResults'; +import ProductResults from '../components/ProductResults'; import PharmacyList from '../components/PharmacyList'; import PharmacyMap from '../components/PharmacyMap'; import HomeView from './HomeView'; @@ -22,6 +23,8 @@ function PublicView({ const [searchQuery, setSearchQuery] = useState(''); const [medicines, setMedicines] = useState([]); + const [products, setProducts] = useState([]); + const [searchMode, setSearchMode] = useState('all'); // 'all' | 'medicines' | 'products' const [selectedMedicine, setSelectedMedicine] = useState(null); const [pharmacies, setPharmacies] = useState([]); const [loading, setLoading] = useState(false); @@ -35,6 +38,7 @@ function PublicView({ const searchMedicines = async () => { if (searchQuery.trim().length < 2) { setMedicines([]); + setProducts([]); setSelectedMedicine(null); setPharmacies([]); return; @@ -50,6 +54,16 @@ function PublicView({ } 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); @@ -219,7 +233,42 @@ function PublicView({ {loading &&
Buscando...
} - {searchQuery && !selectedMedicine && ( + {searchQuery && ( +
+ + + +
+ )} + + {searchQuery && !selectedMedicine && (searchMode === 'all' || searchMode === 'medicines') && ( )} + {(searchMode === 'all' || searchMode === 'products') && products.length > 0 && ( +
+

Parafarmacia y Bebé

+ { + window.location.href = `/product/${product.source}/${product.id}`; + }} + /> +
+ )} + {selectedMedicine && (