/** Aviso de sessão encerrada: cobre a tela, explica o motivo e leva ao login * depois de alguns segundos — tempo de ler, sem despejo seco. */ function AvisoSessao() { const [aviso, setAviso] = React.useState(null); const [resta, setResta] = React.useState(8); React.useEffect(() => { const aoExpirar = (e) => setAviso((a) => a || { message: e.detail?.message, reason: e.detail?.reason }); window.addEventListener("flowtix:sessao-expirada", aoExpirar); return () => window.removeEventListener("flowtix:sessao-expirada", aoExpirar); }, []); const sair = React.useCallback(() => { try { localStorage.removeItem("flowtix.tela"); localStorage.removeItem("flowtix.demandId"); } catch {} window.location.reload(); }, []); React.useEffect(() => { if (!aviso) return; setResta(8); const t = setInterval(() => setResta((n) => { if (n <= 1) { clearInterval(t); sair(); return 0; } return n - 1; }), 1000); return () => clearInterval(t); }, [aviso, sair]); if (!aviso) return null; const titulo = { inatividade: "Sessão expirada por inatividade", encerrada: "Sessão encerrada", desativada: "Conta desativada", }[aviso.reason] || "Sessão expirada"; return (
{titulo}

{aviso.message || "Sua sessão expirou. Entre novamente para continuar."}

Nenhum dado enviado foi perdido. Levando para a tela de entrada em {resta}s…

); } Object.assign(window, { AvisoSessao });