import { useEffect, useMemo, useState } from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { refreshAuthToken, setAuthToken } from "../lib/auth-client"; type VerifyState = "verifying" | "success" | "error"; export function AuthVerifyPage() { const location = useLocation(); const navigate = useNavigate(); const params = useMemo(() => new URLSearchParams(location.search), [location.search]); const token = params.get("token"); const urlError = params.get("error"); const [state, setState] = useState(urlError ? "error" : "verifying"); const [error, setError] = useState(urlError); useEffect(() => { if (urlError) { setError(urlError); setState("error"); return; } if (!token) { setError("Missing verification token"); setState("error"); return; } verifyEmail(token) .then(async () => { setState("success"); const refreshed = await refreshAuthToken(); window.setTimeout(() => { navigate(refreshed ? "/" : "/auth", { replace: true }); }, 900); }) .catch((err) => { setError(err instanceof Error ? err.message : "Email verification failed"); setState("error"); }); }, [navigate, token, urlError]); const failed = state === "error"; return (

VTIT Agent Coding

{state === "verifying" && "Verifying your email"} {state === "success" && "Email verified"} {failed && "Email verification failed"}

{failed ? (

{verificationErrorMessage(error)}

) : state === "success" ? (

Your email is verified. Signing you in...

) : (

Checking your verification link...

)}
{failed && ( Back to sign in )}
); } async function verifyEmail(token: string): Promise { const res = await fetch(`/api/auth/verify-email?token=${encodeURIComponent(token)}`, { credentials: "include", redirect: "manual", }); const authToken = res.headers.get("set-auth-token"); if (authToken) setAuthToken(authToken); if (res.status >= 200 && res.status < 400) return; const body = (await res.json().catch(() => null)) as { code?: string; message?: string } | null; throw new Error(body?.message || body?.code || "Email verification failed"); } function verificationErrorMessage(error: string | null): string { if (error === "TOKEN_EXPIRED") return "The verification link has expired. Return to sign in and request a new link."; if (error === "INVALID_TOKEN") return "The verification link is invalid. Return to sign in and request a new link."; return error || "The verification link could not be verified. Return to sign in and request a new link."; }