"use client"; // ============================================================================ // External Channels List Page // ============================================================================ import React, { useEffect, useState } from "react"; import Link from "next/link"; import { DashboardHeader } from "@/components/layout/dashboard-header"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { externalChannelsApi, channelsApi } from "@/lib/api"; import { formatNumber, formatMetric, formatUsername, formatCompactNumber, } from "@/lib/utils/format"; import { ExternalLink as ExternalLinkIcon, Loader2, AlertCircle, Plus, Search, FileUp, Eye, Pencil, Trash2, Users, } from "lucide-react"; import type { ExternalChannel } from "@/lib/types/api"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; export default function ExternalChannelsPage() { const [channels, setChannels] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [searchQuery, setSearchQuery] = useState(""); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [isCreating, setIsCreating] = useState(false); // Form state const [formData, setFormData] = useState({ title: "", username: "", link: "", subscribers_count: "", description: "", }); useEffect(() => { loadChannels(); }, []); const loadChannels = async () => { try { setLoading(true); // Сначала загружаем target channels const targetChannelsRes = await channelsApi.list(); if (targetChannelsRes.target_channels.length === 0) { setError("Добавьте сначала целевой канал"); setLoading(false); return; } // Загружаем external channels для первого target channel const firstTargetChannel = targetChannelsRes.target_channels[0]; const response = await externalChannelsApi.list(firstTargetChannel.id); setChannels(response.external_channels); } catch (err: any) { const errorMsg = typeof err?.detail === "string" ? err.detail : err?.error?.message || "Ошибка загрузки каналов"; setError(errorMsg); } finally { setLoading(false); } }; const handleCreate = async () => { try { setIsCreating(true); // Получаем первый доступный target channel const targetChannelsRes = await channelsApi.list(); if (targetChannelsRes.target_channels.length === 0) { alert("Добавьте сначала целевой канал"); setIsCreating(false); return; } await externalChannelsApi.create({ telegram_id: 0, // Временно, пока не получим реальный ID title: formData.title, username: formData.username || null, subscribers_count: formData.subscribers_count ? parseInt(formData.subscribers_count) : null, description: formData.description || null, target_channel_ids: [targetChannelsRes.target_channels[0].id], }); setIsCreateDialogOpen(false); setFormData({ title: "", username: "", link: "", subscribers_count: "", description: "", }); loadChannels(); } catch (err: any) { const errorMsg = typeof err?.detail === "string" ? err.detail : err?.error?.message || "Ошибка создания канала"; alert(errorMsg); } finally { setIsCreating(false); } }; const handleDelete = async (id: string, title: string) => { if (!confirm(`Удалить канал "${title}"?`)) return; try { await externalChannelsApi.delete(id); loadChannels(); } catch (err: any) { alert(err?.error?.message || "Ошибка удаления канала"); } }; const filteredChannels = channels.filter( (channel) => channel.title.toLowerCase().includes(searchQuery.toLowerCase()) || channel.username?.toLowerCase().includes(searchQuery.toLowerCase()) ); return ( <>

Внешние каналы

Каналы, в которых покупаете рекламу

Добавить внешний канал Добавьте канал, в котором планируете покупать рекламу
setFormData({ ...formData, title: e.target.value }) } placeholder="Название канала" />
setFormData({ ...formData, link: e.target.value }) } placeholder="https://t.me/channel_name" />
setFormData({ ...formData, username: e.target.value }) } placeholder="@channel_name" />
setFormData({ ...formData, subscribers_count: e.target.value, }) } placeholder="50000" />