import * as React from "react"; import { Box, Container, Grid, CircularProgress, Alert, ToggleButton, ToggleButtonGroup } from "@mui/material"; import LatestItemsList, { LatestItem } from "./components/LatestItemsList"; import HistoryChart from "./components/HistoryChart"; import { AggregatedDashboardData, } from "./components/HistoryChart"; import { fetchLatestTransactions, fetchAggregatedExpenses, fetchAggregatedIncome, } from "./utils/dashboardLoader"; export default function Dashboard() { const [latest, setLatest] = React.useState<{ expense: LatestItem[]; income: LatestItem[]; }>({ expense: [], income: [] }); const [aggregated, setAggregated] = React.useState<{ expense: AggregatedDashboardData | null; income: AggregatedDashboardData | null; }>({ expense: null, income: null }); const [mode, setMode] = React.useState<"expense" | "income">("expense"); const [period, setPeriod] = React.useState<"rolling" | "calendar">("rolling"); const [comparison, setComparison] = React.useState(false); const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(null); // -------- LOAD ONCE -------- React.useEffect(() => { async function loadData() { try { setLoading(true); const [ latestExpense, latestIncome, expenseData, incomeData ] = await Promise.all([ fetchLatestTransactions("expense"), fetchLatestTransactions("income"), fetchAggregatedExpenses(), fetchAggregatedIncome() ]); setLatest({ expense: latestExpense, income: latestIncome }); setAggregated({ expense: expenseData, income: incomeData }); } catch (err: any) { console.error(err); setError(err.message || "Failed to load dashboard data"); } finally { setLoading(false); } } loadData(); }, []); const currentData = aggregated[mode]; const currentLatest = latest[mode]; // -------- UI STATES -------- if (loading) { return ( ); } if (error) { return ( {error} ); } return ( {/* -------- TOGGLE -------- */} val && setMode(val)} > Expenses Income {/* LEFT → 1/3 */} {}} /> {/* RIGHT → 2/3 */} ); }