'use client'; import { useEffect, useState } from 'react'; import { SearchBar } from '@/components/SearchBar'; import Dropdown from '@/components/Dropdown'; import SalarieCard from '@/components/SalarieCard'; import { Salarie } from '@/types/Salarie'; import { fetchSalaries, fetchSites, fetchServices, fetchSalariesBySite, fetchSalariesByService } from '@/utils/api'; import { Site } from '@/types/Site'; import { Service } from '@/types/Service'; const Home = () => { // states pour stocker les services, les sites et les salariés const [sites, setSites] = useState([]); const [services, setServices] = useState([]); const [filteredSalaries, setFilteredSalaries] = useState([]); // states gérer la pagination const [currentPage, setCurrentPage] = useState(1); const [pageSize, setPageSize] = useState(25); const [totalPages, setTotalPages] = useState(1); const [totalCount, setTotalCount] = useState(0); // states pour le chargement et les erreurs const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(null); // states pour la recherche const [searchTerm, setSearchTerm] = useState(''); // states pour les filtres actifs const [activeFilters, setActiveFilters] = useState({ site: '', service: '' }); // set des sites et services uniquement au premier chargement useEffect(() => { async function fetchInitialData() { setIsLoading(true); setError(null); try { const [sitesResponse, servicesResponse] = await Promise.all([ fetchSites(), fetchServices(), ]); setSites(sitesResponse.data); setServices(servicesResponse.data); } catch (error) { console.error('Erreur lors du chargement des sites et services:', error); setError('Erreur lors du chargement des sites et services. Veuillez réessayer.'); } finally { setIsLoading(false); } } fetchInitialData(); }, []); // chargement des salariés avec pagination et recherche useEffect(() => { async function fetchSalariesData() { setIsLoading(true); setError(null); try { const salariesResponse = await fetchSalaries(currentPage, pageSize, searchTerm); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } catch (error) { console.error('Erreur lors du chargement des salariés:', error); setError('Erreur lors du chargement des salariés. Veuillez réessayer.'); } finally { setIsLoading(false); } } // récupération des salariés si aucun filtre n'est actif if (!activeFilters.site && !activeFilters.service) { fetchSalariesData(); } }, [currentPage, pageSize, searchTerm, activeFilters.site, activeFilters.service]); const handleSearch = (query: string) => { setSearchTerm(query); setCurrentPage(1); // retour à la page 1 pour une d'une nouvelle recherche // réinitialisation des filtres actifs setActiveFilters({ site: '', service: '' }); }; const handleSiteFilter = async (siteId: number | '') => { setCurrentPage(1); setIsLoading(true); setError(null); setActiveFilters(prev => ({ ...prev, site: siteId ? String(siteId) : '' })); try { if (siteId) { const salariesResponse = await fetchSalariesBySite(siteId, 1, pageSize); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } else if (activeFilters.service) { // si un service est sélectionné, garder ce filtre const serviceId = Number(activeFilters.service); const salariesResponse = await fetchSalariesByService(serviceId, 1, pageSize); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } else { // aucun filtre actif, retourner aux données de base const salariesResponse = await fetchSalaries(1, pageSize, searchTerm); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } } catch (error) { console.error('Erreur lors du filtrage par site:', error); setError('Erreur lors du filtrage par site. Veuillez réessayer.'); } finally { setIsLoading(false); } }; // filtre qui se fait uniquement si il n'y a que celui qui est demandé const handleServiceFilter = async (serviceId: number | '') => { setCurrentPage(1); setIsLoading(true); setError(null); setActiveFilters(prev => ({ ...prev, service: serviceId ? String(serviceId) : '' })); try { if (serviceId) { const salariesResponse = await fetchSalariesByService(serviceId, 1, pageSize); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } else if (activeFilters.site) { const siteId = Number(activeFilters.site); const salariesResponse = await fetchSalariesBySite(siteId, 1, pageSize); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } else { const salariesResponse = await fetchSalaries(1, pageSize, searchTerm); setFilteredSalaries(salariesResponse.data); setTotalPages(salariesResponse.totalPages); setTotalCount(salariesResponse.totalCount); } } catch (error) { console.error('Erreur lors du filtrage par service:', error); setError('Erreur lors du filtrage par service. Veuillez réessayer.'); } finally { setIsLoading(false); } }; return (
{/* searchbar */}
{/* dropdown des sites et des services */}
({ id: site.id, nom: site.ville }))} onSelect={(id) => handleSiteFilter(id as number)} label="Filtrer par Site" /> ({ id: service.id, nom: service.nom }))} onSelect={(id) => handleServiceFilter(id as number)} label="Filtrer par Service" />
{/* afficahage des infos */}

{totalCount > 0 ? ( <> {totalCount} {totalCount > 1 ? 'salariés trouvés' : 'salarié trouvé'} {activeFilters.site && sites.length > 0 && ( <> à {sites.find(s => s.id === Number(activeFilters.site))?.ville} )} {activeFilters.service && services.length > 0 && ( <> dans {services.find(s => s.id === Number(activeFilters.service))?.nom} )} ) : !isLoading ? ( 'Aucun salarié trouvé' ) : ( 'Chargement des résultats...' )}

{/* information des filtres actifs avec possibilité de les supprimer */} {(activeFilters.site || activeFilters.service || searchTerm) && (
{searchTerm && ( Recherche: {searchTerm} )} {activeFilters.site && sites.length > 0 && ( Site: {sites.find(s => s.id === Number(activeFilters.site))?.ville} )} {activeFilters.service && services.length > 0 && ( Service: {services.find(s => s.id === Number(activeFilters.service))?.nom} )}
)}
{/* affichage des erreurs */} {error && (
{error}
)} {/* affichage du chargement */} {isLoading ? (
) : ( <> {/* grille qui contient les salariés */} {filteredSalaries.length > 0 ? (
{filteredSalaries.map((salarie, index) => (
))}
) : (

Aucun salarié trouvé

Essayez de modifier vos critères de recherche ou de filtrage.

)} {/* pagination */} {filteredSalaries.length > 0 && (
{/* choix du nombre d'éléments pas page */}
{/* navigation de pagination */}
Page {currentPage} sur {totalPages}
{/* compteur du nombre résultats renvoyés */}
{totalCount} résultats
)} )}
); }; export default Home;