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
{election.description}
{formatDate(election.start_date)}
{formatDate(election.end_date)}
{candidate.description}
}
Aucun résultat disponible
)}📊 Les résultats de cette élection n'ont pas encore été publiés.
⏳ Les résultats seront disponibles une fois l'élection terminée.