"use client"; import { useState } from "react"; import { TextField, useToast } from "@nexarch/shl"; import { ApiError, login } from "../../lib/api"; export default function LoginPage() { const { push } = useToast(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [totpCode, setTotpCode] = useState(""); const [needsSecondFactor, setNeedsSecondFactor] = useState(false); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); async function onSubmit(event: React.FormEvent) { event.preventDefault(); setError(null); setSubmitting(true); try { await login(email, password, needsSecondFactor ? totpCode : undefined); push("Anmeldung erfolgreich.", "success"); window.location.href = "/profile"; } catch (err) { if (err instanceof ApiError) { // Akzeptanzkriterium 3 / Pruefung 1: nur die generische, vom Backend // gelieferte Meldung anzeigen — keine eigene, evtl. praezisere // Fehlerursache im Frontend herleiten oder ergaenzen. setError(err.message); if (err.code === "second_factor_required") { setNeedsSecondFactor(true); } } else { setError("Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut."); } } finally { setSubmitting(false); } } return (

Anmeldung

setEmail(e.target.value)} /> setPassword(e.target.value)} /> {needsSecondFactor && ( setTotpCode(e.target.value)} hint="Öffnen Sie Ihre Authenticator-App oder geben Sie einen Wiederherstellungscode ein." /> )} {error && (

{error}

)}

Passwort vergessen?

); }