import { useEffect } from 'react'; import { Link } from 'react-router'; import { showErrorToast, showSuccessToast } from '../components/toast/toast'; import { confirmEmail, requireAuth } from '../lib/auth.server'; import type { Route } from './+types/confirm'; export function meta({}: Route.MetaArgs) { return [{ title: 'Confirm Email | The Biergarten App' }]; } export async function loader({ request }: Route.LoaderArgs) { const auth = await requireAuth(request); const url = new URL(request.url); const token = url.searchParams.get('token'); if (!token) { return { success: false as const, error: 'Missing confirmation token.' }; } try { const payload = await confirmEmail(token, auth.accessToken); return { success: true as const, confirmedDate: payload.confirmedDate, }; } catch (err) { return { success: false as const, error: err instanceof Error ? err.message : 'Confirmation failed.', }; } } export default function Confirm({ loaderData }: Route.ComponentProps) { useEffect(() => { if (loaderData.success) { showSuccessToast('Email confirmed successfully.'); return; } showErrorToast(loaderData.error); }, [loaderData]); return (
Your email address has been successfully verified.
{new Date(loaderData.confirmedDate).toLocaleString()}
The confirmation link may have expired (valid for 30 minutes) or already been used.