import { useState } from "react"; import { Download, Zap, FileText, Clock } from "lucide-react"; import { Stack, Text, Button } from "@mantine/core"; import { AllocateBookingWizard } from "@/components/trainScheduling/AllocateBookingWizard"; import type { BookingDetail } from "@/types/booking"; import { BookingActionsMenu } from "./BookingActionsMenu"; import { SectionCard } from "./detail/SectionCard"; import { toBookingListRow } from "@/features/bookings/mapBookingListRow"; import { canAllocateBooking } from "@/features/bookings/booking-actions.config"; import type { useBookingMutations } from "@/hooks/bookings/useBookings"; type Mutations = ReturnType; interface BookingActionsToolbarProps { booking: BookingDetail; mutations: Mutations; } /** Detail-page actions: primary toolbar + downloads. */ export function BookingActionsToolbar({ booking, mutations }: BookingActionsToolbarProps) { const row = toBookingListRow(booking); const { status } = booking; const [allocateOpen, setAllocateOpen] = useState(false); const downloadBlob = async (fn: () => Promise, filename: string) => { const blob = await fn(); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = filename; a.click(); URL.revokeObjectURL(url); }; if (status === "REJECTED" || status === "CANCELLED" || status === "COMPLETED") { return null; } if (status === "CHANGES_REQUESTED") { return ( No staff actions until resubmit. {booking.latestChangeRequestNote && ( {booking.latestChangeRequestNote} )} ); } if (["DRAFT", "PENDING_CONSOLIDATION", "CONSOLIDATED"].includes(status)) { return ( Monitor until the customer or system advances status. ); } if ( ["FULLY_EXECUTED", "PNR_GENERATED", "PAYMENT_VERIFICATION_IN_PROGRESS"].includes( status, ) ) { return ( Payment is completed by the customer. The booking status updates automatically once payment is confirmed, then moves to Operations. {status === "FULLY_EXECUTED" && ( )} ); } return ( Confirm each step before it is applied. setAllocateOpen(true)} /> {status === "CONTRACT_READY" && ( )} {canAllocateBooking(booking) ? ( setAllocateOpen(false)} /> ) : null} ); }