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 (
{election.description}
{formatDate(election.start_date)}
{formatDate(election.end_date)}
{candidate.description}
}