'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useRef, useEffect } from 'react'; import { DataView } from 'primereact/dataview'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { Rating } from 'primereact/rating'; import { InputText } from 'primereact/inputtext'; import { Dropdown } from 'primereact/dropdown'; import { MultiSelect } from 'primereact/multiselect'; import { Slider } from 'primereact/slider'; import { Toast } from 'primereact/toast'; import { Badge } from 'primereact/badge'; import { Avatar } from 'primereact/avatar'; import { Chip } from 'primereact/chip'; import { Divider } from 'primereact/divider'; interface EntrepriseProfile { id: string; nomCommercial: string; description: string; slogan?: string; logoUrl?: string; secteurActivite: string; specialites: string[]; certifications: string[]; ville: string; departement: string; region: string; noteGlobale: number; nombreAvis: number; nombreProjetsRealises: number; nombreClientsServis: number; certifie: boolean; typeAbonnement: 'GRATUIT' | 'PREMIUM' | 'ENTERPRISE'; zonesIntervention: string[]; siteWeb?: string; emailContact: string; telephoneCommercial?: string; photosRealisations?: string[]; budgetMinProjet?: number; budgetMaxProjet?: number; delaiMoyenIntervention?: number; derniereActivite: string; } const AnnuaireProfessionnel = () => { const [entreprises, setEntreprises] = useState([]); const [filteredEntreprises, setFilteredEntreprises] = useState([]); const [loading, setLoading] = useState(false); const [globalFilter, setGlobalFilter] = useState(''); // Filtres const [regionFilter, setRegionFilter] = useState(''); const [secteurFilter, setSecteurFilter] = useState(''); const [specialitesFilter, setSpecialitesFilter] = useState([]); const [noteMinFilter, setNoteMinFilter] = useState(0); const [certifiesUniquement, setCertifiesUniquement] = useState(false); const [budgetRange, setBudgetRange] = useState<[number, number]>([0, 1000000]); const [layout, setLayout] = useState<'grid' | 'list'>('grid'); const [first, setFirst] = useState(0); const [rows, setRows] = useState(12); const toast = useRef(null); const regions = [ { label: 'Toutes les régions', value: '' }, { label: 'Île-de-France', value: 'IDF' }, { label: 'Auvergne-Rhône-Alpes', value: 'ARA' }, { label: 'Nouvelle-Aquitaine', value: 'NA' }, { label: 'Occitanie', value: 'OCC' }, { label: 'Hauts-de-France', value: 'HDF' }, { label: 'Grand Est', value: 'GE' }, { label: 'Provence-Alpes-Côte d\'Azur', value: 'PACA' }, { label: 'Pays de la Loire', value: 'PDL' }, { label: 'Bretagne', value: 'BRE' }, { label: 'Normandie', value: 'NOR' } ]; const secteurs = [ { label: 'Tous secteurs', value: '' }, { label: 'Gros œuvre', value: 'GROS_OEUVRE' }, { label: 'Second œuvre', value: 'SECOND_OEUVRE' }, { label: 'Génie civil', value: 'GENIE_CIVIL' }, { label: 'Rénovation', value: 'RENOVATION' }, { label: 'Aménagement', value: 'AMENAGEMENT' } ]; const specialitesDisponibles = [ { label: 'Maçonnerie', value: 'MACONNERIE' }, { label: 'Charpenterie', value: 'CHARPENTERIE' }, { label: 'Couverture', value: 'COUVERTURE' }, { label: 'Plomberie', value: 'PLOMBERIE' }, { label: 'Électricité', value: 'ELECTRICITE' }, { label: 'Carrelage', value: 'CARRELAGE' }, { label: 'Peinture', value: 'PEINTURE' }, { label: 'Menuiserie', value: 'MENUISERIE' }, { label: 'Terrassement', value: 'TERRASSEMENT' }, { label: 'Étanchéité', value: 'ETANCHEITE' } ]; useEffect(() => { loadEntreprises(); }, []); useEffect(() => { applyFilters(); }, [entreprises, globalFilter, regionFilter, secteurFilter, specialitesFilter, noteMinFilter, certifiesUniquement, budgetRange]); const loadEntreprises = async () => { setLoading(true); try { // TODO: Remplacer par un appel API réel // const data = await annuaireService.getEntreprises(); // Afficher une liste vide plutôt que des données fictives const data: EntrepriseProfile[] = []; setEntreprises(data); } catch (error) { toast.current?.show({ severity: 'error', summary: 'Erreur', detail: 'Impossible de charger l\'annuaire', life: 3000 }); } finally { setLoading(false); } }; const applyFilters = () => { let filtered = [...entreprises]; // Filtre global (recherche textuelle) if (globalFilter) { filtered = filtered.filter(entreprise => entreprise.nomCommercial.toLowerCase().includes(globalFilter.toLowerCase()) || entreprise.description.toLowerCase().includes(globalFilter.toLowerCase()) || entreprise.ville.toLowerCase().includes(globalFilter.toLowerCase()) || entreprise.specialites.some(s => s.toLowerCase().includes(globalFilter.toLowerCase())) ); } // Filtre par région if (regionFilter) { filtered = filtered.filter(entreprise => entreprise.region === regionFilter); } // Filtre par secteur if (secteurFilter) { filtered = filtered.filter(entreprise => entreprise.secteurActivite === secteurFilter); } // Filtre par spécialités if (specialitesFilter.length > 0) { filtered = filtered.filter(entreprise => specialitesFilter.some(spec => entreprise.specialites.includes(spec)) ); } // Filtre par note minimale if (noteMinFilter > 0) { filtered = filtered.filter(entreprise => entreprise.noteGlobale >= noteMinFilter); } // Filtre certifiés uniquement if (certifiesUniquement) { filtered = filtered.filter(entreprise => entreprise.certifie); } // Filtre par budget if (budgetRange[0] > 0 || budgetRange[1] < 1000000) { filtered = filtered.filter(entreprise => entreprise.budgetMinProjet && entreprise.budgetMaxProjet && entreprise.budgetMaxProjet >= budgetRange[0] && entreprise.budgetMinProjet <= budgetRange[1] ); } setFilteredEntreprises(filtered); setFirst(0); // Reset pagination }; const getAbonnementSeverity = (type: string) => { switch (type) { case 'ENTERPRISE': return 'info'; case 'PREMIUM': return 'warning'; default: return 'info'; } }; const getAbonnementLabel = (type: string) => { switch (type) { case 'ENTERPRISE': return 'Enterprise'; case 'PREMIUM': return 'Premium'; default: return 'Standard'; } }; const contacterEntreprise = (entreprise: EntrepriseProfile) => { // Logique de contact à implémenter toast.current?.show({ severity: 'info', summary: 'Contact', detail: `Contactez ${entreprise.nomCommercial} via ${entreprise.emailContact}`, life: 3000 }); }; const voirProfil = (entreprise: EntrepriseProfile) => { // Navigation vers le profil détaillé console.log('Voir profil:', entreprise); }; const itemTemplate = (entreprise: EntrepriseProfile) => { if (layout === 'list') { return (
{entreprise.nomCommercial} {entreprise.certifie && ( )}
({entreprise.nombreAvis} avis)
s.value === entreprise.secteurActivite)?.label || entreprise.secteurActivite} severity="info" />
{entreprise.ville}
{entreprise.specialites.slice(0, 3).map((spec, index) => ( ))} {entreprise.specialites.length > 3 && ( )}

