"use client"; import { SessionContext } from "@/context/session"; import { login, logout, register, setGuestSession } from "@/lib/auth"; import type { FormEvent } from "react"; import { useContext, useEffect, useRef, useState } from "react"; import Link from "next/link"; import Guest from "./Guest"; import Login from "./Login"; import Register from "./Register"; import { IconSettings2, IconUserCircle } from "@tabler/icons-react"; export default function AuthModal() { const session = useContext(SessionContext); const [activeTab, setActiveTab] = useState<"guest" | "login" | "register">("guest"); const [serverMessage, setServerMessage] = useState(null); const [buttonLoading, setButtonLoading] = useState(false); const modalToggleRef = useRef(null); async function clickLogout() { if (serverMessage) { setServerMessage(null); } setActiveTab("login"); await logout(); session?.setUser(null); } async function submitAuth(e: FormEvent) { e.preventDefault(); const target = e.target as HTMLFormElement; if (activeTab === "guest") { const guestName = target.elements.namedItem("guestName") as HTMLInputElement; if (!guestName || !guestName.value) return; setButtonLoading(true); const user = await setGuestSession(guestName.value); if (user) { session?.setUser(user); if (modalToggleRef.current?.checked) { modalToggleRef.current.checked = false; } } 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; setButtonLoading(true); const user = await login(loginName.value, loginPassword.value); if (typeof user === "string") { setServerMessage(user); } else if (user?.id) { session?.setUser(user); if (serverMessage) { setServerMessage(null); } if (modalToggleRef.current?.checked) { modalToggleRef.current.checked = false; } } } 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; } setButtonLoading(true); const user = await register( registerName.value, registerPassword.value, registerEmail.value || undefined ); if (typeof user === "string") { setServerMessage(user); } else if (user?.id) { session?.setUser(user); if (serverMessage) { setServerMessage(null); } if (modalToggleRef.current?.checked) { modalToggleRef.current.checked = false; } } } setButtonLoading(false); } useEffect(() => { setServerMessage(null); }, [activeTab]); return ( <> ); }