Problem
After completing a booking, members have no UI to view and download their invoices. The invoice list is inaccessible from the main navigation.
Proposed Solution
Create frontend/cntr/InvoiceList/InvoiceList.tsx. Props: invoices: { id: string, invoiceNumber: string, amountKobo: number, status: string, createdAt: string, bookingId: string }[], onDownload: (invoiceId: string) => void, isLoading?: boolean. Renders a paginated table. Shows skeleton rows when loading, an empty state when empty, amounts formatted as ₦, and a download icon button per row. All implementation must live inside frontend/cntr/.
Acceptance Criteria
Problem
After completing a booking, members have no UI to view and download their invoices. The invoice list is inaccessible from the main navigation.
Proposed Solution
Create
frontend/cntr/InvoiceList/InvoiceList.tsx. Props:invoices: { id: string, invoiceNumber: string, amountKobo: number, status: string, createdAt: string, bookingId: string }[],onDownload: (invoiceId: string) => void,isLoading?: boolean. Renders a paginated table. Shows skeleton rows when loading, an empty state when empty, amounts formatted as ₦, and a download icon button per row. All implementation must live insidefrontend/cntr/.Acceptance Criteria
frontend/cntr/InvoiceList/InvoiceList.tsxisLoadingistrueinvoices.length === 0(amountKobo / 100).toLocaleString('en-NG')onDownload(invoice.id)frontend/cntr/InvoiceList/InvoiceList.test.tsx