// 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 });