From ae63c449fad9010289ea41357031f8bcd14484d2 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Fri, 30 Jan 2026 18:46:54 -0700 Subject: [PATCH] Add a way to login to your account on the website --- src/app/account/login/page.tsx | 92 +++++++++++++++++++++++ src/app/account/page.tsx | 18 +++++ src/app/account/reset-password/page.tsx | 1 - src/app/account/reset-password/styles.css | 5 -- src/app/globals.css | 4 + src/util/cookie.ts | 16 ++++ 6 files changed, 130 insertions(+), 6 deletions(-) create mode 100644 src/app/account/login/page.tsx create mode 100644 src/app/account/page.tsx delete mode 100644 src/app/account/reset-password/styles.css create mode 100644 src/util/cookie.ts diff --git a/src/app/account/login/page.tsx b/src/app/account/login/page.tsx new file mode 100644 index 0000000..cb5fb6e --- /dev/null +++ b/src/app/account/login/page.tsx @@ -0,0 +1,92 @@ +'use client' + +import { useRouter } from 'next/navigation' +import { getCookie, setCookie } from '@/util/cookie' +import { useEffect, useState } from 'react' +import { HomeButton } from '@/app/components/HomeButton' +import { DiscordButton } from '@/app/components/DiscordButton' +import axios from 'axios' + +export default function AccountLoginPage () { + const [loading, setLoading] = useState(true) + const router = useRouter() + + useEffect(() => { + const token = getCookie('accountToken', '-1') + if (token !== '-1') { + router.push('/account') + } else setLoading(false) + }, [router]) + + return ( +
+ + +

+ {loading ? 'Loading...' : 'Lncvrt Games Login'} +

+ {!loading && ( +
{ + e.preventDefault() + + const form = e.currentTarget + const formData = new FormData(form) + const username = formData.get('username') as string + const password = formData.get('password') as string + + try { + const result = await axios.post('/api/account/login', { + username, + password + }) + if (result.data.success) { + if (result.data.data.session) + setCookie('accountToken', result.data.data.session) + if (result.data.data.username) + setCookie('accountUsername', result.data.data.username) + if (result.data.data.id) + setCookie('accountId', result.data.data.id) + + router.push('/account') + } else { + alert( + 'Failed to login, error: ' + (result.data.message || 'n/a') + ) + } + } catch (e: any) { + if (e.response) { + alert( + 'Failed to login, error: ' + + (e.response.data?.message || + JSON.stringify(e.response.data)) + ) + } else if (e.request) { + alert('Failed to login, no response from server.') + } else { + alert('Failed to login, error: ' + e.message) + } + } + }} + > + + + +
+ )} +
+ ) +} diff --git a/src/app/account/page.tsx b/src/app/account/page.tsx new file mode 100644 index 0000000..f922196 --- /dev/null +++ b/src/app/account/page.tsx @@ -0,0 +1,18 @@ +'use client' + +import { HomeButton } from '@/app/components/HomeButton' +import { DiscordButton } from '@/app/components/DiscordButton' +import { getCookie } from '@/util/cookie' + +export default function AccountLoginPage () { + return ( +
+ + +

+ Nothing on this page yet! You are logged in as{' '} + {getCookie('accountUsername', 'N/A')}. +

+
+ ) +} diff --git a/src/app/account/reset-password/page.tsx b/src/app/account/reset-password/page.tsx index fd3374b..cb7551a 100644 --- a/src/app/account/reset-password/page.tsx +++ b/src/app/account/reset-password/page.tsx @@ -1,6 +1,5 @@ 'use client' -import './styles.css' import { Turnstile } from '@marsidev/react-turnstile' import { DiscordButton } from '../../components/DiscordButton' import { HomeButton } from '../../components/HomeButton' diff --git a/src/app/account/reset-password/styles.css b/src/app/account/reset-password/styles.css deleted file mode 100644 index 381eb3f..0000000 --- a/src/app/account/reset-password/styles.css +++ /dev/null @@ -1,5 +0,0 @@ -@import "tailwindcss"; - -input { - @apply bg-[rgb(72,72,96)] focus:bg-[rgb(96,96,120)] border border-[rgb(96,96,120)] focus:border-[rgb(120,120,144)] rounded-lg px-4 py-2 inline-block transition-all duration-200 cursor-pointer focus:cursor-text; -} diff --git a/src/app/globals.css b/src/app/globals.css index 41eed6e..05f057b 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -64,3 +64,7 @@ select { p a { @apply text-white underline; } + +input { + @apply bg-[rgb(72,72,96)] focus:bg-[rgb(96,96,120)] border border-[rgb(96,96,120)] focus:border-[rgb(120,120,144)] rounded-lg px-4 py-2 inline-block transition-all duration-200 cursor-pointer focus:cursor-text; +} diff --git a/src/util/cookie.ts b/src/util/cookie.ts new file mode 100644 index 0000000..480c5d3 --- /dev/null +++ b/src/util/cookie.ts @@ -0,0 +1,16 @@ +export function setCookie (name: string, value: string): void { + const maxAge = 60 * 60 * 24 * 90 + const cookie = `${encodeURIComponent(name)}=${encodeURIComponent( + value + )}; Path=/; Max-Age=${maxAge}; Secure; SameSite=Strict` + document.cookie = cookie +} + +export function getCookie (name: string, defaultValue: string): string { + const cookies = document.cookie.split('; ') + for (const c of cookies) { + const [k, v] = c.split('=') + if (decodeURIComponent(k) === name) return decodeURIComponent(v) + } + return defaultValue +}