// Login screen — única tela pública. Autentica via POST /v1/auth/login (email + senha). function LoginScreen({ onAuth }) { const [email, setEmail] = useState(''); const [senha, setSenha] = useState(''); const [loading, setLoading] = useState(false); const [err, setErr] = useState(null); const submit = async (e) => { e.preventDefault(); setErr(null); if (!email || !senha) { setErr('Informe e-mail e senha.'); return; } setLoading(true); try { const res = await fetch(`${API_BASE}/v1/auth/login`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ email, password: senha }), }); if (!res.ok) { const body = await res.json().catch(() => ({})); setErr(body.detail || 'Não foi possível entrar. Verifique e-mail e senha.'); return; } const data = await res.json(); onAuth({ token: data.access_token, user: data.user, tenant: data.tenant, expiresAt: data.expires_at }); } catch (_e) { setErr('Falha de conexão com o servidor. Tente novamente em instantes.'); } finally { setLoading(false); } }; return (
Envie o contrato em PDF e receba planilha de cálculo, painel de viabilidade e memória técnica detalhada. Taxa abusiva, capitalização e CET XIRR verificados nos parâmetros do Bacen na data-base.
Acesso restrito a peritos credenciados.