"use client"; import React, { useState, useEffect, useMemo, Suspense } from 'react'; import { useSearchParams } from 'next/navigation'; import { Search, Loader2 } from 'lucide-react'; import { CATEGORIES, Business } from '../../types'; import BusinessCard from '../../components/BusinessCard'; import AnnuaireHero from '../../components/AnnuaireHero'; const AnnuairePageContent = () => { const [businesses, setBusinesses] = useState([]); const [featuredBusiness, setFeaturedBusiness] = useState(null); const [loading, setLoading] = useState(true); const [filterCategory, setFilterCategory] = useState('All'); const [searchQuery, setSearchQuery] = useState(''); const searchParams = useSearchParams(); // 1. Fetch Featured Headliner once useEffect(() => { const fetchHeadliner = async () => { try { const res = await fetch('/api/businesses?featured=true'); const data = await res.json(); if (Array.isArray(data) && data.length > 0) { setFeaturedBusiness(data[0]); } } catch (error) { console.error('Error fetching headliner:', error); } }; fetchHeadliner(); }, []); // 2. Fetch businesses from API useEffect(() => { const fetchBusinesses = async () => { setLoading(true); try { const params = new URLSearchParams(); if (filterCategory !== 'All') params.append('category', filterCategory); if (searchQuery) params.append('q', searchQuery); const res = await fetch(`/api/businesses?${params.toString()}`); const data = await res.json(); if (Array.isArray(data)) { setBusinesses(data); } } catch (error) { console.error('Error fetching businesses:', error); } finally { setLoading(false); } }; const timeoutId = setTimeout(fetchBusinesses, 300); // Debounce return () => clearTimeout(timeoutId); }, [filterCategory, searchQuery]); useEffect(() => { const q = searchParams.get('q'); if (q) setSearchQuery(q); }, [searchParams]); const filteredBusinesses = businesses; return (
{/* Tête d'affiche (Headliner) - Always visible regardless of filters */} {featuredBusiness && }
{/* Filters Sidebar */}

Filtres

setSearchQuery(e.target.value)} className="w-full border-gray-300 rounded-md shadow-sm focus:ring-brand-500 focus:border-brand-500 sm:text-sm p-2 border" placeholder="Nom, mot-clé..." />
setFilterCategory('All')} className="focus:ring-brand-500 h-4 w-4 text-brand-600 border-gray-300" />
{CATEGORIES.map(cat => (
setFilterCategory(cat)} className="focus:ring-brand-500 h-4 w-4 text-brand-600 border-gray-300" />
))}
{/* Results Grid */}

Annuaire des entreprises

{filteredBusinesses.length} résultats
{loading ? (

Chargement des entreprises...

) : filteredBusinesses.length > 0 ? (
{filteredBusinesses.map(biz => ( ))}
) : (

Aucun résultat

Essayez d'ajuster vos filtres de recherche.

)}
); }; const AnnuairePage = () => { return ( Chargement...}> ); }; export default AnnuairePage;