// app/beta/confirm/page.tsx "use client"; import { useEffect, useRef, useState, Suspense } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { useAuth } from "@/context/AuthContext"; const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? ""; function BetaConfirmPageContent() { const params = useSearchParams(); const token = params.get("token"); const router = useRouter(); const { setSession } = useAuth(); const ran = useRef(false); const [message, setMessage] = useState("Confirming your email…"); const [status, setStatus] = useState<"loading" | "success" | "error">( "loading" ); useEffect(() => { if (!token) { setStatus("error"); setMessage("Missing token."); return; } if (ran.current) return; ran.current = true; (async () => { try { const res = await fetch(`${API_BASE_URL}/api/auth/beta/confirm`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token }), }); if (!res.ok) { const text = await res.text().catch(() => ""); throw new Error(text || "Confirm link invalid/expired"); } const data = await res.json(); const jwt = data.token ?? data.accessToken; if (!jwt) throw new Error("No token returned from server"); const uuid = data.uuid ?? data.user?.uuid; if (!uuid) throw new Error("No uuid returned from server"); const email = data.email ?? data.user?.email; if (!email) throw new Error("No email returned from server"); setSession(jwt, { uuid, email, displayName: data.displayName ?? data.user?.displayName ?? null, role: data.role ?? data.user?.role ?? "USER", }); setStatus("success"); setMessage("Confirmed. Signing you in…"); router.replace("/account?welcome=1"); } catch (e: any) { setStatus("error"); setMessage( e?.message || "That link is invalid or expired. Please request a new one." ); } })(); }, [token, router, setSession]); return ( Battl Builders {message} {status === "error" && ( Go back and request a fresh sign-in link. )} ); } export default function BetaConfirmPage() { return ( Battl Builders Loading… }> ); }
{message}
Go back and request a fresh sign-in link.
Loading…