import React, { useState, useEffect } from 'react'; import { X, Users, BarChart3, CheckCircle } from 'lucide-react'; import './ElectionDetailsModal.css'; export default function ElectionDetailsModal({ electionId, isOpen, onClose, voter = null, type = 'historique' }) { const [election, setElection] = useState(null); const [results, setResults] = useState(null); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [userVote, setUserVote] = useState(null); useEffect(() => { if (isOpen && electionId) { fetchElectionDetails(); } }, [isOpen, electionId]); const fetchElectionDetails = async () => { try { setLoading(true); setError(''); // Récupérer les détails de l'élection const electionResponse = await fetch(`http://localhost:8000/api/elections/${electionId}`); if (!electionResponse.ok) { throw new Error('Élection non trouvée'); } const electionData = await electionResponse.json(); setElection(electionData); // Récupérer le vote de l'utilisateur si connecté et type = historique if (voter && type === 'historique') { try { const token = localStorage.getItem('token'); const userVoteResponse = await fetch(`http://localhost:8000/api/votes/election/${electionId}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (userVoteResponse.ok) { const userVoteData = await userVoteResponse.json(); setUserVote(userVoteData); } } catch (err) { console.warn('Impossible de récupérer le vote utilisateur'); } } // Récupérer les résultats si l'élection est terminée if (electionData.results_published) { try { const resultsResponse = await fetch(`http://localhost:8000/api/elections/${electionId}/results`); if (resultsResponse.ok) { const resultsData = await resultsResponse.json(); setResults(resultsData); } } catch (err) { console.warn('Résultats non disponibles'); } } } catch (err) { setError(err.message || 'Erreur de chargement'); console.error('Erreur:', err); } finally { setLoading(false); } }; const formatDate = (dateString) => { const date = new Date(dateString); return date.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; if (!isOpen) return null; return (
e.stopPropagation()}>

{election?.name || 'Détails de l\'élection'}

{loading &&
Chargement...
} {error &&
{error}
} {election && !loading && (

📋 Informations

{election.description}

{formatDate(election.start_date)}

{formatDate(election.end_date)}

👥 Candidats ({election.candidates?.length || 0})

{election.candidates?.map((candidate, index) => (
{candidate.order || index + 1}

{candidate.name}

{candidate.description &&

{candidate.description}

}
))}
{results && election.results_published && (

📊 Résultats

Total: {results.total_votes} vote(s)

{results.results?.map((result, index) => (
{userVote && userVote.candidate_name === result.candidate_name && ( )} {result.candidate_name} {result.percentage.toFixed(1)}%
{result.vote_count} vote(s)
))}
)}
)}
); }