"use client"; import { Bar, BarChart, CartesianGrid, Line, LineChart, ReferenceLine, XAxis, YAxis, } from "recharts"; import { ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, type ChartConfig, } from "@/components/ui/chart"; import { tr } from "@/i18n/tr"; import { cn } from "@/lib/utils"; import { formatMoney } from "@/shared/format"; import type { TrendReport } from "../service"; import { monthLabel, monthShort, formatPct } from "./report-frame"; const t = tr.reports.trend; const compact = new Intl.NumberFormat("tr-TR", { notation: "compact", maximumFractionDigits: 1 }); const barConfig = { income: { label: t.income, color: "var(--income)" }, expense: { label: t.expense, color: "var(--expense)" }, } satisfies ChartConfig; const rateConfig = { rate: { label: t.savings, color: "var(--budget)" } } satisfies ChartConfig; export function TrendView({ data }: { data: TrendReport }) { const chart = data.months.map((m) => ({ month: m.month, label: monthShort(m.month), income: m.incomeMinor / 100, expense: m.expenseMinor / 100, // Devam eden ayın oranı (maaş henüz yatmamış olabilir) ölçeği bozmasın: grafikte yok. rate: m.month === data.currentMonth ? null : m.savingsPct, })); const moneyTip = ( { const m = payload?.[0]?.payload?.month as string | undefined; return m ? monthLabel(m) : ""; }} formatter={(value, name) => (
{barConfig[name as keyof typeof barConfig]?.label} {formatMoney(Math.round(Number(value) * 100))}
)} /> ); return (
compact.format(v)} /> } />

{t.rateTitle}

{t.rateHint} {t.partialHint}

`%${v}`} /> { const m = payload?.[0]?.payload?.month as string | undefined; return m ? monthLabel(m) : ""; }} formatter={(value) => ( {formatPct(Number(value))} )} /> } />
{[...data.months].reverse().map((m) => ( ))}
{t.month} {t.income} {t.expense} {t.net} {t.savings}
{monthLabel(m.month)} {m.month === data.currentMonth ? ( ({t.ongoing}) ) : null} {formatMoney(m.incomeMinor)} {formatMoney(m.expenseMinor)} {m.netMinor < 0 ? "−" : ""} {formatMoney(Math.abs(m.netMinor))} {formatPct(m.savingsPct)}
{t.total} {formatMoney(data.totals.incomeMinor)} {formatMoney(data.totals.expenseMinor)} {data.totals.netMinor < 0 ? "−" : ""} {formatMoney(Math.abs(data.totals.netMinor))} {formatPct(data.totals.savingsPct)}
); }