"use client"; // ============================================================================ // Analytics Overview Page // ============================================================================ import { useEffect, useState } from "react"; import { useParams } from "next/navigation"; import Link from "next/link"; import { Loader2, Users, Eye, DollarSign, ArrowRight, BarChart3, Info, } from "lucide-react"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { useWorkspace } from "@/components/providers/workspace-provider"; import { demoAwareAnalyticsApi } from "@/lib/demo"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; import type { SpendingAnalytics } from "@/lib/types/api"; // ============================================================================ // Helpers // ============================================================================ const formatCurrency = (value: number | null) => { if (value === null) return "—"; return new Intl.NumberFormat("ru-RU", { style: "currency", currency: "RUB", minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(value); }; const formatNumber = (value: number | null) => { if (value === null) return "—"; return new Intl.NumberFormat("ru-RU").format(value); }; // ============================================================================ // Component // ============================================================================ export default function AnalyticsPage() { const params = useParams(); const workspaceId = params?.workspaceId as string; const { selectedProjects, getProjectFilterId, allProjectsSelected, projects } = useWorkspace(); const [spending, setSpending] = useState(null); const [loading, setLoading] = useState(true); const projectFilterId = getProjectFilterId(); useEffect(() => { loadAnalytics(); }, [workspaceId, projectFilterId]); const loadAnalytics = async () => { try { setLoading(true); const data = await demoAwareAnalyticsApi.spending(workspaceId, { project_id: projectFilterId, grouping: "month", }); setSpending(data); } catch (err) { console.error("Failed to load analytics:", err); } finally { setLoading(false); } }; // Calculate averages const avgCps = spending && spending.total_subscriptions > 0 ? spending.total_cost / spending.total_subscriptions : null; const avgCpm = spending && spending.total_views > 0 ? (spending.total_cost / spending.total_views) * 1000 : null; // Selection info text const selectionText = allProjectsSelected ? "Все проекты" : selectedProjects.length === 1 ? selectedProjects[0].title : `${selectedProjects.length} проекта`; return ( <>

Аналитика

Обзор эффективности рекламных размещений

{selectionText}
{selectedProjects.length > 1 && !allProjectsSelected && ( Выбрано {selectedProjects.length} проекта: {selectedProjects.map(p => p.title).join(", ")}. Показана суммарная аналитика по всем выбранным проектам. )} {loading ? (
) : ( <> {/* Summary Cards */}
Всего потрачено
{formatCurrency(spending?.total_cost ?? 0)}
Подписчиков
{formatNumber(spending?.total_subscriptions ?? 0)}

Средний CPS: {avgCps ? formatCurrency(avgCps) : "—"}

Просмотров
{formatNumber(spending?.total_views ?? 0)}

Средний CPM: {avgCpm ? formatCurrency(avgCpm) : "—"}

Периодов данных
{spending?.chart_data?.length ?? 0}

месяцев

{/* Quick Links */}
Динамика расходов График расходов по времени с группировкой Аналитика по каналам Эффективность каналов размещения Аналитика по креативам Сравнение эффективности креативов
{/* Recent Activity */} {spending && spending.chart_data && spending.chart_data.length > 0 && ( Последние периоды Динамика по периодам
{spending.chart_data.slice(0, 6).map((item, index) => (
{item.period}
{formatNumber(item.subscriptions)} подписчиков •{" "} {formatNumber(item.views)} просмотров
{formatCurrency(item.cost)}
))}
)} )}
); }