"use client"; import { ChevronRight, ReceiptIcon } from "lucide-react"; import { Badge, Card, CardContent, CardHeader, CardTitle, Skeleton } from "../../../../shadcnui"; import { InvoiceStatus, StripeInvoiceInterface } from "../../stripe-invoice"; type InvoicesSummaryCardProps = { invoices: StripeInvoiceInterface[]; loading?: boolean; error?: string; onViewAllClick: () => void; }; function getStatusBadgeVariant(status: InvoiceStatus): "default" | "secondary" | "destructive" | "outline" { switch (status) { case InvoiceStatus.PAID: return "default"; case InvoiceStatus.OPEN: return "secondary"; case InvoiceStatus.UNCOLLECTIBLE: case InvoiceStatus.VOID: return "destructive"; default: return "outline"; } } function formatDate(date: Date): string { return new Date(date).toLocaleDateString(undefined, { year: "numeric", month: "short", day: "numeric", }); } function formatAmount(amount: number, currency: string): string { const currencyCode = currency?.toUpperCase() || "USD"; return new Intl.NumberFormat(undefined, { style: "currency", currency: currencyCode, }).format(amount / 100); } export function InvoicesSummaryCard({ invoices, loading, error, onViewAllClick }: InvoicesSummaryCardProps) { if (loading) { return ( Recent Invoices ); } if (error) { return ( Recent Invoices {error} ); } // Get the most recent invoice const latestInvoice = invoices[0]; const paidInvoices = invoices.filter((inv) => inv.status === InvoiceStatus.PAID); const openInvoices = invoices.filter((inv) => inv.status === InvoiceStatus.OPEN); return ( Recent Invoices {invoices.length === 0 ? ( No invoices yet Invoices will appear after your first billing cycle ) : latestInvoice ? ( {formatAmount(latestInvoice.total, latestInvoice.currency)} {latestInvoice.status} {latestInvoice.stripeInvoiceNumber || `Invoice from ${formatDate(latestInvoice.periodStart)}`} {paidInvoices.length > 0 && {paidInvoices.length} paid} {openInvoices.length > 0 && {openInvoices.length} open} View all ) : null} ); }
{error}
No invoices yet
Invoices will appear after your first billing cycle
{formatAmount(latestInvoice.total, latestInvoice.currency)}
{latestInvoice.stripeInvoiceNumber || `Invoice from ${formatDate(latestInvoice.periodStart)}`}