// Telas 6 e 7 — E-mails capturados + IoT. const DSk = window.WiFi_eeb21e; const { Card: CardK, CardContent: CardContentK, CardHeader: CardHeaderK, CardTitle: CardTitleK, Badge: BadgeK, Button: BtnK, Input: InputK, Label: LabelK } = DSk; const { GTh: ThK, GTd: TdK, TermoDica: TermoK, BtnMini: BtnMiniK, mkLinha: mkK } = window; function TelaRegistros({ site, sitesSel }) { const list = sitesSel && sitesSel.length ? sitesSel : [site]; const carga = window.useCarrega(() => window.GestaoAPI.registros(), []); const todos = ((carga.dados && carga.dados.registros) || []).map(r => ({ quando: (r.ts_utc || '').replace('T', ' ').slice(0, 16), email: r.email || '-', ponto: r.condominio || r.ponto || '-', origem: r.origem_roteador || r.ip || '-', })); const rows = todos.filter(r => list.includes(r.ponto)); const baixarCsv = () => { const csv = 'quando,email,ponto,origem\n' + rows.map(r => `${r.quando},${r.email},${r.ponto},${r.origem}`).join('\n'); const a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([csv], { type: 'text/csv' })); a.download = list.length > 1 ? 'portal-registros.csv' : `portal-registros-${list[0]}.csv`; a.click(); URL.revokeObjectURL(a.href); }; return
{list.length > 1 ? `${rows.length} nos pontos selecionados` : `${rows.length} neste ponto`} {`${todos.length} no total`}
Baixar CSV
QuandoE-mailPontoOrigem {rows.map((r, i) => {r.quando}{r.email}{r.ponto}{r.origem} (mascarada))}
{!rows.length ?
Nenhum registro dos pontos selecionados ainda.
: null}
A base de contatos pertence ao CORE — este espelho é operacional. Leitura oficial por SSH na VM01: sudo tail /opt/charles/wifi-monitor/data/portal/*.jsonl
; } function TelaIot({ site }) { const carga = window.useCarrega(() => window.GestaoAPI.iot(), []); const vistos = ((carga.dados && carga.dados.registros) || []).map(v => ({ mac: (v.mac || '-').toUpperCase(), quando: (v.ts_utc || '').replace('T', ' ').slice(0, 16), idioma: v.lang || (Array.isArray(v.langs) ? v.langs[0] : '-') || '-', tela: v.tela || '-', })); const [mac, setMac] = React.useState(''); const [res, setRes] = React.useState(null); const consultar = () => { const m = mac.trim().toUpperCase(); setRes(vistos.find(v => v.mac === m) || { naoVisto: true, mac: m }); }; return
Avisos IoT vistos
Aparelhos que abriram a página de aviso da rede IoT — comprovadamente NÃO são IoT (têm tela).
MACVisto emIdiomaTela {vistos.map((v, i) => {v.mac}{v.quando}{v.idioma}{v.tela})}
{!vistos.length ?
Nenhum aviso IoT registrado ainda.
: null}
Consultar MAC MAC do aparelho
setMac(e.target.value)} style={{ fontFamily: 'var(--app-font-mono)' }} />
Consultar {res ?
{res.naoVisto ? Este MAC ainda não abriu o aviso IoT. : Visto em {res.quando} ({res.idioma}) · tela {res.tela}.
Abriu o aviso → tem navegador, não é IoT.
}
: null}
; } Object.assign(window, { TelaRegistros, TelaIot });