// src/BalanceChart.tsx import { useEffect, useRef, useState } from 'react'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from 'recharts'; import { type BalancePoint } from '../api'; function formatAmount(n: number) { return new Intl.NumberFormat(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(n); } function formatDate(dateStr: string) { return new Date(dateStr).toLocaleDateString(undefined, { month: 'short', day: 'numeric' }); } type Props = { data: BalancePoint[]; pxPerPoint?: number }; export default function BalanceChart({ data, pxPerPoint = 40 }: Props) { const wrapRef = useRef(null); const [containerWidth, setContainerWidth] = useState(0); useEffect(() => { function measure() { if (!wrapRef.current) return; setContainerWidth(wrapRef.current.clientWidth); } measure(); const obs = new ResizeObserver(measure); if (wrapRef.current) obs.observe(wrapRef.current); return () => obs.disconnect(); }, []); if (data.length === 0) { return
No data to display
; } const desiredWidth = Math.max(containerWidth, Math.max(600, data.length * pxPerPoint)); return (
formatAmount(value as number)} label={{ value: 'Balance', angle: -90, position: 'insideLeft', offset: -30 }} /> [formatAmount(value as number), 'Balance']} />
); }