'use client'; import { useState, useEffect } from 'react'; import Link from 'next/link'; import { useParams } from 'next/navigation'; import { Campaign, Proposition } from '@/types'; import { campaignService, propositionService } from '@/lib/services'; import AddPropositionModal from '@/components/AddPropositionModal'; import EditPropositionModal from '@/components/EditPropositionModal'; import DeletePropositionModal from '@/components/DeletePropositionModal'; import ImportFileModal from '@/components/ImportFileModal'; import ExportPropositionsButton from '@/components/ExportPropositionsButton'; import ClearAllPropositionsModal from '@/components/ClearAllPropositionsModal'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import Navigation from '@/components/Navigation'; import AuthGuard from '@/components/AuthGuard'; import { FileText, Calendar, Mail, Upload } from 'lucide-react'; import { MarkdownContent } from '@/components/MarkdownContent'; export const dynamic = 'force-dynamic'; function CampaignPropositionsPageContent() { const params = useParams(); const campaignId = params.id as string; const [campaign, setCampaign] = useState(null); const [propositions, setPropositions] = useState([]); const [loading, setLoading] = useState(true); const [showAddModal, setShowAddModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [showDeleteModal, setShowDeleteModal] = useState(false); const [showImportModal, setShowImportModal] = useState(false); const [showClearAllModal, setShowClearAllModal] = useState(false); const [selectedProposition, setSelectedProposition] = useState(null); 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; } loadData(); }, [campaignId]); const loadData = async () => { try { setLoading(true); const [campaignData, propositionsData] = await Promise.all([ campaignService.getById(campaignId), propositionService.getByCampaign(campaignId) ]); setCampaign(campaignData); setPropositions(propositionsData); } catch (error) { console.error('Erreur lors du chargement des données:', error); } finally { setLoading(false); } }; const handlePropositionAdded = () => { setShowAddModal(false); loadData(); }; const handlePropositionEdited = () => { setShowEditModal(false); loadData(); }; const handlePropositionDeleted = () => { setShowDeleteModal(false); loadData(); }; const handleImportPropositions = async (data: any[]) => { try { const propositionsToCreate = data.map(row => ({ campaign_id: campaignId, title: row.Titre || '', description: row.Description || '', author_first_name: row.Prénom || 'admin', author_last_name: row.Nom || 'admin', author_email: row.Email || 'admin@example.com' })); // Créer les propositions une par une for (const proposition of propositionsToCreate) { await propositionService.create(proposition); } loadData(); } catch (error) { console.error('Erreur lors de l\'import des propositions:', error); } }; const handleClearAllPropositions = async () => { try { await propositionService.deleteAllByCampaign(campaignId); loadData(); } catch (error) { console.error('Erreur lors de la suppression des propositions:', error); throw error; } }; const getInitials = (firstName: string, lastName: string) => { return `${firstName.charAt(0)}${lastName.charAt(0)}`.toUpperCase(); }; if (loading) { return (

Chargement des propositions...

); } if (!campaign) { return (

Campagne introuvable

La campagne que vous recherchez n'existe pas ou a été supprimée.

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

Propositions

{campaign.title}

{propositions.length > 0 && ( )}
{/* Propositions List */} {propositions.length === 0 ? (

Aucune proposition

Aucune proposition n'a encore été soumise pour cette campagne.

) : (
{propositions.map((proposition) => (
{proposition.title}
{getInitials(proposition.author_first_name, proposition.author_last_name)}

{proposition.author_first_name} {proposition.author_last_name}

{proposition.author_email}
{new Date(proposition.created_at).toLocaleDateString('fr-FR')}
))}
)} {/* Modals */} setShowAddModal(false)} onSuccess={handlePropositionAdded} campaignId={campaignId} /> {selectedProposition && ( setShowEditModal(false)} onSuccess={handlePropositionEdited} proposition={selectedProposition} /> )} {selectedProposition && ( setShowDeleteModal(false)} onSuccess={handlePropositionDeleted} proposition={selectedProposition} /> )} setShowImportModal(false)} onImport={handleImportPropositions} type="propositions" campaignTitle={campaign?.title} /> setShowClearAllModal(false)} onConfirm={handleClearAllPropositions} campaignTitle={campaign?.title} propositionCount={propositions.length} />
); } export default function CampaignPropositionsPage() { return ( ); }