'use client'; import { useEffect, useState } from 'react'; import { useRouter } from 'next/navigation'; import { adminStripeService, AdminSubscription, RevenueStats, getErrorMessage, } from '@/services'; const STATUS_OPTIONS = ['', 'ACTIVE', 'PAST_DUE', 'CANCELED', 'INCOMPLETE', 'UNPAID']; const statusBadge = (status: string) => { const styles: Record = { ACTIVE: 'bg-green-100 text-green-800', PAST_DUE: 'bg-yellow-100 text-yellow-800', CANCELED: 'bg-red-100 text-red-800', INCOMPLETE: 'bg-gray-100 text-gray-800', UNPAID: 'bg-red-100 text-red-800', TRIALING: 'bg-blue-100 text-blue-800', }; return ( {status} ); }; export default function SubscriptionsPage() { const router = useRouter(); const [subscriptions, setSubscriptions] = useState([]); const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [page, setPage] = useState(1); const [totalPages, setTotalPages] = useState(1); const [total, setTotal] = useState(0); useEffect(() => { fetchData(); }, [statusFilter, page]); const fetchData = async () => { setLoading(true); setError(''); try { const [subsResult, statsResult] = await Promise.all([ adminStripeService.getAllSubscriptions({ status: statusFilter || undefined, page, limit: 20, }), adminStripeService.getRevenueStats(), ]); setSubscriptions(subsResult.data); setTotalPages(subsResult.totalPages); setTotal(subsResult.total); setStats(statsResult); } catch (err) { const errorMessage = getErrorMessage(err); setError(errorMessage); if (errorMessage.includes('Unauthorized')) { router.push('/login'); } } finally { setLoading(false); } }; const formatDate = (dateStr: string | null) => { if (!dateStr) return '-'; return new Date(dateStr).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', }); }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', }).format(amount); }; const getAgentName = (sub: AdminSubscription) => { const profile = sub.user?.agentProfile; if (profile?.firstName || profile?.lastName) { return `${profile.firstName || ''} ${profile.lastName || ''}`.trim(); } return sub.user?.email || 'Unknown'; }; return (
{/* Header */}

Subscriptions

Manage agent subscriptions and view revenue

{/* Stats Cards */} {stats && (

Active Subscriptions

{stats.activeSubscriptions}

Total Revenue

{formatCurrency(stats.totalRevenue)}

This Month

{formatCurrency(stats.monthlyRevenue)}

)} {/* Filters */}

All Subscriptions ({total})

{error && (

{error}

)} {loading ? (
) : subscriptions.length === 0 ? (
No subscriptions found
) : ( <>
{subscriptions.map((sub) => ( ))}
Agent Plan Status Amount Period End Created
{getAgentName(sub)}
{sub.user?.email}
{sub.plan?.name || '-'} {statusBadge(sub.status)} {sub.cancelAtPeriodEnd && ( (Canceling) )} {sub.plan ? formatCurrency(sub.plan.amount / 100) : '-'} {sub.plan && /{sub.plan.interval}} {formatDate(sub.currentPeriodEnd)} {formatDate(sub.createdAt)}
{/* Pagination */} {totalPages > 1 && (

Page {page} of {totalPages}

)} )}
); }