'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { Campaign, CampaignWithStats } from '@/types'; import { campaignService } from '@/lib/services'; import { authService } from '@/lib/auth'; import CreateCampaignModal from '@/components/CreateCampaignModal'; import EditCampaignModal from '@/components/EditCampaignModal'; import DeleteCampaignModal from '@/components/DeleteCampaignModal'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import AuthGuard from '@/components/AuthGuard'; import { FolderOpen, Users, FileText, Plus, BarChart3, Settings, Check, Copy } from 'lucide-react'; import StatusSwitch from '@/components/StatusSwitch'; export const dynamic = 'force-dynamic'; function AdminPageContent() { const [campaigns, setCampaigns] = useState([]); const [loading, setLoading] = useState(true); const [showCreateModal, setShowCreateModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [selectedCampaign, setSelectedCampaign] = useState(null); const [copiedCampaignId, setCopiedCampaignId] = useState(null); useEffect(() => { loadCampaigns(); }, []); const loadCampaigns = async () => { try { setLoading(true); const campaignsData = await campaignService.getAll(); const campaignsWithStats = await Promise.all( campaignsData.map(async (campaign) => { const stats = await campaignService.getStats(campaign.id); return { ...campaign, stats }; }) ); setCampaigns(campaignsWithStats); } catch (error) { console.error('Erreur lors du chargement des campagnes:', error); } finally { setLoading(false); } }; const handleCampaignCreated = () => { setShowCreateModal(false); loadCampaigns(); }; const handleCampaignEdited = () => { setShowEditModal(false); loadCampaigns(); }; const handleCampaignDeleted = () => { setShowDeleteModal(false); loadCampaigns(); }; const handleStatusChange = async (campaignId: string, newStatus: 'deposit' | 'voting' | 'closed') => { try { await campaignService.update(campaignId, { status: newStatus }); // Mettre à jour l'état local sans recharger toute la page setCampaigns(prevCampaigns => prevCampaigns.map(campaign => campaign.id === campaignId ? { ...campaign, status: newStatus } : campaign ) ); } catch (error) { console.error('Erreur lors du changement de statut:', error); throw error; // Propager l'erreur pour que le composant puisse la gérer } }; const getStatusBadge = (status: string) => { switch (status) { case 'deposit': return Dépôt de propositions; case 'voting': return En cours de vote; case 'closed': return Terminée; default: return {status}; } }; const copyToClipboard = async (text: string, campaignId: string) => { try { await navigator.clipboard.writeText(text); setCopiedCampaignId(campaignId); setTimeout(() => setCopiedCampaignId(null), 2000); } catch (error) { console.error('Erreur lors de la copie:', error); // Fallback pour les navigateurs qui ne supportent pas l'API Clipboard const textArea = document.createElement('textarea'); textArea.value = text; document.body.appendChild(textArea); textArea.select(); try { document.execCommand('copy'); setCopiedCampaignId(campaignId); setTimeout(() => setCopiedCampaignId(null), 2000); } catch (fallbackError) { console.error('Erreur avec la méthode de fallback:', fallbackError); } document.body.removeChild(textArea); } }; if (loading) { return (

Chargement des campagnes...

); } return (
{/* Header */}

Mes Budgets Participatifs

Administration

Gérez vos campagnes de budget participatif, suivez les votes et analysez les résultats

{/* Campaigns List */} {campaigns.length === 0 ? (

Aucune campagne

Créez votre première campagne de budget participatif pour commencer à collecter les idées de votre communauté

) : (
{campaigns.map((campaign) => (
{campaign.title}
{campaign.description} {/* Status Switch */}
handleStatusChange(campaign.id, newStatus)} />
{/* Stats avec icônes modernes et boutons intégrés */}

Cliquez sur les éléments pour les gérer

{campaign.budget_per_user}€
Budget
{/* Boutons discrets en haut à droite */}
{/* Section actions - même espace pour lien public et statistiques */}
{/* Lien public OU Bouton Statistiques */} {campaign.status === 'deposit' ? ( /* Lien public pour les campagnes en dépôt */
Lien public pour déposer une proposition
{`${window.location.origin}/p/${campaign.slug || 'campagne'}`}
) : (campaign.status === 'voting' || campaign.status === 'closed') ? ( /* Bouton Statistiques pour les campagnes en vote/fermées */
) : ( /* Espace vide pour les autres statuts */
)}
))}
)} {/* Modals */} setShowCreateModal(false)} onSuccess={handleCampaignCreated} /> {selectedCampaign && ( setShowEditModal(false)} onSuccess={handleCampaignEdited} campaign={selectedCampaign} /> )} {selectedCampaign && ( setShowDeleteModal(false)} onSuccess={handleCampaignDeleted} campaign={selectedCampaign} /> )}
); } export default function AdminPage() { return ( ); }