"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 } from "@/lib/api"; import { formatCurrency, formatNumber } from "@/lib/utils/format"; import { Loader2, AlertCircle, DollarSign } from "lucide-react"; import type { SpendingAnalytics, DateGrouping } from "@/lib/types/api"; import { useTargetChannel } from "@/components/providers/target-channel-provider"; import { LineChart, Line, BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, } from "recharts"; export default function AnalyticsCostsPage() { const { selectedChannel } = useTargetChannel(); const [report, setReport] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [grouping, setGrouping] = useState("week"); useEffect(() => { if (selectedChannel) { loadData(); } else { setLoading(false); } }, [grouping, selectedChannel]); const loadData = async () => { if (!selectedChannel) return; try { setLoading(true); const reportData = await analyticsApi.spending({ grouping, target_channel_id: selectedChannel.id, }); setReport(reportData); } catch (err: any) { setError(err?.error?.message || "Ошибка загрузки аналитики"); } finally { setLoading(false); } }; return ( <>

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

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

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

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

Подписчики
{formatNumber(report.total_subscriptions)}

Всего привлечено

Просмотры
{formatNumber(report.total_views)}

Всего просмотров

Средний CPF
{report.avg_cpf ? formatCurrency(report.avg_cpf) : "—"}

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

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

{period.period}

{formatNumber(period.subscriptions)} подписок • {formatNumber(period.views)} просмотров

{formatCurrency(period.cost)}

{period.cpf ? `CPF: ${formatCurrency(period.cpf)}` : "—"}

))}
) : null}
); }