'use client' import Link from 'next/link' import { useState, useCallback, useEffect } from 'react' import { useRouter } from 'next/navigation' import { Button } from '@nextsparkjs/core/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@nextsparkjs/core/components/ui/card' import { Badge } from '@nextsparkjs/core/components/ui/badge' import { Separator } from '@nextsparkjs/core/components/ui/separator' import { CreditCard, Calendar, AlertCircle, Check, Crown } from 'lucide-react' import { sel } from '@nextsparkjs/core/selectors' import { useTranslations } from 'next-intl' import { getTemplateOrDefaultClient } from '@nextsparkjs/registries/template-registry.client' import { useInvoices } from '@nextsparkjs/core/hooks/useInvoices' import { useSubscription } from '@nextsparkjs/core/hooks/useSubscription' import { InvoicesTable } from '@nextsparkjs/core/components/billing' import { usePermission } from '@nextsparkjs/core/lib/permissions/hooks' import type { Permission } from '@nextsparkjs/core/lib/permissions/types' function BillingPage() { const router = useRouter() const canAccessBilling = usePermission('settings.billing' as Permission) const { planSlug, plan, isActive, isReady } = useSubscription() const [statusMessage, setStatusMessage] = useState('') const [invoicesLimit, setInvoicesLimit] = useState(3) const t = useTranslations('settings') const tb = useTranslations('billing') // Fetch invoices for current team (must be before early return) const { data: invoicesData, isLoading: invoicesLoading, } = useInvoices({ limit: invoicesLimit, offset: 0, }) const totalInvoices = invoicesData?.info?.total ?? 0 const hasMoreInvoices = (invoicesData?.data?.length ?? 0) < totalInvoices const handleUpgrade = useCallback(() => { setStatusMessage(t('billing.messages.upgradeRedirect')) }, [t]) const handleAddPayment = useCallback(() => { setStatusMessage(t('billing.messages.addPaymentForm')) }, [t]) const handleLoadMoreInvoices = useCallback(() => { setInvoicesLimit(prev => prev + 10) }, []) // Redirect if user doesn't have billing permission useEffect(() => { if (canAccessBilling === false) { router.replace('/dashboard/settings') } }, [canAccessBilling, router]) // Show nothing while checking permissions or redirecting if (!canAccessBilling) { return null } return ( <> {/* MANDATORY: Screen reader announcements */}
{t('billing.description')}
{t('billing.upgrade.description')}
{t('billing.paymentMethod.noMethod')}
{t('billing.paymentMethod.addCard')}
{t('billing.upgrade.explore')}