From ca1afbd8dbc506e702f13d9ba63a61a8c9fd77b8 Mon Sep 17 00:00:00 2001 From: kevin-asprec Date: Thu, 7 May 2026 06:49:44 +0800 Subject: [PATCH] fix: replace dangerous r.data.data || r.data fallback with nullish coalescing The || operator fallback returned the response wrapper object (truthy but not an array) when r.data.data was null/undefined, causing .map() crashes. Use ?? null, ?? [], and Array.isArray() guards instead. --- src/app/(dashboard)/dashboard/accounting/page.tsx | 8 ++++---- src/app/(dashboard)/dashboard/payments/page.tsx | 2 +- src/app/(dashboard)/dashboard/reports/page.tsx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/(dashboard)/dashboard/accounting/page.tsx b/src/app/(dashboard)/dashboard/accounting/page.tsx index b4e7cd5..38c3e89 100644 --- a/src/app/(dashboard)/dashboard/accounting/page.tsx +++ b/src/app/(dashboard)/dashboard/accounting/page.tsx @@ -75,7 +75,7 @@ function AccountingOverview() { const [loading, setLoading] = useState(true); useEffect(() => { - api.get('/accounting/overview').then((r) => setData(r.data.data || r.data)).catch(() => {}).finally(() => setLoading(false)); + api.get('/accounting/overview').then((r) => setData(r.data.data ?? null)).catch(() => {}).finally(() => setLoading(false)); }, []); if (loading) { @@ -226,7 +226,7 @@ function TrialBalance({ onAccountClick }: { onAccountClick: (accountId: string) const [selectedAccount, setSelectedAccount] = useState(null); useEffect(() => { - api.get('/accounting/trial-balance').then((r) => setData(r.data.data || r.data)).catch(() => {}); + api.get('/accounting/trial-balance').then((r) => setData(r.data.data ?? [])).catch(() => {}); }, []); const totalDebit = data.reduce((s, a) => s + a.debit, 0); @@ -332,7 +332,7 @@ function AccountBreakdownModal({ if (!open) return; setLoading(true); api.get(`/accounting/general-ledger?accountId=${account.id}`) - .then((r) => setEntries(r.data.data || r.data)) + .then((r) => setEntries(r.data.data ?? [])) .catch(() => setEntries([])) .finally(() => setLoading(false)); }, [open, account.id]); @@ -454,7 +454,7 @@ function GeneralLedger({ initialAccountId, onClearAccountFilter }: { initialAcco const [dateTo, setDateTo] = useState(''); useEffect(() => { - api.get('/accounting/general-ledger').then((r) => setEntries(r.data.data || r.data)).catch(() => {}); + api.get('/accounting/general-ledger').then((r) => setEntries(r.data.data ?? [])).catch(() => {}); }, []); // When initialAccountId changes (clicked from trial balance), update filter diff --git a/src/app/(dashboard)/dashboard/payments/page.tsx b/src/app/(dashboard)/dashboard/payments/page.tsx index fdc56a6..defcbc9 100644 --- a/src/app/(dashboard)/dashboard/payments/page.tsx +++ b/src/app/(dashboard)/dashboard/payments/page.tsx @@ -217,7 +217,7 @@ function SubmitRemittanceModal({ open, onClose, onSuccess }: { open: boolean; on useEffect(() => { if (!open) return; setSelected(new Set()); setNotes(''); setLoading(true); - api.get('/payments/unremitted').then((r) => setPayments(r.data.data || r.data)) + api.get('/payments/unremitted').then((r) => setPayments(r.data.data ?? [])) .catch(() => toast('Failed to load unremitted payments', 'error')) .finally(() => setLoading(false)); }, [open, toast]); diff --git a/src/app/(dashboard)/dashboard/reports/page.tsx b/src/app/(dashboard)/dashboard/reports/page.tsx index f3e7e2d..26b255f 100644 --- a/src/app/(dashboard)/dashboard/reports/page.tsx +++ b/src/app/(dashboard)/dashboard/reports/page.tsx @@ -238,7 +238,7 @@ function CompanyOverview() { api.get('/dashboard/financial-summary').then((r) => setFinancial(r.data.data)).catch(() => {}), api.get('/dashboard/revenue-chart').then((r) => setRevenue(r.data.data ?? [])).catch(() => {}), api.get('/payments/unremitted').then((r) => { - const payments = r.data.data || r.data || []; + const payments = Array.isArray(r.data.data) ? r.data.data : []; setUnremitted({ total: payments.reduce((s: number, p: any) => s + Number(p.amount), 0), count: payments.length,