"use client"; import { forwardRef } from "react"; import Link from "next/link"; import { format } from "date-fns"; import { ServerIcon, CheckCircleIcon, ExclamationTriangleIcon, ClockIcon, XCircleIcon, CalendarIcon, ArrowTopRightOnSquareIcon, } from "@heroicons/react/24/outline"; import { StatusPill } from "@/components/atoms/status-pill"; import { Button } from "@/components/atoms/button"; import { SubCard } from "@/components/molecules/SubCard/SubCard"; import { formatCurrency, getCurrencyLocale } from "@customer-portal/domain/billing"; import type { Subscription } from "@customer-portal/domain/billing"; import { cn } from "@/lib/utils"; interface SubscriptionCardProps { subscription: Subscription; variant?: "list" | "grid"; showActions?: boolean; onViewClick?: (subscription: Subscription) => void; className?: string; } const getStatusIcon = (status: string) => { switch (status) { case "Active": return ; case "Suspended": return ; case "Pending": return ; case "Cancelled": case "Terminated": return ; default: return ; } }; const getStatusVariant = (status: string) => { switch (status) { case "Active": return "success" as const; case "Suspended": return "warning" as const; case "Pending": return "info" as const; case "Cancelled": case "Terminated": return "neutral" as const; default: return "neutral" as const; } }; const formatDate = (dateString: string | undefined) => { if (!dateString) return "N/A"; try { return format(new Date(dateString), "MMM d, yyyy"); } catch { return "Invalid date"; } }; const getBillingCycleLabel = (cycle: string) => { const name = cycle.toLowerCase(); const looksLikeActivation = name.includes("activation") || name.includes("setup"); return looksLikeActivation ? "One-time" : cycle; }; export const SubscriptionCard = forwardRef( ({ subscription, variant = "list", showActions = true, onViewClick, className }, ref) => { const handleViewClick = () => { if (onViewClick) { onViewClick(subscription); } }; if (variant === "grid") { return (
{/* Header */}
{getStatusIcon(subscription.status)}

{subscription.productName}

Service ID: {subscription.serviceId}

{/* Details */}

Price

{formatCurrency(subscription.amount, { currency: subscription.currency, locale: getCurrencyLocale(subscription.currency), })}

{getBillingCycleLabel(subscription.cycle)}

Next Due

{formatDate(subscription.nextDue)}

{/* Actions */} {showActions && (

Created {formatDate(subscription.registrationDate)}

)}
); } // List variant (default) return (
{getStatusIcon(subscription.status)}

{subscription.productName}

Service ID: {subscription.serviceId}

{formatCurrency(subscription.amount, { currency: "JPY", locale: getCurrencyLocale("JPY"), })}

{getBillingCycleLabel(subscription.cycle)}

{formatDate(subscription.nextDue)}

Next due

{showActions && (
)}
); } ); SubscriptionCard.displayName = "SubscriptionCard";