"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { LogIn } from "lucide-react"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { AuthProvider, useAuth } from "@/components/auth"; import { BrandLogo } from "@/components/brand/brand-logo"; import { login, User } from "@/lib/api"; const schema = z.object({ email: z.string().email("Bitte gib eine gueltige E-Mail-Adresse ein."), password: z.string().min(1, "Bitte gib dein Passwort ein.") }); type LoginForm = z.infer; type LoginError = { status: number; message: string }; function mapLoginError(error: unknown): LoginError { const status = typeof error === "object" && error && "status" in error ? Number((error as { status?: number }).status) : 0; switch (status) { case 401: return { status, message: "E-Mail-Adresse oder Passwort ist falsch." }; case 403: return { status, message: "Dieses Benutzerkonto ist deaktiviert." }; case 422: return { status, message: "Bitte pruefe deine Eingaben." }; case 500: case 502: return { status, message: "Der Anmeldedienst ist momentan nicht erreichbar." }; default: return { status, message: "Anmeldung fehlgeschlagen. Bitte erneut versuchen." }; } } function LoginPanel() { const auth = useAuth(); const [loading, setLoading] = useState(false); const [toast, setToast] = useState(""); const [success, setSuccess] = useState(""); const form = useForm({ resolver: zodResolver(schema), defaultValues: { email: "admin@schubamed.de", password: "" }, mode: "onSubmit" }); useEffect(() => { if (!toast) return; const timeout = window.setTimeout(() => setToast(""), 5000); return () => window.clearTimeout(timeout); }, [toast]); async function handleSubmit(values: LoginForm) { setLoading(true); setToast(""); setSuccess(""); try { const result = await login(values.email, values.password); const currentUser = (await auth.refreshUser()) ?? (result.user as User); auth.setUser(currentUser); auth.setToken("authenticated"); const target = currentUser.must_change_password ? "/profile/security" : "/dashboard"; setSuccess("Anmeldung erfolgreich"); window.location.replace(target); } catch (error) { const mapped = mapLoginError(error); if (process.env.NODE_ENV !== "production") { console.error("Login failed", error); console.error("Login failed mapped", mapped.status, mapped.message); } setToast(mapped.message); } finally { setLoading(false); } } return (

Anmelden

Sicherer Zugriff auf Atlas Workspace.

{ event.preventDefault(); void form.handleSubmit(handleSubmit)(event); }} className="space-y-5" noValidate > {toast &&
{toast}
} {success &&
{success}
}
); } export default function LoginPage() { return ( ); }