'use client'; import { useState } from 'react'; import { ArrowRight, CalendarClock, Check, Clock3, Loader2, X, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import type { TicketDetail, TicketExtensionRequest, TicketExtensionRequestsResponse, } from '@/types'; import { formatDate } from '@/utils/date'; import { useReviewTicketExtensionMutation, useTicketExtensionRequestQuery, } from '../../../hooks/useTicketQueries'; import { TicketActionCard } from './TicketActionCard'; const MAX_NOTE_LENGTH = 300; 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({ ticket, request, }: { ticket: TicketDetail; request: TicketExtensionRequest; }) { const [note, setNote] = useState(''); const [selectedAction, setSelectedAction] = useState< 'approve' | 'reject' | null >(null); const assignmentId = ticket.worker?.assignment_id as number; const reviewMutation = useReviewTicketExtensionMutation( ticket.id, assignmentId, ticket.defect_class, ); const extensionDays = getExtensionDays(request); const submitDecision = async (action: 'approve' | 'reject') => { setSelectedAction(action); try { await reviewMutation.mutateAsync({ action, note: note.trim() }); } finally { setSelectedAction(null); } }; 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}