import React, { useState, useEffect } from 'react'; import axios from 'axios'; import { motion } from 'framer-motion'; import { FaPaperPlane, FaDownload, FaChevronLeft, FaEnvelope, FaKey } from 'react-icons/fa'; const ReviewSendStep = ({ fileData, designParams, mappings, onBack }) => { const [eventName, setEventName] = useState(""); const [eventDate, setEventDate] = useState(""); const [clientCompany, setClientCompany] = useState(""); const [subject, setSubject] = useState("Your Attendance Certificate - {event_name}_{event_date}"); const [body, setBody] = useState("Dear Dr {first_name},\n\nThank you for attending {event_name}.\n\nYour certificate is attached.\n\nBest Regards,\n\nVolaris Team on behalf of {client_company}"); const [fromEmail, setFromEmail] = useState(""); const [senderName, setSenderName] = useState("Volaris Team"); const [sending, setSending] = useState(false); const [status, setStatus] = useState(null); const [progress, setProgress] = useState(null); const [jobId, setJobId] = useState(null); const [failedEmails, setFailedEmails] = useState([]); // Store failed email details // Fetch email configuration on mount useEffect(() => { const fetchEmailConfig = async () => { try { const response = await axios.get("/api/email/config"); setFromEmail(response.data.from_email); } catch (error) { console.error("Failed to fetch email config:", error); } }; fetchEmailConfig(); }, []); const handleSend = async () => { if (!eventName || !eventDate || !clientCompany) { alert("Please fill in all required fields: Event Name, Event Date, and Client Company"); return; } setSending(true); const formData = new FormData(); formData.append("subject", subject); formData.append("body", body); formData.append("name_column", mappings.name_column); formData.append("email_column", mappings.email_column); formData.append("event_name", eventName); formData.append("event_date", eventDate); formData.append("client_company", clientCompany); formData.append("sender_name", senderName); formData.append("name_color", designParams.name_color); formData.append("font_size", designParams.font_size); formData.append("fontname", designParams.fontname); if (designParams.x !== null) formData.append("x", designParams.x); if (designParams.y !== null) formData.append("y", designParams.y); try { const response = await axios.post("/api/email/send", formData); const newJobId = response.data.job_id; setJobId(newJobId); setProgress({ sent: 0, total: fileData.total_rows, failed: 0 }); // Start polling for progress const pollInterval = setInterval(async () => { try { const progressResponse = await axios.get(`/api/email/progress/${newJobId}`); const progressData = progressResponse.data; setProgress(progressData); // Stop polling when all emails are sent if (progressData.sent >= progressData.total) { clearInterval(pollInterval); setSending(false); // Store failed emails for display if (progressData.failed_emails && progressData.failed_emails.length > 0) { setFailedEmails(progressData.failed_emails); } const successCount = progressData.sent - progressData.failed; setStatus({ type: progressData.failed > 0 ? 'warning' : 'success', msg: `Successfully sent ${successCount} emails!${progressData.failed > 0 ? ` (${progressData.failed} failed)` : ''}` }); setProgress(null); } } catch (pollError) { console.error("Progress polling error:", pollError); } }, 500); // Poll every 500ms } catch (error) { setStatus({ type: 'error', msg: "Failed to start sending process." }); console.error(error); setSending(false); } }; const handleDownload = async () => { const formData = new FormData(); formData.append("name_column", mappings.name_column); formData.append("email_column", mappings.email_column); formData.append("name_color", designParams.name_color); formData.append("font_size", designParams.font_size); formData.append("fontname", designParams.fontname); if (designParams.x !== null) formData.append("x", designParams.x); if (designParams.y !== null) formData.append("y", designParams.y); try { const response = await axios.post("/api/certificates/generate", formData, { responseType: 'blob' }); const url = window.URL.createObjectURL(new Blob([response.data])); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'certificates.zip'); document.body.appendChild(link); link.click(); } catch (error) { console.error("Download failed", error); } }; return (
Configure your email settings and launch the campaign.
This name appears in the recipient's inbox
Configured in environment settings
⚠️ {progress.failed} failed
)}{failed.name}
{failed.email}
{failed.error}