// All views/screens for RodaiClientes const { useState: useStateV, useEffect: useEffectV, useMemo: useMemoV, useRef: useRefV } = React; // ---------------- LOGIN ---------------- function LoginView({ onLogin }) { const [user, setUser] = useStateV('admin'); const [pwd, setPwd] = useStateV(''); const [loading, setLoading] = useStateV(false); const [error, setError] = useStateV(''); const submit = async (e) => { e?.preventDefault?.(); if (!user || !pwd) { setError('Preencha usuário e senha'); return; } setLoading(true); setError(''); try { const r = await fetch('/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: user, password: pwd }), }); if (r.ok) { const data = await r.json(); onLogin(data.access_token); } else { const err = await r.json().catch(() => ({})); setError(err.detail || 'Credenciais inválidas'); } } catch (_) { setError('Erro de conexão — verifique o servidor'); } finally { setLoading(false); } }; return (
{/* subtle grid backdrop */}