'use client'; import { ArrowRight, CalendarClock, Check, Clock3, Loader2, X, } from 'lucide-react'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '@/components/ui/alert-dialog'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import type { TicketExtensionRequest, TicketExtensionRequestsResponse, } from '@/types'; import { formatDate } from '@/utils/date'; import { MAX_EXTENSION_DECISION_NOTE_LENGTH, useExtensionRequestDecision, } from '../../../../extension-requests/hooks/useExtensionRequestDecision'; import { useTicketExtensionRequestQuery } from '../../../hooks/useTicketQueries'; import { ExtensionRequestHistoryDialog } from './ExtensionRequestHistoryDialog'; import { ExtensionRequestDetails, getLatestRequest, } from './TicketExtensionRequestPanel'; import { TicketActionCard } from './TicketActionCard'; function getPendingRequest(response: TicketExtensionRequestsResponse) { return response.items .filter((request) => request.status === 'pending') .reduce((latest, request) => { if (!latest) return request; return new Date(request.requested_at) > new Date(latest.requested_at) ? request : latest; }, null); } function getExtensionDays(request: TicketExtensionRequest) { const difference = new Date(request.requested_due_at).getTime() - new Date(request.current_due_at).getTime(); return Math.max(0, Math.ceil(difference / (24 * 60 * 60 * 1000))); } function Requester({ request }: { request: TicketExtensionRequest }) { const name = request.requested_by?.name ?? 'Assigned worker'; const initials = name .split(/\s+/) .slice(0, 2) .map((part) => part[0]?.toUpperCase()) .join(''); return (
{initials || 'W'}

Requested By

{name}

Requested On

{formatDate(request.requested_at)}

); } function ExtensionReviewForm({ ticketId, assignmentId, request, requests, }: { ticketId: string; assignmentId: number; request: TicketExtensionRequest; requests: TicketExtensionRequest[]; }) { const { note, setNote, noteError, selectedAction, isPending, isRejectConfirmationOpen, setIsRejectConfirmationOpen, submitDecision, requestRejection, } = useExtensionRequestDecision({ ticketId, assignmentId }); const extensionDays = getExtensionDays(request); return (

Request Summary

Current Due Date

{formatDate(request.current_due_at)}

Requested Due Date

{formatDate(request.requested_due_at)}

{extensionDays > 0 ? ( +{extensionDays} {extensionDays === 1 ? 'Day' : 'Days'} ) : null}

Reason

{request.reason}

Required for rejection and optional for approval.