/* JRN — Autenticação: Login + Recuperação de senha */ function AuthShell({ children }) { return (
{/* Painel de marca */}
JRN
Portal de Indicadores

Inteligência de gestão para todo o grupo, em um só lugar.

Acompanhe os indicadores das empresas do Grupo JRN com a governança e a segurança de acesso que cada área exige.

{COMPANIES.filter(c => c.id !== 'jrn').slice(0, 6).map(c => ( {c.nome} ))}
{/* Painel de formulário */}
{children}
{/* Desenvolvido por Nexalyze */}
Desenvolvido por Nexalyze
); } function LoginScreen({ onLogin }) { const [view, setView] = useState('login'); // login | forgot | sent const [email, setEmail] = useState(''); const [pwd, setPwd] = useState(''); const [showPwd, setShowPwd] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [recEmail, setRecEmail] = useState(''); const [recLoading, setRecLoading] = useState(false); const submit = async (e) => { e.preventDefault(); setLoading(true); setError(''); try { await apiLogin(email, pwd); await onLogin(); // onLogin chama apiMe() no App e atualiza a sessão } catch (err) { setError(err.message || 'Credenciais inválidas'); setLoading(false); } }; const submitForgot = async (e) => { e.preventDefault(); setRecLoading(true); try { await apiForgotPassword(recEmail); } catch (_) { // Resposta é sempre genérica (anti-enumeração) — tratamos como sucesso } setRecLoading(false); setView('sent'); }; if (view === 'forgot' || view === 'sent') { return ( {view === 'forgot' ? (

Recuperar acesso

Informe o e-mail corporativo cadastrado. Enviaremos um link seguro para redefinição de senha.

setRecEmail(e.target.value)} />
{recLoading ? : null} {recLoading ? 'Enviando…' : 'Enviar link de redefinição'}
) : (

Verifique seu e-mail

Se houver uma conta associada a {recEmail || 'esse endereço'}, você receberá um link de redefinição em instantes.

setView('login')}>Voltar ao login
)}
); } return (
Bem-vindo de volta

Acessar o portal

Entre com suas credenciais corporativas.

setEmail(e.target.value)} />
setPwd(e.target.value)} />
{error && (
{error}
)}
{loading ? : null} {loading ? 'Entrando…' : 'Entrar no portal'}
Ambiente protegido · acesso monitorado e auditado
); } Object.assign(window, { LoginScreen });