From dac9446b31e7a97955658f0846822ffcea6299aa Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Sun, 1 Feb 2026 16:21:55 -0700 Subject: [PATCH] Add forgot username & password pages, and also check if the user is already logged in --- src/app/account/forgot-password/page.tsx | 113 ++++++++++++++ src/app/account/forgot-username/page.tsx | 113 ++++++++++++++ src/app/account/reset-password/page.tsx | 190 +++++++++++++---------- 3 files changed, 330 insertions(+), 86 deletions(-) create mode 100644 src/app/account/forgot-password/page.tsx create mode 100644 src/app/account/forgot-username/page.tsx diff --git a/src/app/account/forgot-password/page.tsx b/src/app/account/forgot-password/page.tsx new file mode 100644 index 0000000..ca9b553 --- /dev/null +++ b/src/app/account/forgot-password/page.tsx @@ -0,0 +1,113 @@ +'use client' + +import { Turnstile } from '@marsidev/react-turnstile' +import { DiscordButton } from '../../components/DiscordButton' +import axios from 'axios' +import { useEffect, useState } from 'react' +import { BackButton } from '@/app/components/BackButton' +import { getCookie } from '@/util/cookie' +import { useRouter } from 'next/navigation' + +export default function AccountForgotPasswordPage () { + const [loading, setLoading] = useState(true) + const router = useRouter() + + const [token, setToken] = useState(null) + const [result, setResult] = useState(-1) + + const [email, setEmail] = useState('') + + useEffect(() => { + document.title = 'Lncvrt Games - Forgot Account Password' + + const token = getCookie('accountToken', '-1') + if (token !== '-1') { + router.push('/account') + } else setLoading(false) + }, []) + + return ( +
+ + +

+ {loading + ? 'Loading...' + : result == -1 + ? 'Verify you are human to send a reset password email' + : 'Lncvrt Games Forgot Password'} +

+ {!loading && ( + <> + {result == -1 ? ( + { + setToken(token) + setResult(0) + }} + onError={() => setResult(1)} + className='flex justify-center' + /> + ) : result == 0 ? ( +
{ + e.preventDefault() + + try { + const result = await axios.post( + '/api/account/forgot-password', + { + token, + email: email + } + ) + if (result.data.success) { + setResult(2) + } else { + alert( + 'Failed to request email, error: ' + + (result.data.message || 'n/a') + ) + } + } catch (e: any) { + if (e.response) { + alert( + 'Failed to request email, error: ' + + (e.response.data?.message || + JSON.stringify(e.response.data)) + ) + } else if (e.request) { + alert('Failed to request email, no response from server.') + } else { + alert('Failed to request email, error: ' + e.message) + } + } + }} + > + setEmail(e.target.value)} + required + /> + +
+ ) : ( + (result == 1 || result == 2) && ( +

+ {result == 1 + ? 'Unable to verify captcha, please reload page.' + : 'An email has been sent. Please check your inbox.'} +

+ ) + )} + + )} +
+ ) +} diff --git a/src/app/account/forgot-username/page.tsx b/src/app/account/forgot-username/page.tsx new file mode 100644 index 0000000..6986fb5 --- /dev/null +++ b/src/app/account/forgot-username/page.tsx @@ -0,0 +1,113 @@ +'use client' + +import { Turnstile } from '@marsidev/react-turnstile' +import { DiscordButton } from '../../components/DiscordButton' +import axios from 'axios' +import { useEffect, useState } from 'react' +import { BackButton } from '@/app/components/BackButton' +import { getCookie } from '@/util/cookie' +import { useRouter } from 'next/navigation' + +export default function AccountForgotUsernamePage () { + const [loading, setLoading] = useState(true) + const router = useRouter() + + const [token, setToken] = useState(null) + const [result, setResult] = useState(-1) + + const [email, setEmail] = useState('') + + useEffect(() => { + document.title = 'Lncvrt Games - Forgot Account Username' + + const token = getCookie('accountToken', '-1') + if (token !== '-1') { + router.push('/account') + } else setLoading(false) + }, []) + + return ( +
+ + +

+ {loading + ? 'Loading...' + : result == -1 + ? 'Verify you are human to send a email with your username' + : 'Lncvrt Games Forgot Username'} +

+ {!loading && ( + <> + {result == -1 ? ( + { + setToken(token) + setResult(0) + }} + onError={() => setResult(1)} + className='flex justify-center' + /> + ) : result == 0 ? ( +
{ + e.preventDefault() + + try { + const result = await axios.post( + '/api/account/forgot-username', + { + token, + email: email + } + ) + if (result.data.success) { + setResult(2) + } else { + alert( + 'Failed to request email, error: ' + + (result.data.message || 'n/a') + ) + } + } catch (e: any) { + if (e.response) { + alert( + 'Failed to request email, error: ' + + (e.response.data?.message || + JSON.stringify(e.response.data)) + ) + } else if (e.request) { + alert('Failed to request email, no response from server.') + } else { + alert('Failed to request email, error: ' + e.message) + } + } + }} + > + setEmail(e.target.value)} + required + /> + +
+ ) : ( + (result == 1 || result == 2) && ( +

+ {result == 1 + ? 'Unable to verify captcha, please reload page.' + : 'An email has been sent. Please check your inbox.'} +

+ ) + )} + + )} +
+ ) +} diff --git a/src/app/account/reset-password/page.tsx b/src/app/account/reset-password/page.tsx index 85b9883..3a4c835 100644 --- a/src/app/account/reset-password/page.tsx +++ b/src/app/account/reset-password/page.tsx @@ -5,9 +5,13 @@ import { DiscordButton } from '../../components/DiscordButton' import { HomeButton } from '../../components/HomeButton' import axios from 'axios' import { Suspense, useEffect, useState } from 'react' -import { useSearchParams } from 'next/navigation' +import { useRouter, useSearchParams } from 'next/navigation' +import { getCookie } from '@/util/cookie' function ResetPasswordForm ({ codeParam }: { codeParam: string }) { + const [loading, setLoading] = useState(true) + const router = useRouter() + const [token, setToken] = useState(null) const [result, setResult] = useState(-1) @@ -16,102 +20,116 @@ function ResetPasswordForm ({ codeParam }: { codeParam: string }) { useEffect(() => { document.title = 'Lncvrt Games - Reset Account Password' + + const token = getCookie('accountToken', '-1') + if (token !== '-1') { + router.push('/account') + } else setLoading(false) }, []) return (
-

- {result == -1 +

+ {loading + ? 'Loading...' + : result == -1 ? 'Verify you are human to reset your password' : 'Lncvrt Games password reset'}

- {result == -1 ? ( - { - setToken(token) - setResult(0) - }} - onError={() => setResult(1)} - className='flex justify-center' - /> - ) : result == 0 ? ( -
{ - e.preventDefault() + {!loading && ( + <> + {result == -1 ? ( + { + setToken(token) + setResult(0) + }} + onError={() => setResult(1)} + className='flex justify-center' + /> + ) : result == 0 ? ( + { + e.preventDefault() - if (newPassword !== retypeNewPassword) { - alert('Passwords must match') - return - } + if (newPassword !== retypeNewPassword) { + alert('Passwords must match') + return + } - try { - const result = await axios.post('/api/account/reset-password', { - token, - code: codeParam, - password: newPassword - }) - if (result.data.success) { - setResult(2) - } else { - alert( - 'Failed to reset password, error: ' + - (result.data.message || 'n/a') - ) - } - } catch (e: any) { - if (e.response) { - alert( - 'Failed to reset password, error: ' + - (e.response.data?.message || - JSON.stringify(e.response.data)) - ) - } else if (e.request) { - alert('Failed to reset password, no response from server.') - } else { - alert('Failed to reset password, error: ' + e.message) - } - } - }} - > - setNewPassword(e.target.value)} - required - /> - setRetypeNewPassword(e.target.value)} - required - /> - - - ) : ( - (result == 1 || result == 2) && ( -

- {result == 1 - ? 'Unable to verify captcha, please reload page.' - : 'Password reset sucessfully'} -

- ) - )} - {result == 2 && ( -
- -
+ try { + const result = await axios.post( + '/api/account/reset-password', + { + token, + code: codeParam, + password: newPassword + } + ) + if (result.data.success) { + setResult(2) + } else { + alert( + 'Failed to reset password, error: ' + + (result.data.message || 'n/a') + ) + } + } catch (e: any) { + if (e.response) { + alert( + 'Failed to reset password, error: ' + + (e.response.data?.message || + JSON.stringify(e.response.data)) + ) + } else if (e.request) { + alert('Failed to reset password, no response from server.') + } else { + alert('Failed to reset password, error: ' + e.message) + } + } + }} + > + setNewPassword(e.target.value)} + required + /> + setRetypeNewPassword(e.target.value)} + required + /> + + + ) : ( + (result == 1 || result == 2) && ( +

+ {result == 1 + ? 'Unable to verify captcha, please reload page.' + : 'Password reset sucessfully'} +

+ ) + )} + {result == 2 && ( +
+ +
+ )} + )}
)