"use client"; import { useQueryClient } from "@tanstack/react-query"; import { CheckCircle2, Loader2, XCircle } from "lucide-react"; import Link from "next/link"; import { useSearchParams } from "next/navigation"; import { Suspense, useEffect, useRef, useState } from "react"; import { toast } from "sonner"; import { USER_QUERY_KEY } from "@/atoms/user/user-query.atoms"; import { authenticatedFetch } from "@/lib/auth-utils"; import { BACKEND_URL } from "@/lib/env-config"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/components/ui/card"; type VerifyState = "loading" | "verified" | "failed"; function SubscriptionSuccessContent() { const queryClient = useQueryClient(); const searchParams = useSearchParams(); const sessionId = searchParams.get("session_id"); const [state, setState] = useState("loading"); const hasVerified = useRef(false); useEffect(() => { if (hasVerified.current) return; hasVerified.current = true; if (!sessionId) { setState("failed"); return; } (async () => { try { const res = await authenticatedFetch( `${BACKEND_URL}/api/v1/stripe/verify-checkout-session?session_id=${encodeURIComponent(sessionId)}` ); if (!res.ok) { setState("failed"); return; } const data = await res.json(); if (data.verified) { setState("verified"); toast.success("Subscription activated! Welcome to Pro."); void queryClient.invalidateQueries({ queryKey: USER_QUERY_KEY }); } else { setState("failed"); } } catch { setState("failed"); } })(); }, [sessionId, queryClient]); if (state === "loading") { return (
Verifying payment…
); } if (state === "failed") { return (
Verification failed We couldn't verify your payment. If you were charged, your subscription will activate shortly.
); } return (
Subscription activated! Your Pro plan is now active. Enjoy unlimited power.

Your account has been upgraded. All Pro features are now available.

); } export default function SubscriptionSuccessPage() { return ( ); }