"use client"; import { useParams, useRouter } 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 router = useRouter(); const queryClient = useQueryClient(); const id = params.id as string; const { data: circulation, isLoading, error } = useQuery({ queryKey: ["circulation", id], queryFn: () => circulationService.getById(id), enabled: !!id, }); const completeMutation = useMutation({ mutationFn: ({ routingId, data }: { routingId: number; data: UpdateCirculationRoutingDto }) => circulationService.updateRouting(routingId, data), onSuccess: () => { toast.success("Task completed successfully"); queryClient.invalidateQueries({ queryKey: ["circulation", id] }); }, 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?.organization_name || "-"}

Created By

{circulation.creator ? `${circulation.creator.first_name || ""} ${circulation.creator.last_name || ""}`.trim() || circulation.creator.username : "-"}

Created At

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

{circulation.correspondence && (

Linked Document

{circulation.correspondence.correspondence_number}
)}
{/* Assignees/Routings */} Assignees {circulation.routings && circulation.routings.length > 0 ? (
{circulation.routings.map((routing) => (
{getInitials( routing.assignee?.first_name, routing.assignee?.last_name )}

{routing.assignee ? `${routing.assignee.first_name || ""} ${routing.assignee.last_name || ""}`.trim() || routing.assignee.username : "Unassigned"}

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

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

No assignees found

)}
); }