diff --git a/client/src/app/settings/page.tsx b/client/src/app/settings/page.tsx new file mode 100644 index 0000000..220e540 --- /dev/null +++ b/client/src/app/settings/page.tsx @@ -0,0 +1,119 @@ +"use client"; + +import type { FormEvent } from "react"; +import { useRouter } from "next/navigation"; +import { SessionContext } from "@/context/session"; +import { useContext, useState } from "react"; +import { updateUser } from "@/lib/auth"; + +export default function Settings() { + const session = useContext(SessionContext); + const router = useRouter(); + + const [buttonLoading, setButtonLoading] = useState(false); + const [serverMessage, setServerMessage] = useState(null); + + if (!session || session.user === undefined) { + return ( +
+
Loading user...
+
+ ); + } + + if (session.user === null) { + router.replace("/"); + return; + } + + async function updateAccount(e: FormEvent) { + e.preventDefault(); + const target = e.target as HTMLFormElement; + const updateUsername = target.elements.namedItem("updateUsername") as HTMLInputElement; + const updateEmail = target.elements.namedItem("updateEmail") as HTMLInputElement; + const updatePassword = target.elements.namedItem("updatePassword") as HTMLInputElement; + + const newName = + !updateUsername.value || updateUsername.value === session?.user?.name + ? undefined + : updateUsername.value; + const newEmail = + !updateEmail.value || updateEmail.value === session?.user?.email + ? undefined + : updateEmail.value; + + if (!newName && !newEmail && !updatePassword.value) return; + + setButtonLoading(true); + const user = await updateUser(newName, newEmail, 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); + } + return ( +
+

Account settings

+ +
+ + + + + + + {serverMessage && ( +
+ {serverMessage} +
+ )} +
+ +
+
+
+ ); +} diff --git a/client/src/components/auth/AuthModal.tsx b/client/src/components/auth/AuthModal.tsx index 41289bc..b2df1ee 100644 --- a/client/src/components/auth/AuthModal.tsx +++ b/client/src/components/auth/AuthModal.tsx @@ -1,7 +1,7 @@ "use client"; import { SessionContext } from "@/context/session"; -import { login, logout, register, setGuestSession, updateUser } from "@/lib/auth"; +import { login, logout, register, setGuestSession } from "@/lib/auth"; import type { FormEvent } from "react"; import { useContext, useEffect, useRef, useState } from "react"; @@ -20,40 +20,11 @@ export default function AuthModal() { if (serverMessage) { setServerMessage(null); } + setActiveTab("login"); 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(); @@ -143,44 +114,6 @@ export default function AuthModal() { -
- - - - - {serverMessage && ( -
- {serverMessage} -
- )} -
- -
-
-