"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.data); } catch (err: any) { setError(err?.error?.message || "Ошибка загрузки каналов"); } 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 handleToggleActive = async (id: string, isActive: boolean) => { try { await channelsApi.update(id, { is_active: !isActive }); setChannels((prev) => prev.map((ch) => (ch.id === id ? { ...ch, is_active: !isActive } : ch)) ); } catch (err: any) { alert(err?.error?.message || "Ошибка обновления канала"); } }; 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 ? "Активен" : "Отключен"}
{channel.description && (

{channel.description}

)}
{formatNumber(channel.total_purchases)}
Закупов
{formatNumber(channel.total_subscriptions)}
Подписчиков
₽{formatMetric(channel.avg_cpf)}
CPF
))}
)}
); }