'use client'; import { useParams } from 'next/navigation'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { circulationService } from '@/lib/services/circulation.service'; import { Circulation, UpdateCirculationRoutingDto } from '@/types/circulation'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Avatar, AvatarFallback } from '@/components/ui/avatar'; import { ArrowLeft, RefreshCw, CheckCircle2 } from 'lucide-react'; import Link from 'next/link'; import { format } from 'date-fns'; import { toast } from 'sonner'; /** * Get initials from name */ function getInitials(firstName?: string, lastName?: string): string { const first = firstName?.charAt(0) || ''; const last = lastName?.charAt(0) || ''; return (first + last).toUpperCase() || '?'; } /** * Get status badge variant */ function getStatusVariant(status: string): 'default' | 'secondary' | 'destructive' | 'outline' { switch (status?.toUpperCase()) { case 'PENDING': return 'outline'; case 'IN_PROGRESS': return 'default'; case 'COMPLETED': return 'secondary'; case 'REJECTED': return 'destructive'; default: return 'outline'; } } export default function CirculationDetailPage() { const params = useParams(); const queryClient = useQueryClient(); const uuid = params.uuid as string; const { data: circulation, isLoading, error, } = useQuery({ queryKey: ['circulation', uuid], queryFn: () => circulationService.getByUuid(uuid), enabled: !!uuid, }); const completeMutation = useMutation({ mutationFn: ({ routingId, data }: { routingId: number; data: UpdateCirculationRoutingDto }) => circulationService.updateRouting(routingId, data), onSuccess: () => { toast.success('Task completed successfully'); queryClient.invalidateQueries({ queryKey: ['circulation', uuid] }); }, onError: () => { toast.error('Failed to update task status'); }, }); const handleComplete = (routingId: number) => { completeMutation.mutate({ routingId, data: { status: 'COMPLETED', comments: 'Completed via UI' }, }); }; if (isLoading) { return (
); } if (error || !circulation) { return (
Failed to load circulation details.
); } return (
{/* Header */}

{circulation.circulationNo}

{circulation.subject}

{circulation.statusCode}
{/* Info Card */} Circulation Details

Organization

{circulation.organization?.organizationName || '-'}

Created By

{circulation.creator ? `${circulation.creator.firstName || ''} ${circulation.creator.lastName || ''}`.trim() || circulation.creator.username : '-'}

Created At

{format(new Date(circulation.createdAt), 'dd MMM yyyy, HH:mm')}

{circulation.correspondence && (

Linked Document

{circulation.correspondence.correspondenceNumber}
)}
{/* Assignees/Routings */} Assignees {circulation.routings && circulation.routings.length > 0 ? (
{circulation.routings.map((routing) => (
{getInitials(routing.assignee?.firstName, routing.assignee?.lastName)}

{routing.assignee ? `${routing.assignee.firstName || ''} ${routing.assignee.lastName || ''}`.trim() || routing.assignee.username : 'Unassigned'}

Step {routing.stepNumber} {routing.comments && ` • ${routing.comments}`}

{routing.status} {routing.status === 'PENDING' && ( )}
))}
) : (

No assignees found

)}
); }