"use client" import { useState } from "react" import { useMutation } from "@tanstack/react-query" import { toast } from "sonner" import { cn } from "@/shared/lib/utils" import { useAuthApi } from "@/shared/useApi" import { useJobCard } from "./job-card-context" import { JOB_CARD_STATUSES, type JobCardStatus } from "./job-card.schema" import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/shared/components/ui/tooltip" import { CircleDot, LogIn, Loader, Pause, PackageCheck, CheckCircle2, } from "lucide-react" import { JobCardCheckInDialog } from "./job-card-check-in-dialog" import { JobCardDeliveryDialog } from "./job-card-delivery-dialog" // ── Status icon mapping ── const STATUS_ICONS: Record> = { draft: CircleDot, check_in: LogIn, in_progress: Loader, on_hold: Pause, ready_to_delivery: PackageCheck, delivered: CheckCircle2, } // ── Component ── type JobCardStatusStepperProps = { jobCardId: string } export function JobCardStatusStepper({ jobCardId }: JobCardStatusStepperProps) { const api = useAuthApi() const jobCard = useJobCard() const currentStatus = jobCard?.status ?? "draft" const currentIndex = JOB_CARD_STATUSES.findIndex((s) => s.value === currentStatus) const [checkInOpen, setCheckInOpen] = useState(false) const [deliveryOpen, setDeliveryOpen] = useState(false) const { mutate, isPending, variables } = useMutation({ mutationFn: async (status: JobCardStatus) => { const promise = api.jobCards.changeStatus(jobCardId, { status }) toast.promise(promise, { loading: "Updating status...", success: "Status updated successfully", error: "Failed to update status", }) return promise }, onSuccess: (_data, status) => { (jobCard as any)?.setStatus(status) }, }) const handleClick = (status: JobCardStatus) => { if (isPending) return if (status === currentStatus) return if (status === "check_in") { setCheckInOpen(true) return } if (status === "delivered") { setDeliveryOpen(true) return } mutate(status) } return (
{JOB_CARD_STATUSES.map((step, index) => { const Icon = STATUS_ICONS[step.value] ?? CircleDot const isActive = step.value === currentStatus const isCompleted = index < currentIndex const isTransitioning = isPending && variables === step.value const isClickable = !isPending && step.value !== currentStatus return (
{isActive ? `Current: ${step.label}` : `Change to ${step.label}`} {/* Connector line */} {index < JOB_CARD_STATUSES.length - 1 && (
)}
) })}
{ setCheckInOpen(false) ;(jobCard as any)?.setStatus("check_in") }} /> { setDeliveryOpen(false) ;(jobCard as any)?.setStatus("delivered") }} /> ) }