import { CalendarClock, CircleCheck, ClipboardCheck, ListChecks, Ticket, TriangleAlert, type LucideIcon, } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Skeleton } from '@/components/ui/skeleton'; import type { TicketSummaryResponse } from '@/types'; interface TicketSummaryCardsProps { summary?: TicketSummaryResponse; isLoading: boolean; isError: boolean; } interface SummaryMetric { label: string; value: number; icon: LucideIcon; iconClassName: string; } function SummaryCard({ metric }: { metric: SummaryMetric }) { const Icon = metric.icon; return (

{metric.value.toLocaleString()}

{metric.label}

); } function TicketSummarySkeleton() { return (
{Array.from({ length: 5 }, (_, index) => (
))}
); } export function TicketSummaryCards({ summary, isLoading, isError, }: TicketSummaryCardsProps) { if (isLoading) return ; if (isError || !summary) { return (
); } const metrics: SummaryMetric[] = [ { label: 'Total Tickets', value: summary.total_tickets, icon: Ticket, iconClassName: 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300', }, { label: 'In Progress', value: summary.in_progress_tickets, icon: ListChecks, iconClassName: 'bg-indigo-100 text-indigo-700 dark:bg-indigo-950/60 dark:text-indigo-300', }, { label: 'Repair Reviews', value: summary.pending_actions.repair_reviews, icon: ClipboardCheck, iconClassName: 'bg-orange-100 text-orange-700 dark:bg-orange-950/60 dark:text-orange-300', }, { label: 'Extension Requests', value: summary.pending_actions.extension_requests, icon: CalendarClock, iconClassName: 'bg-blue-100 text-blue-700 dark:bg-blue-950/60 dark:text-blue-300', }, { label: 'Completed', value: summary.completed_tickets, icon: CircleCheck, iconClassName: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-950/60 dark:text-emerald-300', }, ]; return (
{metrics.map((metric) => ( ))}
); }