import { useTranslation } from "react-i18next"; import { BarChart, Bar, XAxis, YAxis, Tooltip, Legend, ResponsiveContainer, CartesianGrid, } from "recharts"; import type { CategoryDelta } from "../../shared/types"; export interface ComparePeriodChartProps { rows: CategoryDelta[]; previousLabel: string; currentLabel: string; } function formatCurrency(amount: number, language: string): string { return new Intl.NumberFormat(language === "fr" ? "fr-CA" : "en-CA", { style: "currency", currency: "CAD", maximumFractionDigits: 0, }).format(amount); } export default function ComparePeriodChart({ rows, previousLabel, currentLabel, }: ComparePeriodChartProps) { const { t, i18n } = useTranslation(); if (rows.length === 0) { return (
{t("reports.empty.noData")}
); } // Sort by current-period amount (largest spending first) so the user's eye // lands on the biggest categories, then reverse so the biggest appears at // the top of the vertical bar chart. const chartData = [...rows] .sort((a, b) => b.currentAmount - a.currentAmount) .map((r) => ({ name: r.categoryName, previousAmount: r.previousAmount, currentAmount: r.currentAmount, color: r.categoryColor, })); const previousFill = "var(--muted-foreground)"; const currentFill = "var(--primary)"; return (
formatCurrency(v, i18n.language)} stroke="var(--muted-foreground)" fontSize={11} /> typeof value === "number" ? formatCurrency(value, i18n.language) : String(value) } contentStyle={{ backgroundColor: "var(--card)", border: "1px solid var(--border)", borderRadius: "0.5rem", }} cursor={{ fill: "var(--muted)", fillOpacity: 0.2 }} />
); }