/* 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 (
<>
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.
Clique em Sincronizar agora para a IA capturar e classificar os e-mails mais recentes da caixa.
| Classificação | Assunto / Remetente | Resumo da IA | Recebido | |
|---|---|---|---|---|
| {m.label} |
{e.assunto || '(sem assunto)'}
{e.corpo ?
{e.de_nome || e.de}
|
{e.resumo || '—'}
|
{fmtData(e.recebido_em)} |