"use client"; import { Download, ExternalLink, RefreshCw } from "lucide-react"; import { Button, Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "../../../../../shadcnui"; import { formatCurrency, formatDate } from "../../../components/utils"; import { InvoiceStatus, StripeInvoiceInterface } from "../../data/stripe-invoice.interface"; import { InvoiceStatusBadge } from "../widgets/InvoiceStatusBadge"; type InvoiceDetailsProps = { invoice: StripeInvoiceInterface; open: boolean; onOpenChange: (open: boolean) => void; onInvoiceChange: () => void; }; export function InvoiceDetails({ invoice, open, onOpenChange, onInvoiceChange: _onInvoiceChange, }: InvoiceDetailsProps) { const handleDownloadPDF = () => { if (invoice.stripePdfUrl) { window.open(invoice.stripePdfUrl, "_blank"); } }; const handleRetryPayment = async () => { // TODO: Implement retry payment logic }; const handleViewInStripe = () => { if (invoice.stripeHostedInvoiceUrl) { window.open(invoice.stripeHostedInvoiceUrl, "_blank"); } }; const getInvoiceNumber = (): string => { if (invoice.stripeInvoiceNumber) { return invoice.stripeInvoiceNumber; } return invoice.stripeInvoiceId.slice(-8); }; const productName = invoice.subscription?.price?.product?.name || "Subscription"; return ( Invoice {getInvoiceNumber()} {formatDate(invoice.periodStart)}
{/* Status */}
Status:
{/* Invoice Info Grid */}
Billing Period:

{formatDate(invoice.periodStart)} - {formatDate(invoice.periodEnd)}

{invoice.dueDate && (
Due Date:

{formatDate(invoice.dueDate)}

)} {invoice.paidAt && (
Paid Date:

{formatDate(invoice.paidAt)}

)}
Attempt Count:

{invoice.attemptCount}

{/* Line Items */}

Line Items

Description Amount
{productName} {formatCurrency(invoice.subtotal, invoice.currency)}
{/* Amount Breakdown */}
Subtotal: {formatCurrency(invoice.subtotal, invoice.currency)}
{invoice.tax !== undefined && invoice.tax > 0 && (
Tax: {formatCurrency(invoice.tax, invoice.currency)}
)}
Total: {formatCurrency(invoice.total, invoice.currency)}
{invoice.amountPaid > 0 && (
Amount Paid: {formatCurrency(invoice.amountPaid, invoice.currency)}
)} {invoice.amountRemaining > 0 && (
Amount Due: {formatCurrency(invoice.amountRemaining, invoice.currency)}
)}
{/* Action Buttons */}
{invoice.stripePdfUrl && ( )} {invoice.status === InvoiceStatus.OPEN && invoice.attempted && ( )} {invoice.stripeHostedInvoiceUrl && ( )}
); }