'use client'; import { useState, useEffect } from 'react'; import { Participant, Campaign } from '@/types'; import { settingsService } from '@/lib/services'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Mail, Send, CheckCircle, XCircle } from 'lucide-react'; interface SendParticipantEmailModalProps { isOpen: boolean; onClose: () => void; participant: Participant; campaign: Campaign; } export default function SendParticipantEmailModal({ isOpen, onClose, participant, campaign }: SendParticipantEmailModalProps) { const [subject, setSubject] = useState(''); const [message, setMessage] = useState(''); const [sending, setSending] = useState(false); const [result, setResult] = useState<{ success: boolean; message: string } | null>(null); // Générer le lien de vote (utiliser uniquement le lien court) const voteUrl = participant.short_id ? `${typeof window !== 'undefined' ? window.location.origin : ''}/v/${participant.short_id}` : `${typeof window !== 'undefined' ? window.location.origin : ''}/v/EN_ATTENTE`; // Initialiser le message par défaut quand le modal s'ouvre useEffect(() => { if (isOpen && campaign && participant) { setSubject(`Votez pour la campagne "${campaign.title}"`); setMessage(`Bonjour ${participant.first_name}, Vous êtes invité(e) à participer au vote pour la campagne "${campaign.title}". ${campaign.description} Pour voter, cliquez sur le lien suivant : ${voteUrl} Vous disposez d'un budget de ${campaign.budget_per_user}€ à répartir entre les propositions selon vos préférences. Merci de votre participation ! Cordialement, L'équipe Mes Budgets Participatifs`); } }, [isOpen, campaign, participant]); const handleSendEmail = async () => { if (!subject.trim() || !message.trim()) { setResult({ success: false, message: 'Veuillez remplir le sujet et le message' }); return; } try { setSending(true); setResult(null); // Récupérer les paramètres SMTP const smtpSettings = await settingsService.getSmtpSettings(); if (!smtpSettings.host || !smtpSettings.username || !smtpSettings.password) { setResult({ success: false, message: 'Configuration SMTP manquante. Veuillez configurer les paramètres email dans les paramètres.' }); return; } // Envoyer l'email via l'API const response = await fetch('/api/send-participant-email', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ smtpSettings, toEmail: participant.email, toName: `${participant.first_name} ${participant.last_name}`, subject: subject.trim(), message: message.trim(), campaignTitle: campaign.title, voteUrl }), }); const result = await response.json(); if (result.success) { setResult({ success: true, message: 'Email envoyé avec succès !' }); // Vider les champs après succès setTimeout(() => { setSubject(''); setMessage(''); onClose(); }, 2000); } else { setResult({ success: false, message: result.error || 'Erreur lors de l\'envoi de l\'email' }); } } catch (error) { setResult({ success: false, message: 'Erreur inattendue lors de l\'envoi' }); } finally { setSending(false); } }; const handleClose = () => { setSubject(''); setMessage(''); setResult(null); onClose(); }; return ( Envoyer un email à {participant.first_name} {participant.last_name} Envoyez un email personnalisé à ce participant avec le lien de vote.
{/* Informations du participant */}

Destinataire :

Nom : {participant.first_name} {participant.last_name}
Email : {participant.email}
Campagne : {campaign.title}
{/* Sujet */}
setSubject(e.target.value)} disabled={sending} />
{/* Message */}