// ─── Automations Page ──────────────────────────────────────────────────────── const AUTO_JOB_STATUS = { sent: 'green', pending: 'amber', failed: 'red', processing: 'blue', launched: 'purple', completed: 'green' }; const AUTO_CHANNEL_C = { whatsapp: 'green', call: 'blue' }; function AutomationsPage() { const [autoTab, setAutoTab] = React.useState('Jobs'); const [jobs, setJobs] = React.useState([]); const [templates, setTemplates] = React.useState([]); const [assets, setAssets] = React.useState([]); const [loading, setLoading] = React.useState(true); const [statusFilter, setStatusFilter] = React.useState('all'); const [channelFilter, setChannelFilter] = React.useState('all'); const reload = () => Promise.all([ fetch('/api/automation/jobs').then(r => r.json()).catch(() => []), fetch('/api/whatsapp/templates').then(r => r.json()).catch(() => []), fetch('/api/message-assets').then(r => r.json()).catch(() => []), ]).then(([j, t, a]) => { setJobs(Array.isArray(j) ? j : (Array.isArray(j?.items) ? j.items : [])); setTemplates(Array.isArray(t.items) ? t.items : []); setAssets(Array.isArray(a) ? a : (Array.isArray(a?.items) ? a.items : [])); setLoading(false); }); React.useEffect(() => { reload(); }, []); const filtered = jobs.filter(j => { if (statusFilter !== 'all' && j.status !== statusFilter) return false; if (channelFilter !== 'all' && j.channel !== channelFilter) return false; return true; }); const stats = { total: jobs.length, sent: jobs.filter(j => j.status === 'sent' || j.status === 'completed').length, pending: jobs.filter(j => j.status === 'pending').length, failed: jobs.filter(j => j.status === 'failed').length, }; const handleRun = async id => { await fetch(`/api/automation/jobs/${id}/launch-call`, { method: 'POST' }).catch(() => {}); reload(); }; const handleRetry = async id => { await fetch(`/api/automation/jobs/${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: 'pending' }), }).catch(() => {}); reload(); }; const handleDelete = async id => { await fetch(`/api/automation/jobs/${id}`, { method: 'PATCH', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ status: 'cancelled' }), }).catch(() => {}); setJobs(p => p.filter(j => j.id !== id)); }; return (