// Login screen — 2 users, password = username const USERS = { baptiste: { name: "Baptiste", color: "#C2603F", avatar: "B" }, imelda: { name: "Imelda", color: "#8E5A8A", avatar: "I" }, }; function useAuth() { const [user, setUser] = React.useState(() => { try { return localStorage.getItem("maisonnee:user") || null; } catch { return null; } }); const login = (u) => { setUser(u); try { localStorage.setItem("maisonnee:user", u); } catch {} }; const logout = () => { setUser(null); try { localStorage.removeItem("maisonnee:user"); } catch {} }; return { user, login, logout }; } function LoginScreen({ onLogin }) { const [pickedUser, setPickedUser] = React.useState(null); const [pwd, setPwd] = React.useState(""); const [err, setErr] = React.useState(""); const inputRef = React.useRef(null); React.useEffect(() => { if (pickedUser && inputRef.current) inputRef.current.focus(); }, [pickedUser]); const [busy, setBusy] = React.useState(false); const submit = async (e) => { e?.preventDefault?.(); if (!pickedUser || busy) return; if (pwd.trim().toLowerCase() !== pickedUser) { setErr("Mot de passe incorrect"); setTimeout(() => setErr(""), 1800); return; } setBusy(true); try { await onLogin(pickedUser); } catch (e) { setErr(e?.message || "Connexion impossible"); } finally { setBusy(false); } }; return (
{/* Decorative arcs */}
m
Maisonnée
La maison, un peu plus organisée.
{!pickedUser ? (
Qui se connecte ?
{Object.entries(USERS).map(([key, u]) => ( ))}
) : (
{USERS[pickedUser].avatar}
Bonjour, {USERS[pickedUser].name}
Entrez votre mot de passe
setPwd(e.target.value)} placeholder="Mot de passe" style={{ width: "100%", padding: "12px 14px", background: "var(--bg-2)", border: `1px solid ${err ? "var(--prio-high)" : "var(--line-2)"}`, borderRadius: 12, fontSize: 16, outline: "none", transition: "border-color .15s ease", }} /> {err &&
{err}
}
Mot de passe : votre prénom en minuscules
)}
); } Object.assign(window, { USERS, useAuth, LoginScreen });