diff --git a/src/pages/client/MyInvoices.jsx b/src/pages/client/MyInvoices.jsx index cf2b515..34d7e22 100644 --- a/src/pages/client/MyInvoices.jsx +++ b/src/pages/client/MyInvoices.jsx @@ -1,5 +1,6 @@ import { useState, useEffect } from 'react'; import Layout from '../../components/Layout'; +import LoadingButton from '../../components/LoadingButton'; import { supabase } from '../../lib/supabase'; import { generateInvoicePDF } from '../../lib/invoice'; @@ -8,6 +9,7 @@ const statusColor = { draft: 'not_started', sent: 'in_progress', paid: 'client_a export default function MyInvoices() { const [invoices, setInvoices] = useState([]); const [loading, setLoading] = useState(true); + const [generatingInvoiceId, setGeneratingInvoiceId] = useState(''); useEffect(() => { async function load() { @@ -22,12 +24,15 @@ export default function MyInvoices() { }, []); const handleDownload = async (invoice) => { - await generateInvoicePDF(invoice, invoice.company, invoice.items || []); + if (generatingInvoiceId) return; + setGeneratingInvoiceId(invoice.id); + try { + await generateInvoicePDF(invoice, invoice.company, invoice.items || []); + } finally { + setGeneratingInvoiceId(''); + } }; - const outstanding = invoices.filter(i => i.status === 'sent').reduce((s, i) => s + Number(i.total), 0); - const paid = invoices.filter(i => i.status === 'paid').reduce((s, i) => s + Number(i.total), 0); - return (
@@ -37,17 +42,6 @@ export default function MyInvoices() {
-
-
-
${outstanding.toFixed(2)}
-
Outstanding
-
-
-
${paid.toFixed(2)}
-
Paid
-
-
- {loading ? (

Loading...

) : invoices.length === 0 ? ( @@ -56,35 +50,28 @@ export default function MyInvoices() {

Your invoices will appear here once they are sent.

) : ( -
+
{invoices.map(inv => { const isOverdue = inv.status !== 'paid' && new Date(inv.due_date) < new Date(); return ( -
-
-
-
{inv.invoice_number}
-
- Issued {new Date(inv.invoice_date).toLocaleDateString()} · Due{' '} - - {new Date(inv.due_date).toLocaleDateString()} - - {isOverdue && ' · Overdue'} -
-
-
- {inv.status} -
${Number(inv.total).toFixed(2)}
+
+
+
{inv.invoice_number}
+
+ Issued {new Date(inv.invoice_date).toLocaleDateString()} · Due{' '} + + {new Date(inv.due_date).toLocaleDateString()} + + {isOverdue && ' · Overdue'} + {inv.items?.length > 0 && ` · ${inv.items.length} item${inv.items.length !== 1 ? 's' : ''}`}
- {inv.items && inv.items.length > 0 && ( -
- {inv.items.map(i => i.description).join(' · ')} -
- )} - +
+ {inv.status} + handleDownload(inv)}> + Download PDF + +
); })}