import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { ArrowLeft, Calendar, Users, BarChart3, CheckCircle } from 'lucide-react'; import LoadingSpinner from '../components/LoadingSpinner'; import Alert from '../components/Alert'; import './ElectionDetailsPage.css'; export default function ElectionDetailsPage({ voter = null, type = 'archives' }) { const { id } = useParams(); const navigate = useNavigate(); const [election, setElection] = useState(null); const [results, setResults] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [candidates, setCandidates] = useState([]); const [userVote, setUserVote] = useState(null); useEffect(() => { fetchElectionDetails(); }, [id]); 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/${id}`); if (!electionResponse.ok) { throw new Error('Élection non trouvée'); } const electionData = await electionResponse.json(); setElection(electionData); setCandidates(electionData.candidates || []); // 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/${id}`, { 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/${id}/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', }); }; const getElectionStatus = () => { if (!election) return ''; const now = new Date(); const start = new Date(election.start_date); const end = new Date(election.end_date); if (now < start) return 'À venir'; if (now > end) return 'Terminée'; return 'En cours'; }; if (loading) return ; if (error) { return (
); } if (!election) { return (
); } const status = getElectionStatus(); const statusColor = status === 'Terminée' ? 'closed' : status === 'En cours' ? 'active' : 'future'; return (

{election.name}

{status}
{/* Section Informations */}

📋 Informations

{election.description}

{formatDate(election.start_date)}

{formatDate(election.end_date)}

{/* Section Candidats */}

👥 Candidats ({candidates.length})

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

{candidate.name}

{candidate.description &&

{candidate.description}

}
))}
{/* Section Résultats */} {results && election.results_published && (

📊 Résultats

{results.results && results.results.length > 0 ? ( <>

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)
))}
) : (

Aucun résultat disponible

)}
)} {!election.results_published && status === 'Terminée' && (

📊 Les résultats de cette élection n'ont pas encore été publiés.

)} {status !== 'Terminée' && (

⏳ Les résultats seront disponibles une fois l'élection terminée.

)}
); }