"use client"; import { SessionContext } from "@/context/session"; import { login, register, setGuestSession } from "@/lib/auth"; import type { FormEvent } from "react"; import { useContext, useEffect, useState } from "react"; import { API_URL } from "@/config"; import Guest from "./Guest"; import Login from "./Login"; import Register from "./Register"; export default function AuthDropdownContent({ onClose }: { onClose?: () => void }) { const session = useContext(SessionContext); const [activeTab, setActiveTab] = useState<"guest" | "login" | "register">("guest"); const [serverMessage, setServerMessage] = useState(null); const [buttonLoading, setButtonLoading] = useState(false); const [ssoEnabled, setSsoEnabled] = useState(false); useEffect(() => { fetch(`${API_URL}/v1/auth/sso/config`, { credentials: "include" }) .then((res) => res.json()) .then((data) => { if (data && data.enabled) { setSsoEnabled(true); } }) .catch((err) => console.error("Error loading SSO config:", err)); }, []); function closeDropdown() { if (onClose) { onClose(); } if (typeof document !== "undefined" && document.activeElement) { (document.activeElement as HTMLElement).blur(); } } async function submitAuth(e: FormEvent) { e.preventDefault(); const target = e.target as HTMLFormElement; setServerMessage(null); setButtonLoading(true); try { if (activeTab === "guest") { const guestName = target.elements.namedItem("guestName") as HTMLInputElement; if (!guestName || !guestName.value) return; const user = await setGuestSession(guestName.value); if (typeof user === "string") { setServerMessage(user); } else if (user?.id) { session?.setUser(user); closeDropdown(); guestName.value = ""; } } else if (activeTab === "login") { const loginName = target.elements.namedItem("loginName") as HTMLInputElement; const loginPassword = target.elements.namedItem("loginPassword") as HTMLInputElement; if (!loginName || !loginName.value || !loginPassword || !loginPassword.value) return; const user = await login(loginName.value, loginPassword.value); if (typeof user === "string") { setServerMessage(user); } else if (user?.id) { session?.setUser(user); closeDropdown(); } } else if (activeTab === "register") { const registerName = target.elements.namedItem("registerName") as HTMLInputElement; const registerEmail = target.elements.namedItem("registerEmail") as HTMLInputElement; const registerPassword = target.elements.namedItem("registerPassword") as HTMLInputElement; if (!registerName || !registerName.value || !registerPassword || !registerPassword.value) { return; } const user = await register( registerName.value, registerPassword.value, registerEmail.value || undefined ); if (typeof user === "string") { setServerMessage(user); } else if (user?.id) { session?.setUser(user); closeDropdown(); } } } finally { setButtonLoading(false); } } useEffect(() => { setServerMessage(null); }, [activeTab]); return (
{ setActiveTab("guest"); }} className={ "tab tab-bordered tab-border-2 flex-grow rounded-tl-lg cursor-pointer" + (activeTab === "guest" ? " tab-active text-base-content" : " text-base-content border-opacity-10 hover:border-opacity-30") } > Gast setActiveTab("login")} className={ "tab tab-bordered tab-border-2 flex-grow rounded-tl-lg cursor-pointer" + (activeTab === "login" ? " tab-active" : " text-base-content border-opacity-10 hover:border-opacity-30") } > Anmelden setActiveTab("register")} className={ "tab tab-bordered tab-border-2 flex-grow rounded-tl-lg cursor-pointer" + (activeTab === "register" ? " tab-active" : " text-base-content border-opacity-10 hover:border-opacity-30") } > Registrieren
{activeTab === "guest" && ( )} {activeTab === "login" && } {activeTab === "register" && } {serverMessage &&
{serverMessage}
}
{ssoEnabled && ( <>
oder
Anmelden mit Keycloak )}
); }