'use client'; import Link from 'next/link'; import { useQueries, useQuery } from '@tanstack/react-query'; import { PageHeader } from '@/components/layout/page-header'; import { RequirePermission } from '@/components/require-permission'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { campaignsService } from '@/services/campaigns'; import { dashboardService } from '@/services/dashboard'; import { formatPercent, formatSeconds } from '@/lib/utils'; const ACTIVE_STATUSES = new Set(['RUNNING', 'PAUSED', 'DRAINING']); function Content() { const { data: campaigns, isLoading } = useQuery({ queryKey: ['campaigns'], queryFn: campaignsService.list, refetchInterval: 15_000, }); const active = (campaigns ?? []).filter((c) => ACTIVE_STATUSES.has(c.status)); const liveQueries = useQueries({ queries: active.map((c) => ({ queryKey: ['campaign-dashboard', c.id], queryFn: () => dashboardService.campaign(c.id), refetchInterval: 5_000, })), }); if (isLoading) { return (
{Array.from({ length: 3 }).map((_, i) => ( ))}
); } if (active.length === 0) { return (

Nenhuma campanha em execução, pausada ou drenando no momento.

); } return (
{active.map((campaign, idx) => { const live = liveQueries[idx]?.data; return ( {campaign.name} {campaign.status}

CPS atual

{live?.cpsAtual ?? '—'} / {campaign.maxCps}

Conectadas

{live?.connected ?? '—'}

Leads restantes

{live?.leadsRemaining ?? '—'}

Abandono

{formatPercent(live?.abandonRate ?? undefined)}

TMA médio

{formatSeconds(live?.avgTalkTimeSeconds ?? undefined)}

Pacing

{live?.pacingFactor?.toFixed(2) ?? '—'}

); })}
); } export default function MonitoringCampaignsPage() { return ( ); }