import UserContext from '@/contexts/UserContext'; import createErrorToast from '@/util/createErrorToast'; import APIResponseValidationSchema from '@/validation/APIResponseValidationSchema'; import Head from 'next/head'; import { useRouter } from 'next/router'; import { FC, useContext, useState } from 'react'; import { toast } from 'react-hot-toast'; import useSWR from 'swr'; const useSendConfirmUserRequest = () => { const router = useRouter(); const token = router.query.token as string | undefined; const { data, error } = useSWR(`/api/users/confirm?token=${token}`, async (url) => { if (!token) { throw new Error('Token must be provided.'); } const response = await fetch(url); if (!response.ok) { throw new Error(response.statusText); } const json = await response.json(); const parsed = APIResponseValidationSchema.safeParse(json); if (!parsed.success) { throw new Error('API response validation failed.'); } return parsed.data; }); return { data, error: error as unknown }; }; const ConfirmUserPage: FC = () => { const router = useRouter(); const { error, data } = useSendConfirmUserRequest(); const { user } = useContext(UserContext); const needsToLogin = error instanceof Error && error.message === 'Unauthorized' && !user; const tokenExpired = error instanceof Error && error.message === 'Unauthorized' && user; const [confirmationResent, setConfirmationResent] = useState(false); if (user?.accountIsVerified) { router.push('/users/current'); return null; } if (data) { router.push('/users/current'); return null; } if (needsToLogin) { return ( <>
Please login to confirm your account.
Your confirmation token is expired.
> ) : ( <>Resent your confirmation link.
Please check your email.
> )}