diff --git a/src/Dashboard.tsx b/src/Dashboard.tsx index d54b763..7d93b4b 100644 --- a/src/Dashboard.tsx +++ b/src/Dashboard.tsx @@ -11,9 +11,7 @@ import { configuration } from "./dashboard-config"; import { useDashboardData } from "./features/dashboard"; export default function Dashboard() { - const [mode, setMode] = React.useState<"expense" | "income">("expense"); - const [selectedPeriodId, setSelectedPeriodId] = React.useState(null); - const { data, isLoading, error } = useDashboardData(mode); + const { data, isLoading, error } = useDashboardData(); if (isLoading) { return ( @@ -39,9 +37,6 @@ export default function Dashboard() { setMode(newMode)} - selectedPeriodId={selectedPeriodId} - onSelectPeriodId={(newPeriodId) => setSelectedPeriodId(newPeriodId)} /> ); } diff --git a/src/components/Dashboard/Dashboard.models.ts b/src/components/Dashboard/Dashboard.models.ts index 7ab1a92..cc251ce 100644 --- a/src/components/Dashboard/Dashboard.models.ts +++ b/src/components/Dashboard/Dashboard.models.ts @@ -2,10 +2,12 @@ import * as React from "react"; export type DashboardMode = "expense" | "income"; export type DashboardPeriodType = "rolling" | "calendar"; +export type DashboardSelectedPeriodId = string | null; export interface DashboardState { mode: DashboardMode; periodType: DashboardPeriodType; + selectedPeriodId: DashboardSelectedPeriodId; comparison: boolean; } @@ -43,8 +45,8 @@ export interface DashboardConfig { export interface DashboardProps { config: DashboardConfig; - data: any; // Aggregated data from features - onModeChange?: (mode: DashboardMode) => void; - selectedPeriodId: string | null; - onSelectPeriodId: (id: string | null) => void; + data: any; + toggleMode: () => void; + togglePeriodType: () => void; + setSelectedPeriodId: (id: string | null) => void; } diff --git a/src/components/Dashboard/Dashboard.tsx b/src/components/Dashboard/Dashboard.tsx index 46a11d3..e706b80 100644 --- a/src/components/Dashboard/Dashboard.tsx +++ b/src/components/Dashboard/Dashboard.tsx @@ -6,14 +6,36 @@ export default function Dashboard(props: DashboardProps) { const [state, setState] = React.useState({ mode: "expense", periodType: "rolling", + selectedPeriodId: null, comparison: false, }); + const toggleMode = () => { + setState(prev => ({ + ...prev, + mode: prev.mode === "expense" ? "income" : "expense", + })); + }; + + const togglePeriodType = () => { + setState(prev => ({ + ...prev, + periodType: prev.periodType === "rolling" ? "calendar" : "rolling", + })); + }; + + const setSelectedPeriodId = (selectedPeriodId: typeof state.selectedPeriodId) => { + setState(prev => ({ ...prev, selectedPeriodId })); + }; + return ( ); } diff --git a/src/components/Dashboard/Dashboard.view.tsx b/src/components/Dashboard/Dashboard.view.tsx index 6019d93..1ea30fe 100644 --- a/src/components/Dashboard/Dashboard.view.tsx +++ b/src/components/Dashboard/Dashboard.view.tsx @@ -18,16 +18,15 @@ interface ViewProps extends DashboardProps { export default function DashboardView({ config, data, - latest, state, setState, - onModeChange, - selectedPeriodId, - onSelectPeriodId, + toggleMode, + togglePeriodType, + setSelectedPeriodId, }: ViewProps) { const theme = useTheme(); const themeMode = theme.palette.mode; - const { mode, periodType, comparison } = state; + const { mode, periodType, selectedPeriodId, comparison } = state; // Resolve colors with fallbacks const colors = React.useMemo(() => { @@ -51,13 +50,6 @@ export default function DashboardView({ }; }, [config.style?.palette, mode, themeMode, theme.palette]); - const handleModeChange = (_: any, newMode: any) => { - if (newMode && onModeChange) { - onModeChange(newMode); - setState(prev => ({ ...prev, mode: newMode })); - } - }; - return ( setState(prev => ({ ...prev, comparison: c }))} selectedPeriodId={selectedPeriodId} - onSelectPeriodId={onSelectPeriodId} + onSelectPeriodId={setSelectedPeriodId} /> )} diff --git a/src/features/dashboard/useDashboardData.ts b/src/features/dashboard/useDashboardData.ts index 3051f59..b1e56a9 100644 --- a/src/features/dashboard/useDashboardData.ts +++ b/src/features/dashboard/useDashboardData.ts @@ -1,7 +1,7 @@ import { useReport } from "../report"; import { mapReportToDashboard } from "./dashboard.mapper"; -export function useDashboardData(type: "expense" | "income") { +export function useDashboardData() { // Fetch reports for aggregation const weeklyReport = useReport({ period: "weekly", rolling: true }); const monthlyReport = useReport({ period: "monthly", rolling: true }); @@ -17,15 +17,24 @@ export function useDashboardData(type: "expense" | "income") { monthlyReport.error || payeeReport.error; - const aggregatedData = - weeklyReport.data?.data && monthlyReport.data?.data && payeeReport.data?.data + const aggregatedData = { + expense: weeklyReport.data?.data && monthlyReport.data?.data && payeeReport.data?.data ? mapReportToDashboard( - (weeklyReport.data.data as any).buckets, - (monthlyReport.data.data as any).buckets, + (weeklyReport.data.data as any).buckets, + (monthlyReport.data.data as any).buckets, (payeeReport.data.data as any).buckets, - type + "expense" ) - : null; + : null, + income: weeklyReport.data?.data && monthlyReport.data?.data && payeeReport.data?.data + ? mapReportToDashboard( + (weeklyReport.data.data as any).buckets, + (monthlyReport.data.data as any).buckets, + (payeeReport.data.data as any).buckets, + "income" + ) + : null, + } return { data: aggregatedData,