import { useEffect, useState } from 'react'; import SearchBar from '../components/SearchBar'; import ListingCard from '../components/ListingCard'; import { publicService } from '../services/publicService'; import type { Listing, Category } from '../types'; import { Filter, X } from 'lucide-react'; import { processCategoriesForSelect, type FlatCategory } from '../utils/categoryTreeUtils'; export default function HomePage() { const [listings, setListings] = useState([]); // Usamos FlatCategory para el renderizado const [flatCategories, setFlatCategories] = useState([]); const [rawCategories, setRawCategories] = useState([]); // Guardamos raw para los botones del home const [loading, setLoading] = useState(true); // Estado de Búsqueda const [searchText, setSearchText] = useState(''); const [selectedCatId, setSelectedCatId] = useState(null); const [dynamicFilters, setDynamicFilters] = useState>({}); useEffect(() => { loadInitialData(); }, []); const loadInitialData = async () => { setLoading(true); try { const [latestListings, cats] = await Promise.all([ publicService.getLatestListings(), publicService.getCategories() ]); setListings(latestListings); setRawCategories(cats); // Procesamos el árbol para el select const processed = processCategoriesForSelect(cats); setFlatCategories(processed); } catch (e) { console.error(e); } finally { setLoading(false); } }; const performSearch = async () => { setLoading(true); try { const response = await import('../services/api').then(m => m.default.post('/listings/search', { query: searchText, categoryId: selectedCatId, filters: dynamicFilters })); setListings(response.data); } catch (e) { console.error(e); } finally { setLoading(false); } }; useEffect(() => { if (searchText || selectedCatId || Object.keys(dynamicFilters).length > 0) { performSearch(); } }, [selectedCatId, dynamicFilters]); const handleSearchText = (q: string) => { setSearchText(q); performSearch(); }; const clearFilters = () => { setDynamicFilters({}); setSelectedCatId(null); setSearchText(''); publicService.getLatestListings().then(setListings); // Reset list } // Para los botones del Home, solo mostramos los Raíz const rootCategories = rawCategories.filter(c => !c.parentId); return (
{/* Hero */}

Encuentra tu próximo objetivo

{/* SIDEBAR DE FILTROS */}

Filtros

{(selectedCatId || Object.keys(dynamicFilters).length > 0) && ( )}
{/* Filtro Categoría (MEJORADO) */}
{/* Filtros Dinámicos */} {selectedCatId && (

Atributos

setDynamicFilters({ ...dynamicFilters, 'Kilometraje': e.target.value })} />
)}
{/* LISTADO */}

{loading ? 'Cargando...' : selectedCatId ? `${listings.length} Resultados en ${flatCategories.find(c => c.id === selectedCatId)?.name}` : 'Resultados Recientes'}

{!loading && listings.length === 0 && (
No se encontraron avisos con esos criterios.
)}
{listings.map(listing => ( ))}
); }