import { useState, type FormEvent, type MouseEvent } from "react"; import { api, errMsg } from "../api"; import { useAuthChanged } from "../auth"; // AuthBox: Login und Registrierung im Wechsel. Die {" "} sind Absicht: // Überschrift, Inputs und Knöpfe sind inline, der Abstand ist sichtbar. export function AuthBox() { const [mode, setMode] = useState<"login" | "register">("login"); const [msg, setMsg] = useState(""); const [busy, setBusy] = useState(false); const authChanged = useAuthChanged(); const show = (which: "login" | "register") => (e: MouseEvent) => { e.preventDefault(); setMode(which); setMsg(""); }; // submit sperrt das Formular für die Dauer des Requests und zeigt einen // Fehler als Meldung; action wirft bei Misserfolg (ApiError). const submit = (action: (fd: FormData) => Promise, fallback: string) => async (e: FormEvent) => { e.preventDefault(); setBusy(true); try { await action(new FormData(e.currentTarget)); setMsg(""); await authChanged(); } catch (err) { setMsg(errMsg(err, fallback)); } finally { setBusy(false); } }; const login = submit((fd) => api.post("/auth/login", fd), "Login fehlgeschlagen."); // Nach der Registrierung direkt mit denselben Daten einloggen, damit der // Nutzer gleich drin ist. newuser meldet alle Feldfehler auf einmal. const register = submit(async (fd) => { await api.post("/auth/newuser", fd); const creds = new FormData(); creds.append("user", String(fd.get("user"))); creds.append("pass", String(fd.get("pass1"))); creds.append("timeout", "86400"); await api.post("/auth/login", creds); }, "Registrierung fehlgeschlagen."); return (

{msg}

); }