// admin.jsx — área do vendedor: login, dashboard, CRUD form const AUTH_KEY = "moliterni_auth_v1"; // Híbrido: no modo "api" a sessão é validada pelo servidor (session.php / login.php); // no modo "demo" usa um flag local contra as credenciais chumbadas (ADMIN_CRED). function useAuth(mode) { const [authed, setAuthed] = React.useState(false); const [checking, setChecking] = React.useState(true); React.useEffect(() => { if (mode === "loading") return; let alive = true; if (mode === "api") { fetch(API_BASE + "session.php", { credentials: "include" }) .then((r) => r.json()) .then((d) => { if (alive) { setAuthed(!!d.authed); setChecking(false); } }) .catch(() => { if (alive) setChecking(false); }); } else { try { setAuthed(localStorage.getItem(AUTH_KEY) === "1"); } catch (e) {} setChecking(false); } return () => { alive = false; }; }, [mode]); const login = () => { if (mode === "demo") { try { localStorage.setItem(AUTH_KEY, "1"); } catch (e) {} } setAuthed(true); }; const logout = () => { if (mode === "api") { fetch(API_BASE + "logout.php", { credentials: "include" }).catch(() => {}); } else { try { localStorage.removeItem(AUTH_KEY); } catch (e) {} } setAuthed(false); }; return { authed, login, logout, checking }; } // ---------- Login ---------- function AdminLogin({ onLogin, onBack, mode }) { const [user, setUser] = React.useState(""); const [pass, setPass] = React.useState(""); const [err, setErr] = React.useState(""); const [busy, setBusy] = React.useState(false); const submit = async (e) => { e.preventDefault(); if (mode === "api") { setBusy(true); setErr(""); try { const r = await fetch(API_BASE + "login.php", { method: "POST", credentials: "include", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ usuario: user.trim(), senha: pass }), }); const d = await r.json(); if (r.ok && d.ok) onLogin(); else setErr(d.erro || "Usuário ou senha incorretos."); } catch (e) { setErr("Falha ao conectar no servidor."); } finally { setBusy(false); } } else { if (user.trim() === ADMIN_CRED.user && pass === ADMIN_CRED.pass) { setErr(""); onLogin(); } else setErr("Usuário ou senha incorretos."); } }; return (
admin · senha demo123
Sem foto? O anúncio mostra um placeholder elegante automaticamente. A primeira foto vira a capa.
O anúncio do {confirmDel.marca} {confirmDel.modelo} será removido permanentemente.