"use client" import { useQuery } from "convex/react" import { api } from "@/convex/_generated/api" import { DEFAULT_TENANT_ID } from "@/lib/constants" import type { TicketQueueSummary } from "@/lib/schemas/ticket" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Progress } from "@/components/ui/progress" import { useAuth } from "@/lib/auth-client" import type { Id } from "@/convex/_generated/dataModel" interface TicketQueueSummaryProps { queues?: TicketQueueSummary[] layout?: "default" | "compact" } export function TicketQueueSummaryCards({ queues, layout = "default" }: TicketQueueSummaryProps) { const { convexUserId, isStaff } = useAuth() const enabled = Boolean(isStaff && convexUserId) const shouldFetch = Boolean(!queues && enabled) const fromServer = useQuery( api.queues.summary, shouldFetch ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip" ) as TicketQueueSummary[] | undefined const data: TicketQueueSummary[] = queues ?? fromServer ?? [] const gridLayoutClass = layout === "compact" ? "mx-auto grid w-full max-w-5xl grid-cols-1 gap-5 pb-3 md:grid-cols-2" : "grid w-full grid-cols-1 gap-5 pb-3 sm:grid-cols-2 md:grid-cols-3" if (!queues && shouldFetch && fromServer === undefined) { return ( // Usa o mesmo grid do estado carregado para não “pular”
{Array.from({ length: 3 }).map((_, index) => (
))}
) } return (
{/* Grade responsiva: compacta no modo widget, ampla nos demais contextos */}
{data.map((queue, index) => { const totalOpen = queue.pending + queue.inProgress + queue.paused const breachPercent = totalOpen === 0 ? 0 : Math.round((queue.breached / totalOpen) * 100) return ( Fila {queue.name} {/* min-w-0 evita conteúdo interno empurrar a coluna */}

Pendentes

{queue.pending}

Em andamento

{queue.inProgress}

Pausados

{queue.paused}

{breachPercent}% dos chamados da fila estão fora do SLA Em atraso: {queue.breached}
) })}
) }