"use client"; import { useMutation, useQuery } from "@tanstack/react-query"; import { Minus, Plus } from "lucide-react"; import { useParams } from "next/navigation"; import { useState } from "react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Progress } from "@/components/ui/progress"; import { Spinner } from "@/components/ui/spinner"; import { stripeApiService } from "@/lib/apis/stripe-api.service"; import { AppError } from "@/lib/error"; import { cn } from "@/lib/utils"; const TOKEN_PACK_SIZE = 1_000_000; const PRICE_PER_PACK_USD = 1; const PRESET_MULTIPLIERS = [1, 2, 5, 10, 25, 50] as const; export function BuyTokensContent() { const params = useParams(); const searchSpaceId = Number(params?.search_space_id); const [quantity, setQuantity] = useState(1); const { data: tokenStatus } = useQuery({ queryKey: ["token-status"], queryFn: () => stripeApiService.getTokenStatus(), }); const purchaseMutation = useMutation({ mutationFn: stripeApiService.createTokenCheckoutSession, onSuccess: (response) => { window.location.assign(response.checkout_url); }, onError: (error) => { if (error instanceof AppError && error.message) { toast.error(error.message); return; } toast.error("Failed to start checkout. Please try again."); }, }); const totalTokens = quantity * TOKEN_PACK_SIZE; const totalPrice = quantity * PRICE_PER_PACK_USD; if (tokenStatus && !tokenStatus.token_buying_enabled) { return (

Buy Premium Tokens

Token purchases are temporarily unavailable.

); } const usagePercentage = tokenStatus ? Math.min( (tokenStatus.premium_tokens_used / Math.max(tokenStatus.premium_tokens_limit, 1)) * 100, 100 ) : 0; return (

Buy Premium Tokens

$1 per 1M tokens, pay as you go

{tokenStatus && (
{tokenStatus.premium_tokens_used.toLocaleString()} /{" "} {tokenStatus.premium_tokens_limit.toLocaleString()} premium tokens {usagePercentage.toFixed(0)}%

{tokenStatus.premium_tokens_remaining.toLocaleString()} tokens remaining

)}
{(totalTokens / 1_000_000).toFixed(0)}M tokens
{PRESET_MULTIPLIERS.map((m) => ( ))}
{(totalTokens / 1_000_000).toFixed(0)}M premium tokens ${totalPrice}

Secure checkout via Stripe

); }