import {Alert, Button} from '@plunk/ui'; import {AlertTriangle, ExternalLink} from 'lucide-react'; import {useBillingInvoices} from '../lib/hooks/useBillingInvoices'; interface UnpaidInvoiceBannerProps { projectId: string; hasSubscription: boolean; } export function UnpaidInvoiceBanner({projectId, hasSubscription}: UnpaidInvoiceBannerProps) { const {invoicesData, isLoading} = useBillingInvoices(projectId, hasSubscription); // Don't show banner if not loading and either no subscription or no unpaid invoices if (!hasSubscription || isLoading || !invoicesData?.hasUnpaidInvoices) { return null; } const formatCurrency = (amount: number, currency: string) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: currency.toUpperCase(), }).format(amount / 100); }; const formatDate = (dateString: string | null) => { if (!dateString) return 'Soon'; return new Date(dateString).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', }); }; const totalUnpaid = invoicesData.unpaidInvoices.reduce((sum, invoice) => sum + invoice.amountDue, 0); const currency = invoicesData.unpaidInvoices[0]?.currency || 'usd'; const oldestDueDate = invoicesData.unpaidInvoices.reduce( (oldest, invoice) => { if (!invoice.dueDate) return oldest; if (!oldest) return invoice.dueDate; return new Date(invoice.dueDate) < new Date(oldest) ? invoice.dueDate : oldest; }, null as string | null, ); const handlePayNow = () => { const firstInvoice = invoicesData.unpaidInvoices[0]; if (firstInvoice?.hostedInvoiceUrl) { window.open(firstInvoice.hostedInvoiceUrl, '_blank'); } }; return (

{invoicesData.unpaidInvoices.length === 1 ? 'You have an unpaid invoice' : `You have ${invoicesData.unpaidInvoices.length} unpaid invoices`}

Total amount due: {formatCurrency(totalUnpaid, currency)} {oldestDueDate && ( <> {' '} • Due by: {formatDate(oldestDueDate)} )}

Please pay your outstanding invoices to avoid service interruption.

); }