/* global React, Icon, Ticker, Drawer */ const CLASS_META = { EMPENHO: { label: 'EMPENHO', cls: 'badge-lime' }, CONVOCACAO: { label: 'CONVOCAÇÃO', cls: 'badge-cyan' }, CERTIDAO: { label: 'CERTIDÃO', cls: 'badge-cyan' }, FINANCEIRO: { label: 'FINANCEIRO', cls: 'badge-amber' }, EXTRATO: { label: 'EXTRATO', cls: 'badge-amber' }, COTACAO: { label: 'COTAÇÃO', cls: 'badge-cyan' }, LOGISTICA: { label: 'LOGÍSTICA', cls: 'badge-violet' }, SPAM: { label: 'SPAM', cls: '' }, OUTRO: { label: 'OUTRO', cls: '' }, }; const CLASS_ORDER = ['EMPENHO', 'CONVOCACAO', 'CERTIDAO', 'FINANCEIRO', 'EXTRATO', 'COTACAO', 'LOGISTICA', 'SPAM', 'OUTRO']; function metaOf(c) { return CLASS_META[c] || { label: c || 'OUTRO', cls: '' }; } function fmtData(iso) { if (!iso) return '—'; try { return new Date(iso).toLocaleString('pt-BR', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }); } catch { return '—'; } } function MIa({ onNav }) { const [emails, setEmails] = React.useState([]); const [loading, setLoading] = React.useState(true); const [syncing, setSyncing] = React.useState(false); const [filtro, setFiltro] = React.useState('todos'); const [sel, setSel] = React.useState(null); const [toast, setToast] = React.useState(null); const [pend, setPend] = React.useState(null); const showToast = (msg, ms = 5000) => { setToast(msg); setTimeout(() => setToast(null), ms); }; const load = async () => { try { const rows = await window.dataApi.listEmails(); setEmails(rows); } catch (e) { showToast('Erro ao carregar e-mails: ' + (e?.message || e)); } finally { setLoading(false); } }; React.useEffect(() => { load(); }, []); const handleSync = async () => { if (syncing) return; setSyncing(true); try { const r = await window.syncEmails(); if (!r.ok) { showToast('Falha na sincronização: ' + r.error, 8000); } else { if (typeof r.pendentes_corpo === 'number') setPend(r.pendentes_corpo); showToast(`Sincronização: ${r.novos ?? 0} novo(s) · ${r.aprofundados ?? 0} com corpo analisado · ${r.pendentes_corpo ?? 0} aguardando corpo`, 7000); await load(); } } catch (e) { showToast('Erro: ' + (e?.message || e), 8000); } finally { setSyncing(false); } }; const counts = React.useMemo(() => { const c = {}; emails.forEach(e => { const k = e.classificacao || 'OUTRO'; c[k] = (c[k] || 0) + 1; }); return c; }, [emails]); const filtrados = filtro === 'todos' ? emails : emails.filter(e => (e.classificacao || 'OUTRO') === filtro); const classesPresentes = CLASS_ORDER.filter(c => counts[c]); const semCorpo = emails.filter(e => !e.corpo).length; return ( <>
IA · Gerente Geral M08 IA + IMAP ATIVOS

Caixa de e-mails inteligente

A IA lê a caixa, classifica (empenhos, convocações, certidões, financeiro...) e resume cada e-mail. Clique em um e-mail para ver a análise e a sugestão de ação.

{/* Filtros por classificação */}
setFiltro('todos')}> Todos {emails.length}
{classesPresentes.map(c => (
setFiltro(filtro === c ? 'todos' : c)}> {metaOf(c).label} {counts[c]}
))}
{filtrados.length} e-mail(s){filtro !== 'todos' && (de {emails.length})}
caixa monitorada via IMAP · análise por IA {semCorpo > 0 && · {semCorpo} aguardando análise do corpo (automático)}
{loading ? (
Carregando...
) : emails.length === 0 ? (
Nenhum e-mail sincronizado ainda

Clique em Sincronizar agora para a IA capturar e classificar os e-mails mais recentes da caixa.

) : ( {filtrados.map(e => { const m = metaOf(e.classificacao); return ( setSel(e)} style={{ cursor: 'pointer' }}> ); })}
Classificação Assunto / Remetente Resumo da IA Recebido
{m.label}
{e.assunto || '(sem assunto)'} {e.corpo ? : null}
{e.de_nome || e.de}
{e.resumo || '—'}
{fmtData(e.recebido_em)}
)}
{sel && setSel(null)} />} {toast && (
{toast}
)} ); } function EmailDrawer({ email, onClose }) { const m = metaOf(email.classificacao); const analise = email.analise_ia || {}; const campos = analise.campos && typeof analise.campos === 'object' ? analise.campos : {}; const camposList = Object.entries(campos).filter(([, v]) => v !== null && v !== '' && typeof v !== 'object'); return ( E-mail · M08{m.label}} title={email.assunto || '(sem assunto)'} subtitle={`${email.de_nome || ''} ${email.de ? '<' + email.de + '>' : ''} · ${fmtData(email.recebido_em)}`} >
{analise.resumo && (
RESUMO DA IA
{analise.resumo}
)} {analise.sugestao && (
Sugestão da IA
{analise.sugestao}
)} {camposList.length > 0 && (
CAMPOS EXTRAÍDOS
{camposList.map(([k, v]) => (
{k.replace(/_/g, ' ').toUpperCase()}
{String(v)}
))}
)} {email.corpo ? (
CORPO DO E-MAIL
{email.corpo}
) : (
Classificação baseada em assunto e remetente. A leitura do corpo completo do e-mail entra na próxima fase.
)}
); } window.MIa = MIa;