'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 (
Nenhuma campanha em execução, pausada ou drenando no momento.
); } return (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) ?? '—'}