'use client'; import { useState, useEffect } from 'react'; import { format } from 'date-fns'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Ticket as TicketType, TicketStatus, Priority } from '@/lib/types/autotask'; import { useApi } from '@/lib/hooks/use-api'; import { ChevronRight, AlertCircle, Clock, CheckCircle, Ticket } from 'lucide-react'; interface TicketListProps { resourceId?: number; companyId?: number; } export function TicketList({ resourceId, companyId }: TicketListProps) { const [statusLabels, setStatusLabels] = useState>({}); const [priorityLabels, setPriorityLabels] = useState>({}); let url = '/api/tickets'; if (resourceId) url += `?resourceId=${resourceId}`; else if (companyId) url += `?companyId=${companyId}`; const { data, loading, error, refetch } = useApi<{ tickets: TicketType[] }>(url); // Fetch picklist values for status and priority useEffect(() => { fetch('/api/picklists?entity=Tickets&field=status') .then(res => res.json()) .then(data => setStatusLabels(data.picklistValues || {})) .catch(console.error); fetch('/api/picklists?entity=Tickets&field=priority') .then(res => res.json()) .then(data => setPriorityLabels(data.picklistValues || {})) .catch(console.error); }, []); const getStatusBadge = (status: number) => { const label = statusLabels[status] || `Status ${status}`; let variant: 'default' | 'secondary' | 'destructive' | 'outline' = 'default'; let icon = null; switch (status) { case TicketStatus.New: variant = 'destructive'; icon = ; break; case TicketStatus.InProgress: variant = 'default'; icon = ; break; case TicketStatus.Complete: variant = 'secondary'; icon = ; break; default: variant = 'outline'; } return ( {icon} {label} ); }; const getPriorityBadge = (priority: number) => { const label = priorityLabels[priority] || `Priority ${priority}`; let variant: 'default' | 'secondary' | 'destructive' | 'outline' = 'default'; switch (priority) { case Priority.Critical: variant = 'destructive'; break; case Priority.High: variant = 'default'; break; case Priority.Medium: variant = 'secondary'; break; case Priority.Low: variant = 'outline'; break; } return {label}; }; if (loading) { return ( Tickets
{[1, 2, 3].map(i => ( ))}
); } if (error) { const isConfigError = error.includes('not configured') || error.includes('configuration'); return ( Tickets
{isConfigError ? 'API Configuration Required' : `Error loading tickets: ${error}`}
{isConfigError && (

The Autotask API is not configured. Please set up your credentials to start using the dashboard.

)} {!isConfigError && ( )}
); } const tickets = data?.tickets || []; return (
Tickets {tickets.length}
{tickets.length === 0 ? (
No tickets found
) : ( Number Title Status Priority Created Due {tickets.map((ticket) => ( {ticket.ticketNumber} {ticket.title} {getStatusBadge(ticket.status)} {getPriorityBadge(ticket.priority)} {format(new Date(ticket.createDate), 'MMM d, yyyy')} {ticket.dueDateTime ? format(new Date(ticket.dueDateTime), 'MMM d, yyyy') : '-'} ))}
)}
); }