import { useEffect, useState } from 'react'; import { useEmailsStore } from '@/stores/emails'; import { useClientsStore } from '@/stores/clients'; import { Mail, Send, Trash2, Edit3, Sparkles, Gift } from 'lucide-react'; import { cn, formatDate } from '@/lib/utils'; import { EmailStatusBadge } from '@/components/Badge'; import EmptyState from '@/components/EmptyState'; import { PageLoader } from '@/components/LoadingSpinner'; import LoadingSpinner from '@/components/LoadingSpinner'; import Modal from '@/components/Modal'; export default function EmailsPage() { const { emails, isLoading, isGenerating, statusFilter, setStatusFilter, fetchEmails, generateEmail, generateBirthdayEmail, updateEmail, sendEmail, deleteEmail } = useEmailsStore(); const { clients, fetchClients } = useClientsStore(); const [showCompose, setShowCompose] = useState(false); const [editingEmail, setEditingEmail] = useState(null); const [editSubject, setEditSubject] = useState(''); const [editContent, setEditContent] = useState(''); const [composeForm, setComposeForm] = useState({ clientId: '', purpose: '', provider: 'anthropic' as 'anthropic' | 'openai' }); useEffect(() => { fetchEmails(); fetchClients(); }, [fetchEmails, fetchClients]); const filtered = statusFilter ? emails.filter((e) => e.status === statusFilter) : emails; const handleGenerate = async () => { try { await generateEmail(composeForm.clientId, composeForm.purpose, composeForm.provider); setShowCompose(false); setComposeForm({ clientId: '', purpose: '', provider: 'anthropic' }); } catch {} }; const handleGenerateBirthday = async () => { try { await generateBirthdayEmail(composeForm.clientId, composeForm.provider); setShowCompose(false); setComposeForm({ clientId: '', purpose: '', provider: 'anthropic' }); } catch {} }; const startEdit = (email: typeof emails[0]) => { setEditingEmail(email.id); setEditSubject(email.subject); setEditContent(email.content); }; const saveEdit = async () => { if (!editingEmail) return; await updateEmail(editingEmail, { subject: editSubject, content: editContent }); setEditingEmail(null); }; if (isLoading && emails.length === 0) return ; const statusFilters = [ { key: null, label: 'All' }, { key: 'draft', label: 'Drafts' }, { key: 'sent', label: 'Sent' }, { key: 'failed', label: 'Failed' }, ]; return (

Emails

AI-generated emails for your network

{/* Filters */}
{statusFilters.map(({ key, label }) => ( ))}
{/* Emails list */} {filtered.length === 0 ? ( setShowCompose(true) }} /> ) : (
{filtered.map((email) => (
{editingEmail === email.id ? (
setEditSubject(e.target.value)} className="w-full px-3 py-2 border border-slate-300 dark:border-slate-600 rounded-lg text-sm font-medium text-slate-900 dark:text-slate-100 bg-white dark:bg-slate-800 focus:outline-none focus:ring-2 focus:ring-blue-500" />