import { useState, useEffect } from "react" import { PieChart, Pie, Cell, LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, } from "recharts" import { financeApi } from "../../api/finance" const COLORS = [ "#0D4F4F", "#F7B538", "#6366f1", "#22c55e", "#ef4444", "#8b5cf6", "#0ea5e9", "#f97316", "#ec4899", "#14b8a6", "#64748b", "#a855f7", "#78716c", ] const fmt = (n) => Number(n).toLocaleString("ru-RU") + " ₽" export default function FinanceDashboard({ month, year }) { const [summary, setSummary] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { setLoading(true) financeApi .getSummary({ month, year }) .then(setSummary) .catch(console.error) .finally(() => setLoading(false)) }, [month, year]) if (loading) { return (
{[1, 2, 3].map((i) => (
))}
) } if (!summary || (summary.total_income === 0 && summary.total_expense === 0)) { return (
📊

Нет данных

Добавьте первую транзакцию

) } const expenseCategories = summary.by_category.filter((c) => c.type === "expense") const pieData = expenseCategories.map((c) => ({ name: c.category_emoji + " " + c.category_name, value: c.amount, })) const dailyData = summary.daily.map((d) => ({ day: d.date.slice(8, 10), amount: d.amount, })) return (

Баланс за месяц

{fmt(summary.balance)}

Доходы

+{fmt(summary.total_income)}

Расходы

-{fmt(summary.total_expense)}

{expenseCategories.length > 0 && (

Топ расходов

{expenseCategories.slice(0, 5).map((c, i) => (
{c.category_emoji}
{c.category_name} {fmt(c.amount)}
))}
)} {pieData.length > 0 && (

По категориям

{pieData.map((_, i) => ( ))} fmt(v)} />
{pieData.slice(0, 6).map((c, i) => (
{c.name} {Math.round( (c.value / summary.total_expense) * 100 )} %
))}
)} {dailyData.length > 0 && (

Расходы по дням

v / 1000 + "к"} /> fmt(v)} />
)}
) }