"use client"; // ============================================================================ // Analytics Costs Page // ============================================================================ import React, { useEffect, useState } from "react"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { analyticsApi, channelsApi } from "@/lib/api"; import { formatCurrency, formatNumber } from "@/lib/utils/format"; import { Loader2, AlertCircle, DollarSign } from "lucide-react"; import type { CostsReport } from "@/lib/types/api"; import type { TargetChannel } from "@/lib/types/api"; import { LineChart, Line, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, } from "recharts"; export default function AnalyticsCostsPage() { const [report, setReport] = useState(null); const [channels, setChannels] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [period, setPeriod] = useState<"day" | "week" | "month">("week"); const [targetChannelId, setTargetChannelId] = useState( undefined ); useEffect(() => { loadData(); }, [period, targetChannelId]); const loadData = async () => { try { setLoading(true); const [reportData, channelsData] = await Promise.all([ analyticsApi.costs({ period, target_channel_id: targetChannelId }), channels.length > 0 ? Promise.resolve({ target_channels: channels }) : channelsApi.list(), ]); setReport(reportData); if (channels.length === 0) { setChannels(channelsData.target_channels); } } catch (err: any) { setError(err?.error?.message || "Ошибка загрузки аналитики"); } finally { setLoading(false); } }; return ( <>

Затраты на рекламу

Динамика расходов по периодам

{error && ( {error} )} Фильтры
{loading ? ( ) : report ? ( <>
Всего затрат
{formatCurrency(report.totalCost)}

За выбранный период

Средние затраты
{formatCurrency(report.averageCost)}

В среднем за период

Периодов
{formatNumber(report.periods.length)}

С активностью

График затрат Динамика расходов на рекламу `₽${formatNumber(value)}`} /> [ `₽${formatNumber(value)}`, "Затраты", ]} /> Детализация по периодам Затраты и количество закупов
{report.periods.map((period) => (

{period.date}

{formatNumber(period.purchases_count)} закупов

{formatCurrency(period.total_cost)}

ср. ₽{formatNumber(period.avg_cost)}

))}
) : null}
); }