"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import Link from "next/link"; import { createClient } from "@/lib/supabase/client"; function germanAuthError(message: string): string { if (/invalid login credentials/i.test(message)) return "E-Mail-Adresse oder Passwort ist falsch."; if (/email not confirmed/i.test(message)) return "Die E-Mail-Adresse wurde noch nicht bestätigt."; if (/cancelled|aborted|NotAllowedError/i.test(message)) return "Passkey-Anmeldung wurde abgebrochen."; return `Anmeldung fehlgeschlagen: ${message}`; } export default function LoginPage() { const router = useRouter(); const supabase = createClient(); 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(germanAuthError(error?.message ?? "Unbekannter Fehler")); setBusy(false); return; } await redirectByRole(data.user.id); } async function signInWithPasskey() { setError(null); setBusy(true); try { const { data, error } = await supabase.auth.signInWithPasskey(); if (error || !data?.user) { setError( germanAuthError(error?.message ?? "Passkey-Anmeldung fehlgeschlagen") ); setBusy(false); return; } await redirectByRole(data.user.id); } catch (err) { setError(germanAuthError(err instanceof Error ? err.message : String(err))); setBusy(false); } } return (

Anmeldung

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

{error}

}
oder

← Zur Speisekarte

); }