"use client"; import { CreditCard } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { Button } from "../../../../../shadcnui"; import { BillingAlertBanner } from "../../../components"; import { StripeSubscriptionInterface, StripeSubscriptionService, SubscriptionStatus } from "../../data"; import { SubscriptionsList } from "../lists"; type SubscriptionsContainerProps = { onOpenWizard?: (subscription?: StripeSubscriptionInterface) => void; hasActiveRecurringSubscription?: boolean; }; export function SubscriptionsContainer({ onOpenWizard, hasActiveRecurringSubscription }: SubscriptionsContainerProps) { const [subscriptions, setSubscriptions] = useState([]); const [loading, setLoading] = useState(true); const loadSubscriptions = useCallback(async () => { setLoading(true); try { const fetchedSubscriptions = await StripeSubscriptionService.listSubscriptions(); setSubscriptions(fetchedSubscriptions); } catch (error) { console.error("[SubscriptionsContainer] Failed to load subscriptions:", error); } finally { setLoading(false); } }, []); useEffect(() => { loadSubscriptions(); }, []); // Detect critical subscriptions const criticalSubscriptions = subscriptions.filter( (sub) => sub.status === SubscriptionStatus.PAST_DUE || (sub.status === SubscriptionStatus.TRIALING && sub.trialEnd && new Date(sub.trialEnd).getTime() - new Date().getTime() <= 7 * 24 * 60 * 60 * 1000), ); if (loading) { return (

Loading subscriptions...

); } return (
{/* Header */}

Subscriptions

{subscriptions.length > 0 && ( )}
{/* Alert Banners */} {criticalSubscriptions.map((subscription) => ( ))} {/* Empty state CTA */} {subscriptions.length === 0 && (

No Active Subscriptions

Choose a subscription plan to get started with our services.

)} {/* Subscriptions List */} {subscriptions.length > 0 && ( onOpenWizard?.(sub)} /> )}
); }