{entreprise.description}

); } return (
{entreprise.nomCommercial}
({entreprise.nombreAvis})
{entreprise.certifie && ( )}
{entreprise.ville}
s.value === entreprise.secteurActivite)?.label || entreprise.secteurActivite} severity="info" className="mb-2" />
{entreprise.specialites.slice(0, 2).map((spec, index) => ( ))} {entreprise.specialites.length > 2 && ( )}

{entreprise.description.substring(0, 120)}...

{entreprise.nombreProjetsRealises} projets réalisés
{entreprise.nombreClientsServis} clients servis
); }; const header = () => { return (
setGlobalFilter(e.target.value)} placeholder="Rechercher une entreprise..." className="w-full" />
); }; return (

Annuaire Professionnel BTP

Découvrez notre réseau d'entreprises BTP certifiées et trouvez le partenaire idéal pour vos projets.

{/* Filtres */}
setRegionFilter(e.value)} placeholder="Toutes les régions" className="w-full" />
setSecteurFilter(e.value)} placeholder="Tous secteurs" className="w-full" />
setSpecialitesFilter(e.value)} placeholder="Sélectionner spécialités" maxSelectedLabels={2} className="w-full" />
setNoteMinFilter(e.value as number)} min={0} max={5} step={0.5} className="w-full" />
setCertifiesUniquement(e.target.checked)} />
setBudgetRange(e.value as [number, number])} range min={0} max={1000000} step={10000} className="w-full" />
setFirst(e.first)} paginatorTemplate="FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink RowsPerPageDropdown" rowsPerPageOptions={[12, 24, 48]} loading={loading} emptyMessage="Aucune entreprise ne correspond à vos critères." paginatorLeft={ {filteredEntreprises.length} entreprise{filteredEntreprises.length !== 1 ? 's' : ''} trouvée{filteredEntreprises.length !== 1 ? 's' : ''} } />
); }; export default AnnuaireProfessionnel;