"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { createClient } from "@/lib/supabase/client"; import { formatMessage } from "@/lib/i18n/shared"; import { useDict } from "@/components/i18n/LocaleProvider"; import LanguageSwitcher from "@/components/i18n/LanguageSwitcher"; import type { Dict } from "@/lib/i18n/shared"; function authErrorMessage(dict: Dict, message: string): string { if (/invalid login credentials/i.test(message)) return dict.login.errorInvalidCredentials; if (/email not confirmed/i.test(message)) return dict.login.errorEmailNotConfirmed; if (/cancelled|aborted|NotAllowedError/i.test(message)) return dict.login.errorPasskeyCancelled; return formatMessage(dict.login.errorGeneric, { message }); } export default function LoginPage() { const router = useRouter(); const supabase = createClient(); const dict = useDict(); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); async function redirectByRole(userId: string) { const { data: profile } = await supabase .from("profiles") .select("role") .eq("id", userId) .single(); router.replace(profile?.role === "admin" ? "/admin" : "/intern"); router.refresh(); } async function signInWithPassword(e: React.FormEvent) { e.preventDefault(); setError(null); setBusy(true); const { data, error } = await supabase.auth.signInWithPassword({ email, password, }); if (error || !data.user) { setError(authErrorMessage(dict, error?.message ?? "Unbekannter Fehler")); setBusy(false); return; } const { data: profile } = await supabase .from("profiles") .select("role, password_auth_enabled") .eq("id", data.user.id) .single(); if (profile?.password_auth_enabled === false) { await supabase.auth.signOut(); setError(dict.login.errorPasswordDisabled); setBusy(false); return; } router.replace(profile?.role === "admin" ? "/admin" : "/intern"); router.refresh(); } async function signInWithPasskey() { setError(null); setBusy(true); try { const { data, error } = await supabase.auth.signInWithPasskey(); if (error || !data?.user) { setError( authErrorMessage(dict, error?.message ?? "Passkey-Anmeldung fehlgeschlagen") ); setBusy(false); return; } await redirectByRole(data.user.id); } catch (err) { setError(authErrorMessage(dict, err instanceof Error ? err.message : String(err))); setBusy(false); } } return (

{dict.login.title}

setEmail(e.target.value)} autoComplete="username webauthn" required />
setPassword(e.target.value)} autoComplete="current-password" required />
{error &&

{error}

}
{dict.login.or}

{dict.login.backToMenu}

); }