'use client'; import { useState, useEffect } from 'react'; import { useParams } from 'next/navigation'; import { Campaign, Proposition, Participant, Vote } from '@/types'; import { campaignService, propositionService, participantService, voteService } from '@/lib/services'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { BarChart3 } from 'lucide-react'; import { StatsDisplay } from '@/components/StatsDisplay'; import { useStatsCalculation } from '@/hooks/useStatsCalculation'; import Footer from '@/components/Footer'; import VersionDisplay from '@/components/VersionDisplay'; export const dynamic = 'force-dynamic'; function PublicStatsPageContent() { const params = useParams(); const campaignId = params.id as string; const [campaign, setCampaign] = useState(null); const [participants, setParticipants] = useState([]); const [propositions, setPropositions] = useState([]); const [votes, setVotes] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const { propositionStats } = useStatsCalculation(campaign, participants, propositions, votes); useEffect(() => { // Vérifier la configuration Supabase const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL; const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY; // Si pas de configuration ou valeurs par défaut, rediriger vers setup if (!supabaseUrl || !supabaseAnonKey || supabaseUrl === 'https://placeholder.supabase.co' || supabaseAnonKey === 'your-anon-key') { console.log('🔧 Configuration Supabase manquante, redirection vers /setup'); window.location.href = '/setup'; return; } if (campaignId) { loadData(); } }, [campaignId]); const loadData = async () => { try { setLoading(true); setError(null); const [campaignData, participantsData, propositionsData, votesData] = await Promise.all([ campaignService.getById(campaignId), participantService.getByCampaign(campaignId), propositionService.getByCampaign(campaignId), voteService.getByCampaign(campaignId) ]); if (!campaignData) { throw new Error('Campagne non trouvée'); } // Vérifier que la campagne est en cours de vote ou terminée pour permettre l'accès public if (campaignData.status !== 'voting' && campaignData.status !== 'closed') { throw new Error('Les statistiques ne sont pas encore disponibles pour cette campagne'); } setCampaign(campaignData); setParticipants(participantsData); setPropositions(propositionsData); setVotes(votesData); } catch (error) { console.error('Erreur lors du chargement des données:', error); setError(error instanceof Error ? error.message : 'Une erreur est survenue'); } finally { setLoading(false); } }; if (loading) { return (

Chargement des statistiques...

); } if (error || !campaign) { return (

{error || 'Campagne introuvable'}

{error === 'Campagne non trouvée' ? 'La campagne que vous recherchez n\'existe pas ou a été supprimée.' : error === 'Les statistiques ne sont pas encore disponibles pour cette campagne' ? 'Cette campagne n\'a pas encore commencé ou les statistiques ne sont pas encore disponibles.' : 'Une erreur est survenue lors du chargement des données.'}

); } return (
{/* Header */}
{campaign.status === 'voting' ? 'En cours de vote' : 'Terminée'}

Statistiques publiques

{campaign.title}

{campaign.description}

{/* Stats Display */} {/* Footer */}
{/* Version Display */}
); } export default function PublicStatsPage() { return ; }