"use client"; import { useState } from "react"; import { authApi } from "../utils/auth-api"; import { useAuth } from "./AuthProvider"; export function LoginGate({ children }: { children: React.ReactNode }) { const { status, user, reload } = useAuth(); if (status === "loading") { return (

Lädt…

); } if (status === "signed-out") { return (
); } if (user?.mustChangePassword) { return (
); } return <>{children}; } function LoginForm({ onSignedIn }: { onSignedIn: () => Promise }) { const [username, setUsername] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); setSubmitting(true); setError(null); try { await authApi.login(username, password); await onSignedIn(); } catch (err) { setError(err instanceof Error ? err.message : "Anmeldung fehlgeschlagen."); } finally { setSubmitting(false); } } return (

Leistungsbilanz

setUsername(event.target.value)} autoFocus autoComplete="username" required />
setPassword(event.target.value)} autoComplete="current-password" required />
{error &&

{error}

}
); } function ForcedPasswordChangeForm({ onChanged }: { onChanged: () => Promise }) { const [currentPassword, setCurrentPassword] = useState(""); const [newPassword, setNewPassword] = useState(""); const [newPasswordRepeat, setNewPasswordRepeat] = useState(""); const [error, setError] = useState(null); const [submitting, setSubmitting] = useState(false); async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (newPassword !== newPasswordRepeat) { setError("Die beiden neuen Passwörter stimmen nicht überein."); return; } setSubmitting(true); setError(null); try { await authApi.changePassword(currentPassword, newPassword); await onChanged(); } catch (err) { setError(err instanceof Error ? err.message : "Passwort konnte nicht geändert werden."); } finally { setSubmitting(false); } } return (

Neues Passwort setzen

Dieser Zugang wurde mit einem Startpasswort angelegt. Bitte vor der weiteren Nutzung ein eigenes Passwort vergeben.

setCurrentPassword(event.target.value)} autoComplete="current-password" autoFocus required />
setNewPassword(event.target.value)} autoComplete="new-password" minLength={8} required />
setNewPasswordRepeat(event.target.value)} autoComplete="new-password" minLength={8} required />
{error &&

{error}

}
); }