"use client"; import { ChevronRight, CreditCard } from "lucide-react"; import { Badge, Button, Card, CardContent, CardHeader, CardTitle, Skeleton } from "../../../../shadcnui"; import { StripeSubscriptionInterface, SubscriptionStatus } from "../../stripe-subscription"; type SubscriptionSummaryCardProps = { subscriptions: StripeSubscriptionInterface[]; loading?: boolean; error?: string; onManageClick: () => void; }; function getStatusBadgeVariant(status: SubscriptionStatus): "default" | "secondary" | "destructive" | "outline" { switch (status) { case SubscriptionStatus.ACTIVE: return "default"; case SubscriptionStatus.TRIALING: return "secondary"; case SubscriptionStatus.PAST_DUE: case SubscriptionStatus.UNPAID: case SubscriptionStatus.CANCELED: return "destructive"; default: return "outline"; } } function formatDate(date: Date): string { return new Date(date).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", }); } function formatPlanName(subscription: StripeSubscriptionInterface): string { const productName = subscription.price?.product?.name || ""; const nickname = subscription.price?.nickname || ""; if (productName && nickname) { return `${productName} - ${nickname}`; } return productName || nickname || "Subscription"; } export function SubscriptionSummaryCard({ subscriptions, loading, error, onManageClick, }: SubscriptionSummaryCardProps) { if (loading) { return ( Subscriptions ); } if (error) { return ( Subscriptions

{error}

); } const activeSubscriptions = subscriptions.filter( (sub) => sub.status === SubscriptionStatus.ACTIVE || sub.status === SubscriptionStatus.TRIALING, ); const primarySubscription = activeSubscriptions[0]; return ( Subscriptions {subscriptions.length === 0 ? (

No active plan

Subscribe to get started

) : primarySubscription ? (

{formatPlanName(primarySubscription)}

{primarySubscription.cancelAtPeriodEnd ? "Canceling" : primarySubscription.status}

{!primarySubscription.price?.isTrial ? `Ends on ${formatDate(primarySubscription.currentPeriodEnd)}` : primarySubscription.cancelAtPeriodEnd ? `Cancels on ${formatDate(primarySubscription.currentPeriodEnd)}` : `Renews on ${formatDate(primarySubscription.currentPeriodEnd)}`}

{activeSubscriptions.length > 1 && (

+{activeSubscriptions.length - 1} more subscription(s)

)}
) : null}
); }