import { AmountDisplay } from '@/components/ui/amount-display'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { ChartConfig, ChartContainer } from '@/components/ui/chart'; import { TrendDataPoint } from '@/hooks/use-cashflow-data'; import { useLocale } from '@/hooks/use-locale'; import { cn } from '@/lib/utils'; import { formatCompactNumber, formatMonthFromYearMonth } from '@/utils/date'; import { __ } from '@/utils/i18n'; import { useEffect, useRef } from 'react'; import { Bar, BarChart, CartesianGrid, Line, ReferenceLine, Tooltip, XAxis, YAxis, } from 'recharts'; interface CashflowTrendChartProps { data: TrendDataPoint[]; loading?: boolean; className?: string; currency?: string; } interface TooltipPayloadItem { dataKey?: string; value?: number; color?: string; name?: string; payload?: TrendDataPoint; } interface CustomTooltipProps { active?: boolean; payload?: TooltipPayloadItem[]; currency?: string; } function CustomTooltip({ active, payload, currency = 'USD', }: CustomTooltipProps) { const locale = useLocale(); if (!active || !payload?.length) return null; const data = payload[0].payload; if (!data) return null; return (
{formatMonthFromYearMonth(data.month, locale)}
{__('Income')}
{__('Expenses')}
{__('Net')} = 0 ? 'text-green-600' : 'text-red-600', )} />
); } export function CashflowTrendChart({ data, loading, className, currency = 'USD', }: CashflowTrendChartProps) { const locale = useLocale(); const scrollContainerRef = useRef(null); const minChartWidth = data.length * 60; const chartConfig: ChartConfig = { income: { label: __('Income'), color: 'var(--color-chart-2)', }, expense: { label: __('Expenses'), color: 'var(--color-chart-5)', }, net: { label: __('Net'), color: 'var(--color-chart-1)', }, }; useEffect(() => { if (scrollContainerRef.current) { scrollContainerRef.current.scrollLeft = scrollContainerRef.current.scrollWidth; } }, [data]); if (loading) { return ( {__('Cashflow Trend')}
); } return ( {__('Cashflow Trend')} {__( 'Monthly income, expenses, and net cashflow over the last 12 months', )}
formatMonthFromYearMonth(value, locale) } /> formatCompactNumber( value / 100, locale, currency, ) } width={60} /> } cursor={{ fill: 'var(--color-muted)', opacity: 0.3, }} />
{__('Income')}
{__('Expenses')}
{__('Net')}
); }