"use client"; // ============================================================================ // Creative Detail Page // ============================================================================ import React, { useEffect, useState } from "react"; import { use } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { creativesApi } from "@/lib/api"; import { formatNumber, formatMetric, formatCurrency, formatDate, } from "@/lib/utils/format"; import { Folder, ArrowLeft, Loader2, AlertCircle, Archive, Trash2, BarChart3, Users, TrendingUp, } from "lucide-react"; import type { CreativeDetail } from "@/lib/types/api"; interface PageProps { params: Promise<{ id: string }>; } export default function CreativeDetailPage({ params }: PageProps) { const resolvedParams = use(params); const router = useRouter(); const [creative, setCreative] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { const loadCreative = async () => { try { setLoading(true); const data = await creativesApi.get(resolvedParams.id); setCreative(data); } catch (err: any) { setError(err?.error?.message || "Ошибка загрузки креатива"); } finally { setLoading(false); } }; loadCreative(); }, [resolvedParams.id]); const handleArchive = async () => { if (!creative) return; try { await creativesApi.update(creative.id, { is_archived: !creative.is_archived, }); setCreative({ ...creative, is_archived: !creative.is_archived }); } catch (err: any) { alert(err?.error?.message || "Ошибка обновления креатива"); } }; const handleDelete = async () => { if (!creative) return; if (!confirm(`Удалить креатив "${creative.name}"?`)) return; try { await creativesApi.delete(creative.id); router.push("/creatives"); } catch (err: any) { alert(err?.error?.message || "Ошибка удаления креатива"); } }; if (loading) { return ( <>
); } if (error || !creative) { return ( <>
{error || "Креатив не найден"}
); } const previewText = creative.text.replace( "{link}", "https://t.me/+InviteLinkExample" ); return ( <>

{creative.name}

{creative.is_archived && Архив}
Целевой канал: {creative.target_channel.title}
Всего закупов
{formatNumber(creative.total_purchases)}

С этим креативом

Подписчиков привлечено
{formatNumber(creative.total_subscriptions)}

Всего

Средний CPF
₽{formatMetric(creative.avg_cpf)}

По всем закупам

Текст креатива Шаблон с переменной {"{link}"}
                  {creative.text}
                
Предпросмотр С подставленной пригласительной ссылкой

{previewText}

Закупы с этим креативом История использования креатива {creative.purchases.length === 0 ? (

Закупов с этим креативом пока нет

) : ( Внешний канал Дата Стоимость Подписчики CPF {creative.purchases.map((purchase) => ( {purchase.external_channel.title} {formatDate( purchase.actual_date || purchase.scheduled_date )} {formatCurrency(purchase.cost)} {formatNumber(purchase.subscriptions_count)} ₽{formatMetric(purchase.cpf)} ))}
)}
); }