"use client"; // ============================================================================ // Analytics Overview 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 { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { analyticsApi } from "@/lib/api"; import { formatNumber, formatMetric, formatCurrency, formatPercent, } from "@/lib/utils/format"; import { BarChart3, Loader2, AlertCircle, TrendingUp, TrendingDown, Users, ShoppingCart, DollarSign, } from "lucide-react"; import type { SpendingAnalytics } 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 AnalyticsPage() { const { selectedChannel } = useTargetChannel(); const [spending, setSpending] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { if (selectedChannel) { loadData(); } else { setLoading(false); } }, [selectedChannel]); const loadData = async () => { if (!selectedChannel) return; try { setLoading(true); const data = await analyticsApi.spending({ grouping: "week", target_channel_id: selectedChannel.id, }); setSpending(data); } catch (err: any) { setError(err?.error?.message || "Ошибка загрузки аналитики"); } finally { setLoading(false); } }; if (loading) { return ( <>
); } if (error || !spending) { return ( <>
{error || "Не удалось загрузить аналитику"}
); } return ( <>

Аналитика

Сводная статистика за последний месяц

Всего затрат
{formatCurrency(spending.total_cost)}

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

Всего подписчиков
{formatNumber(spending.total_subscriptions)}

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

Средний CPF
{spending.avg_cpf ? `₽${formatMetric(spending.avg_cpf)}` : "—"}

Стоимость подписки

Средний CPM
{spending.avg_cpm ? `₽${formatMetric(spending.avg_cpm)}` : "—"}

За 1000 просмотров

Динамика затрат Расходы по периодам `₽${formatNumber(value)}`} />
); }