From f564298c939f361cc9ab21268c2351a6b6d9096a Mon Sep 17 00:00:00 2001 From: Nathaniel Tampus Date: Sun, 19 Mar 2023 20:53:59 +0800 Subject: [PATCH] login and register tabs, initial user dashboard --- client/src/components/auth/AuthModal.tsx | 261 ++++++++++++++++++----- client/src/components/auth/Guest.tsx | 26 +++ client/src/components/auth/Login.tsx | 35 +++ client/src/components/auth/Register.tsx | 46 ++++ client/src/components/game/GamePage.tsx | 4 +- 5 files changed, 320 insertions(+), 52 deletions(-) create mode 100644 client/src/components/auth/Guest.tsx create mode 100644 client/src/components/auth/Login.tsx create mode 100644 client/src/components/auth/Register.tsx diff --git a/client/src/components/auth/AuthModal.tsx b/client/src/components/auth/AuthModal.tsx index a164caa..f92c3a6 100644 --- a/client/src/components/auth/AuthModal.tsx +++ b/client/src/components/auth/AuthModal.tsx @@ -1,36 +1,128 @@ "use client"; -import type { FormEvent } from "react"; -import { useRef, useState, useContext } from "react"; import { SessionContext } from "@/context/session"; -import { setGuestSession } from "@/lib/auth"; +import { login, logout, register, setGuestSession, updateUser } from "@/lib/auth"; +import type { FormEvent } from "react"; +import { useContext, useEffect, useRef, useState } from "react"; -// TODO: add login and register views +import Guest from "./Guest"; +import Login from "./Login"; +import Register from "./Register"; 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 updateGuestName(e: FormEvent) { + async function clickLogout() { + if (serverMessage) { + setServerMessage(null); + } + await logout(); + session?.setUser(null); + } + + async function updateAccount(e: FormEvent) { + e.preventDefault(); + const target = e.target as HTMLFormElement; + const updateEmail = target.elements.namedItem("updateEmail") as HTMLInputElement; + const updatePassword = target.elements.namedItem("updatePassword") as HTMLInputElement; + if ( + !updateEmail || + !updatePassword || + ((!updateEmail.value || updateEmail.value === session?.user?.email) && !updatePassword.value) + ) + return; + + setButtonLoading(true); + const user = await updateUser( + updateEmail.value || undefined, + updatePassword.value || undefined + ); + if (typeof user === "string") { + setServerMessage(user); + } else if (user?.id) { + session?.setUser(user); + setServerMessage("Account updated successfully"); + setTimeout(() => { + setServerMessage(null); + }, 5000); + } + updatePassword.value = ""; + setButtonLoading(false); + } + + async function submitAuth(e: FormEvent) { e.preventDefault(); const target = e.target as HTMLFormElement; - const guestName = target.elements.namedItem("guestName") as HTMLInputElement; - if (!guestName || !guestName.value) return; + 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; + 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; + } } } - guestName.value = ""; setButtonLoading(false); } + useEffect(() => { + setServerMessage(null); + }, [activeTab]); + return ( <> @@ -39,47 +131,116 @@ export default function AuthModal() { htmlFor="auth-modal" className={"modal" + (session?.user === null ? " modal-open" : "")} > -