/* ============================================================ auth.jsx — login + recover password ============================================================ */ function Login(){ const { setUser, setRoute, pushToast } = useApp(); const [mode, setMode] = React.useState("login"); // login | recover | recover-sent const [email, setEmail] = React.useState(""); const [pwd, setPwd] = React.useState(""); const [showPwd, setShowPwd] = React.useState(false); const [remember, setRemember] = React.useState(true); const [loading, setLoading] = React.useState(false); const [err, setErr] = React.useState(""); const submit = async (e) => { e.preventDefault(); setErr(""); if (!email.includes("@")) { setErr("E-mail inválido."); return; } if (!pwd || pwd.length < 6) { setErr("Senha deve ter ao menos 6 caracteres."); return; } setLoading(true); try { const r = await window.api.login(email, pwd); setUser({ name: r.user.name, email: r.user.email, role: r.user.role }); pushToast("Bem-vindo de volta."); setRoute("/dashboard"); } catch (ex) { if (ex.code === "invalid_credentials") setErr("E-mail ou senha incorretos."); else if (ex.code === "rate_limited") setErr("Muitas tentativas. Aguarde um pouco."); else setErr(ex.message || "Falha ao entrar."); } finally { setLoading(false); } }; const recover = async (e) => { e.preventDefault(); setLoading(true); try { await window.api.recover(email); setMode("recover-sent"); } catch (ex) { setErr(ex.message || "Falha ao solicitar recuperação."); } finally { setLoading(false); } }; return (
Gerencie cobranças, checkouts e order bumps com a presença que sua marca merece.
Informe seu e-mail. Em segundos enviamos um link seguro para você redefinir a senha.
>} {mode === "recover-sent" && <>Caso o e-mail {email} esteja cadastrado, em poucos segundos chegará uma mensagem com instruções para redefinir sua senha.
>}