"use client"; // ============================================================================ // Target 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 { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { channelsApi } from "@/lib/api"; import { formatNumber, formatMetric, formatUsername } from "@/lib/utils/format"; import { Target, Users, TrendingUp, ExternalLink as ExternalLinkIcon, Loader2, AlertCircle, Plus, Eye, } from "lucide-react"; import type { TargetChannel } from "@/lib/types/api"; import { Alert, AlertDescription } from "@/components/ui/alert"; export default function ChannelsPage() { const [channels, setChannels] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState<"all" | "active" | "inactive">( "all" ); useEffect(() => { const loadChannels = async () => { try { setLoading(true); const response = await channelsApi.list(); setChannels(response.target_channels); } catch (err: any) { setError( err?.error?.message || err?.detail || "Ошибка загрузки каналов" ); } finally { setLoading(false); } }; loadChannels(); }, []); const filteredChannels = channels.filter((channel) => { if (activeTab === "active") return channel.is_active; if (activeTab === "inactive") return !channel.is_active; return true; }); const handleDisconnect = async (id: string, title: string) => { if (!confirm(`Вы уверены, что хотите отключить канал "${title}"?`)) { return; } try { await channelsApi.delete(id); setChannels((prev) => prev.filter((ch) => ch.id !== id)); } catch (err: any) { alert(err?.error?.message || err?.detail || "Ошибка отключения канала"); } }; return ( <>

Целевые каналы

Каналы, в которые вы приводите подписчиков

Подключение нового канала Добавьте бота в свой Telegram-канал с правами администратора
  1. Откройте свой Telegram-канал
  2. Добавьте @tgex_bot в администраторы канала
  3. Предоставьте боту права:{" "} создавать инвайт-ссылки и{" "} видеть вступления
  4. Канал автоматически появится в списке ниже
{error && ( {error} )} setActiveTab(v as any)} className="w-full" > Все ({channels.length}) Активные ({channels.filter((c) => c.is_active).length}) Отключенные ({channels.filter((c) => !c.is_active).length}) {loading ? (
) : filteredChannels.length === 0 ? (

{activeTab === "all" && "Нет подключенных каналов"} {activeTab === "active" && "Нет активных каналов"} {activeTab === "inactive" && "Нет отключенных каналов"}

Добавьте бота в свой канал, чтобы начать работу

) : (
{filteredChannels.map((channel) => (
{channel.title} {channel.username ? ( {formatUsername(channel.username)} ) : ( Приватный канал )}
{channel.is_active ? "Активен" : "Отключен"}
Telegram ID:{" "} {channel.telegram_id}
))}
)}
); }