'use client' import { useState, useEffect } from 'react' interface Template { id: string name: string slug: string subject: string variables?: Array<{ name: string type: string required: boolean description?: string }> previewData?: Record } interface QueuedEmail { id: string subject: string to: string[] status: string createdAt: string sentAt?: string attempts: number error?: string } export default function MailingTestPage() { const [templates, setTemplates] = useState([]) const [queuedEmails, setQueuedEmails] = useState([]) const [selectedTemplate, setSelectedTemplate] = useState('') const [toEmail, setToEmail] = useState('test@example.com') const [variables, setVariables] = useState>({}) const [emailType, setEmailType] = useState<'send' | 'schedule'>('send') const [scheduleDate, setScheduleDate] = useState('') const [loading, setLoading] = useState(false) const [message, setMessage] = useState('') useEffect(() => { fetchData() }, []) const fetchData = async () => { try { const response = await fetch('/api/test-email') const data = await response.json() setTemplates(data.templates || []) setQueuedEmails(data.outbox?.emails || []) } catch (error) { console.error('Error fetching data:', error) } } const handleTemplateChange = (templateSlug: string) => { setSelectedTemplate(templateSlug) const template = templates.find(t => t.slug === templateSlug) if (template?.previewData) { setVariables(template.previewData) } } const sendTestEmail = async () => { if (!selectedTemplate || !toEmail) { setMessage('Please select a template and enter an email address') return } setLoading(true) setMessage('') try { const response = await fetch('/api/test-email', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ type: emailType, templateSlug: selectedTemplate, to: toEmail, variables, scheduledAt: emailType === 'schedule' ? scheduleDate : undefined, }), }) const result = await response.json() if (result.success) { setMessage(`✅ ${result.message} (ID: ${result.emailId})`) fetchData() // Refresh email queue } else { setMessage(`❌ Error: ${result.error}`) } } catch (error) { setMessage(`❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`) } finally { setLoading(false) } } const processEmailQueue = async () => { setLoading(true) try { const response = await fetch('/api/process-emails', { method: 'POST', headers: { 'Content-Type': 'application/json', }, }) const result = await response.json() setMessage(result.success ? `✅ ${result.message}` : `❌ ${result.error}`) setTimeout(() => { fetchData() // Refresh after a delay to see status changes }, 1000) } catch (error) { setMessage(`❌ Error: ${error instanceof Error ? error.message : 'Unknown error'}`) } finally { setLoading(false) } } const selectedTemplateData = templates.find(t => t.slug === selectedTemplate) return (

📧 PayloadCMS Mailing Plugin Test

{message && (
{message}
)}
{/* Send Email Form */}

Send Test Email

setToEmail(e.target.value)} style={{ width: '100%', padding: '8px', borderRadius: '4px', border: '1px solid #ddd' }} />
{emailType === 'schedule' && (
setScheduleDate(e.target.value)} style={{ width: '100%', padding: '8px', borderRadius: '4px', border: '1px solid #ddd' }} />
)} {selectedTemplateData?.variables && (

Template Variables:

{selectedTemplateData.variables.map(variable => (
setVariables({ ...variables, [variable.name]: variable.type === 'number' ? Number(e.target.value) : variable.type === 'boolean' ? e.target.checked : e.target.value })} style={{ width: '100%', padding: '8px', borderRadius: '4px', border: '1px solid #ddd' }} />
))}
)}
{/* Email Queue */}

Email Queue

{queuedEmails.length === 0 ? (

No emails in queue

) : (
{queuedEmails.map(email => (
{email.subject}
To: {Array.isArray(email.to) ? email.to.join(', ') : email.to} | Status: {email.status} | Attempts: {email.attempts}
Created: {new Date(email.createdAt).toLocaleString()} {email.sentAt && ` | Sent: ${new Date(email.sentAt).toLocaleString()}`}
{email.error && (
Error: {email.error}
)}
))}
)}
{/* Templates Overview */}

Available Templates

{templates.length === 0 ? (

No templates available

) : (
{templates.map(template => (

{template.name}

{template.subject}

Variables: {template.variables?.length || 0}
))}
)}
) }