@ticketboothapp/booking 1.2.122 → 1.2.124

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/CHANGE_BOOKING_BE_HANDOFF.md +15 -4
  2. package/package.json +1 -1
  3. package/src/components/booking/AdminChangeBookingContent.tsx +276 -0
  4. package/src/components/booking/AdminChangeBookingFlow.tsx +647 -6157
  5. package/src/components/booking/AdminChangeCheckoutDialogs.tsx +105 -0
  6. package/src/components/booking/AdminChangeCheckoutPanel.tsx +307 -0
  7. package/src/components/booking/AdminChangePricingPanel.tsx +244 -0
  8. package/src/components/booking/AdminChangeProductSwitcher.tsx +50 -0
  9. package/src/components/booking/AdminChangeReceiptComparison.tsx +167 -0
  10. package/src/components/booking/ChangeBookingCalendarPanel.tsx +126 -0
  11. package/src/components/booking/ChangeBookingCheckoutPanel.tsx +204 -0
  12. package/src/components/booking/ChangeBookingFlow.tsx +576 -4648
  13. package/src/components/booking/ChangeBookingItineraryPanel.tsx +115 -0
  14. package/src/components/booking/ChangeBookingQuoteStatusPlaceholder.tsx +57 -0
  15. package/src/components/booking/ChangeBookingSelectionControlsPanel.tsx +157 -0
  16. package/src/components/booking/ChangeBookingTicketsAndAddOnsPanel.tsx +102 -0
  17. package/src/components/booking/CheckoutModal.tsx +68 -49
  18. package/src/components/booking/NewBookingFlow.tsx +485 -3505
  19. package/src/components/booking/PriceBreakdown.tsx +17 -3
  20. package/src/components/booking/PriceSummary.tsx +21 -3
  21. package/src/components/booking/PrivateShuttleAddOnsSection.tsx +102 -0
  22. package/src/components/booking/PrivateShuttleBookingFlow.tsx +407 -2788
  23. package/src/components/booking/PrivateShuttleCheckoutDialogs.tsx +106 -0
  24. package/src/components/booking/PrivateShuttleCheckoutSection.tsx +333 -0
  25. package/src/components/booking/PrivateShuttleItinerarySection.tsx +95 -0
  26. package/src/components/booking/PrivateShuttleMediaIntro.tsx +62 -0
  27. package/src/components/booking/PrivateShuttleOptionSection.tsx +81 -0
  28. package/src/components/booking/PrivateShuttlePassengerSection.tsx +148 -0
  29. package/src/components/booking/PrivateShuttlePickupSection.tsx +91 -0
  30. package/src/components/booking/PrivateShuttlePreferencesSection.tsx +75 -0
  31. package/src/components/booking/PrivateShuttleStartTimeSection.tsx +88 -0
  32. package/src/components/booking/StandardBookingCheckoutDialogs.tsx +106 -0
  33. package/src/components/booking/StandardBookingCheckoutSection.tsx +185 -0
  34. package/src/components/booking/StandardBookingItineraryPanel.tsx +125 -0
  35. package/src/components/booking/StandardBookingMediaIntro.tsx +69 -0
  36. package/src/components/booking/StandardBookingSelectionControlsPanel.tsx +236 -0
  37. package/src/components/booking/admin-change-customer-quote-runner.ts +119 -0
  38. package/src/components/booking/admin-change-flow-state-helpers.ts +124 -0
  39. package/src/components/booking/admin-change-payment-choice-runner.ts +172 -0
  40. package/src/components/booking/admin-change-provider-payload.ts +101 -0
  41. package/src/components/booking/change-booking-checkout-builders.ts +185 -0
  42. package/src/components/booking/change-booking-checkout-quote-runner.ts +207 -0
  43. package/src/components/booking/change-booking-flow-helpers.ts +706 -0
  44. package/src/components/booking/change-booking-payment-modal-builders.ts +151 -0
  45. package/src/components/booking/change-booking-quote-guards.ts +223 -0
  46. package/src/components/booking/change-booking-quote-state.ts +64 -0
  47. package/src/components/booking/pricing-v2-checkout-summary.ts +144 -0
  48. package/src/components/booking/private-shuttle-availability.ts +111 -0
  49. package/src/components/booking/private-shuttle-checkout-builders.ts +264 -0
  50. package/src/components/booking/private-shuttle-checkout-controller.ts +744 -0
  51. package/src/components/booking/private-shuttle-payment-choice-runner.ts +271 -0
  52. package/src/components/booking/private-shuttle-provider-change-runner.ts +73 -0
  53. package/src/components/booking/private-shuttle-reservation-runner.ts +260 -0
  54. package/src/components/booking/standard-booking-availability.ts +305 -0
  55. package/src/components/booking/standard-booking-checkout-builders.ts +289 -0
  56. package/src/components/booking/standard-booking-checkout-controller.ts +659 -0
  57. package/src/components/booking/standard-booking-payment-choice-runner.ts +274 -0
  58. package/src/components/booking/standard-booking-reservation-runner.ts +229 -0
  59. package/src/components/booking/use-private-shuttle-availability.ts +602 -0
  60. package/src/components/booking/use-standard-booking-availability.ts +806 -0
  61. package/src/components/booking/useActiveProductOptions.ts +26 -0
  62. package/src/components/booking/useAdminChangeCheckoutController.ts +806 -0
  63. package/src/components/booking/useAdminChangeOrderSummaryModel.ts +246 -0
  64. package/src/components/booking/useAdminChangePriceSummary.ts +416 -0
  65. package/src/components/booking/useAdminChangePricingDebugPanel.tsx +178 -0
  66. package/src/components/booking/useAdminChangeProductReset.ts +60 -0
  67. package/src/components/booking/useAdminChangeProducts.ts +102 -0
  68. package/src/components/booking/useAdminChangePromoDiscount.ts +235 -0
  69. package/src/components/booking/useAdminChangeProtectedPricing.ts +280 -0
  70. package/src/components/booking/useAdminChangeQuoteDisplayState.tsx +437 -0
  71. package/src/components/booking/useAdminChangeQuotePreview.ts +506 -0
  72. package/src/components/booking/useAdminChangeReceiptDerivation.ts +203 -0
  73. package/src/components/booking/useAdminCustomReceiptLines.ts +57 -0
  74. package/src/components/booking/useAdminProviderPricingAdjustments.ts +146 -0
  75. package/src/components/booking/useBookingAvailabilityAddOns.ts +54 -0
  76. package/src/components/booking/useBookingPromoAndQuantityController.ts +163 -0
  77. package/src/components/booking/useBookingQuantityCapTrim.ts +56 -0
  78. package/src/components/booking/useBookingViewItemAnalytics.ts +30 -0
  79. package/src/components/booking/useChangeBookingAddOnFloorController.ts +109 -0
  80. package/src/components/booking/useChangeBookingAutoSelections.ts +148 -0
  81. package/src/components/booking/useChangeBookingAvailabilities.ts +692 -0
  82. package/src/components/booking/useChangeBookingCheckoutController.ts +461 -0
  83. package/src/components/booking/useChangeBookingInitialHydration.ts +204 -0
  84. package/src/components/booking/useChangeBookingItineraryUiState.ts +133 -0
  85. package/src/components/booking/useChangeBookingPickupItinerary.ts +472 -0
  86. package/src/components/booking/useChangeBookingPriceSummary.ts +199 -0
  87. package/src/components/booking/useChangeBookingPromoDiscount.ts +218 -0
  88. package/src/components/booking/useChangeBookingProtectedPricing.ts +256 -0
  89. package/src/components/booking/useChangeBookingQuotePreview.ts +442 -0
  90. package/src/components/booking/useChangeBookingReceiptDerivation.ts +128 -0
  91. package/src/components/booking/useChangeBookingReceiptFloorController.ts +449 -0
  92. package/src/components/booking/useChangeBookingSelection.ts +362 -0
  93. package/src/components/booking/useChangeBookingSelectionDetails.ts +200 -0
  94. package/src/components/booking/useChangeBookingSummaryLines.ts +169 -0
  95. package/src/components/booking/usePrivateShuttlePriceSummary.ts +513 -0
  96. package/src/components/booking/usePrivateShuttlePromoController.ts +143 -0
  97. package/src/components/booking/usePrivateShuttlePromoDiscount.ts +124 -0
  98. package/src/components/booking/useSeedPromoCodeInput.ts +13 -0
  99. package/src/components/booking/useStandardBookingAutoSelections.ts +224 -0
  100. package/src/components/booking/useStandardBookingPickupItinerary.ts +473 -0
  101. package/src/components/booking/useStandardBookingPriceSummary.ts +438 -0
  102. package/src/components/booking/useStandardBookingPromoController.ts +258 -0
  103. package/src/components/booking/useStandardBookingPromoDiscount.ts +203 -0
  104. package/src/data/products-config.json +1 -1
  105. package/src/lib/booking/change-booking-server-preview.ts +134 -20
  106. package/src/lib/booking/change-flow-pricing.ts +31 -11
  107. package/src/lib/booking/checkout-breakdown.ts +66 -1
  108. package/src/lib/booking/pricing-config.ts +10 -0
  109. package/src/lib/booking/source-metadata.ts +58 -0
  110. package/src/lib/booking-api.ts +154 -3
  111. package/src/lib/pricing-v2-shadow.ts +272 -0
  112. package/test/change-booking-helpers.test.ts +206 -0
@@ -4,6 +4,16 @@ This document describes what the **booking API** should return so the website’
4
4
 
5
5
  Existing endpoint (names may vary in your stack): **`POST …/change/quote`** — response type `ChangeBookingQuoteResponse` in `@ticketboothapp/booking` / shared client types.
6
6
 
7
+ ## Current Pricing V2 alignment
8
+
9
+ As of 2026-07-05, the frontend types and visible change-booking preview helpers consume the broader Pricing V2 quote snapshot shape used by the backend:
10
+
11
+ - `pricingQuote` / `quote` may carry `PricingQuote`-style fields such as `grossSubtotal`, `discountTotal`, `paymentCreditTotal`, `netSubtotalBeforeTax`, `taxAmount`, `payableTotal`, `balanceDelta`, `amountToCharge`, `refundCandidate`, `lines`, `oldReceiptHash`, and `status`.
12
+ - Display helpers prefer server-authored V2 totals and canonical `PricingQuote.lines` when present, then fall back to the existing `newReceipt`, `proposed`, and cent fields.
13
+ - Gift-card credit is treated as `paymentCreditTotal` / payment credit in UI copy, not as a discount total. If a quote reports `paymentCreditTotal` without an explicit credit line, the package adds a display-only payment-credit row.
14
+ - Change-booking amount-due/refund display prefers `balanceDelta`, `amountToCharge`, and `refundCandidate` from the canonical quote before legacy `amountDueCents` / `priceDiff`.
15
+ - Public self-serve and admin/provider change flows clear stale quote totals while changed selections are being re-quoted and use canonical quote charge/refund fields for final payment/free-confirm guards.
16
+
7
17
  ## Already required for “totals confirmed” UI
8
18
 
9
19
  The frontend treats pricing as confirmed when the quote includes receipt-style totals (via `newReceipt` / `proposed` / `newTotalCents`, etc.) and `amountDueCents` or `priceDiff` for the amount owed. That unlocks subtotal/tax/total rows and replaces the pre-quote placeholder block.
@@ -67,9 +77,10 @@ Pickers show **catalog** prices by default (same booking **currency** as the ori
67
77
  - Values: **unit price in major units** (e.g. dollars), display currency.
68
78
  - When present, these update ticket **picker** display units on self‑serve change; totals must still follow **Rule A / Rule B** above unless the quote fully replaces breakdown.
69
79
 
70
- 2. **Line items** — `newReceipt.lineItems` or `proposed.lineItems` (fallback `original`)
71
- - Shape: `{ label?, amount?, type?, quantity? }`.
72
- - Mapped to checkout **`PriceSummary`** rows when present; otherwise checkout falls back to FE-built lines after totals confirm.
80
+ 2. **Line items** — `pricingQuote.lines` / `quote.lines`, then `newReceipt.lineItems` or `proposed.lineItems` (fallback `original`)
81
+ - Pricing V2 shape: `{ lineId?, label?, amount?, quantity?, type?, billable?, taxBehavior?, discountBehavior?, source?, metadata? }`.
82
+ - Legacy receipt shape: `{ label?, amount?, type?, quantity? }`.
83
+ - Mapped to checkout **`PriceSummary`** rows when present; non-billable Pricing V2 lines are omitted from the primary payable summary. Otherwise checkout falls back to FE-built lines after totals confirm.
73
84
 
74
85
  ### Additional optional maps
75
86
 
@@ -83,7 +94,7 @@ Pickers show **catalog** prices by default (same booking **currency** as the ori
83
94
  - **`clientProposedTotal`** (existing): FE still sends this as a hint for reconciliation; display should follow **quote response**, not the client-only cart.
84
95
  - **Currency**: align optional maps and line `amount` values with `currency` / receipt currency; change booking stays in the booking’s sold currency end-to-end on FE.
85
96
  - **Cancellation policy on change**: FE sends the booked policy on reserve/confirm paths; it is **not** chosen from product config during change — preserve the booking’s policy server-side unless product rules say otherwise.
86
- - **`serverPreview.completeness`**: the package sets this to **`full`** whenever a preview is built (informational); UI does not gate on `totals_only` vs `full`.
97
+ - **`serverPreview.completeness`**: the package sets this to **`full`** when mapped quote lines are available and **`totals_only`** when only totals are available. UI does not gate progression on this field.
87
98
 
88
99
  ---
89
100
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ticketboothapp/booking",
3
- "version": "1.2.122",
3
+ "version": "1.2.124",
4
4
  "private": false,
5
5
  "sideEffects": [
6
6
  "**/*.css",
@@ -0,0 +1,276 @@
1
+ import type { ComponentProps } from 'react';
2
+ import { AdminChangeCheckoutDialogs } from './AdminChangeCheckoutDialogs';
3
+ import { AdminChangeCheckoutPanel } from './AdminChangeCheckoutPanel';
4
+ import { AdminChangeProductSwitcher } from './AdminChangeProductSwitcher';
5
+ import { ChangeBookingCalendarPanel } from './ChangeBookingCalendarPanel';
6
+ import { ChangeBookingItineraryPanel } from './ChangeBookingItineraryPanel';
7
+ import { ChangeBookingSelectionControlsPanel } from './ChangeBookingSelectionControlsPanel';
8
+
9
+ type DialogProps = ComponentProps<typeof AdminChangeCheckoutDialogs>;
10
+ type ProductSwitcherProps = ComponentProps<typeof AdminChangeProductSwitcher>;
11
+ type CalendarProps = Omit<ComponentProps<typeof ChangeBookingCalendarPanel>, 'children'>;
12
+ type ItineraryProps = ComponentProps<typeof ChangeBookingItineraryPanel>;
13
+ type SelectionControlsProps = ComponentProps<typeof ChangeBookingSelectionControlsPanel>;
14
+ type CheckoutPanelProps = ComponentProps<typeof AdminChangeCheckoutPanel>;
15
+ type BuildAdminChangeBookingContentPropsParams =
16
+ DialogProps &
17
+ Omit<ProductSwitcherProps, 'error'> &
18
+ CalendarProps &
19
+ ItineraryProps &
20
+ SelectionControlsProps &
21
+ Omit<CheckoutPanelProps, 'error'> & {
22
+ isPartialLaunch: boolean;
23
+ checkoutVisible: boolean;
24
+ productSwitcherError?: ProductSwitcherProps['error'];
25
+ checkoutError: CheckoutPanelProps['error'];
26
+ };
27
+
28
+ function pickProps<T extends object, K extends keyof T>(source: T, keys: readonly K[]): Pick<T, K> {
29
+ return keys.reduce((picked, key) => {
30
+ picked[key] = source[key];
31
+ return picked;
32
+ }, {} as Pick<T, K>);
33
+ }
34
+
35
+ const dialogPropKeys = [
36
+ 'showAdminPaymentChoice',
37
+ 'adminChoiceData',
38
+ 'checkoutModalData',
39
+ 'showCheckoutModal',
40
+ 'checkoutClientSecret',
41
+ 'currency',
42
+ 'locale',
43
+ 'loading',
44
+ 'error',
45
+ 'onPayNow',
46
+ 'onConfirmWithoutPayment',
47
+ 'onAdminPaymentChoiceCancel',
48
+ 'onCheckoutClose',
49
+ 'onPaymentSubmitStart',
50
+ 'onPaymentSubmitError',
51
+ 'getSuccessUrl',
52
+ 't',
53
+ ] as const;
54
+
55
+ const productSwitcherPropKeys = [
56
+ 'visible',
57
+ 'products',
58
+ 'selectedProductId',
59
+ 'disabled',
60
+ 'onProductChange',
61
+ ] as const;
62
+
63
+ const calendarPropKeys = [
64
+ 'visibleAvailabilityCount',
65
+ 'loadingAvailabilities',
66
+ 'isFetchingMoreAvailabilities',
67
+ 'availabilitiesByDate',
68
+ 'selectedDate',
69
+ 'onSelectedDateChange',
70
+ 'onDateSelect',
71
+ 'suppressCalendarDateScroll',
72
+ 'contentRef',
73
+ 'useWindowScroll',
74
+ 'timezone',
75
+ 'earliestDate',
76
+ 'onVisibleRangeChange',
77
+ 'currency',
78
+ 'showCapacity',
79
+ 'extraDiscountPercent',
80
+ 'selectableSoldOutDate',
81
+ 'capDiscountBadgesToBookingDate',
82
+ 'partySizeRequiredForCalendarSelection',
83
+ 'getEffectiveVacancies',
84
+ 't',
85
+ ] as const;
86
+
87
+ const itineraryPropKeys = [
88
+ 'selectedDate',
89
+ 'hideItineraryBox',
90
+ 'activeOptions',
91
+ 'destinationsCount',
92
+ 'selectedAvailability',
93
+ 'selectedReturnOption',
94
+ 'pickupLocationId',
95
+ 'pickupLocationSkipped',
96
+ 'pickupLocationsCount',
97
+ 'quantities',
98
+ 'email',
99
+ 'firstName',
100
+ 'lastName',
101
+ 'getItineraryItems',
102
+ 'isItinerarySticky',
103
+ 'stickyTopPx',
104
+ 'isMobile',
105
+ 'useWindowScroll',
106
+ 'showTooltip',
107
+ 'selectedPickupLocation',
108
+ 'itineraryRef',
109
+ 't',
110
+ 'onTooltipToggle',
111
+ 'onTooltipShow',
112
+ ] as const;
113
+
114
+ const selectionControlsPropKeys = [
115
+ 'selectedDate',
116
+ 'selectedAvailability',
117
+ 'pickupTimes',
118
+ 'optionsMap',
119
+ 'hasAnyMostPopular',
120
+ 'isAdmin',
121
+ 'pickupLocationSkipped',
122
+ 't',
123
+ 'onTimeSelect',
124
+ 'returnOptions',
125
+ 'selectedReturnOption',
126
+ 'selectedReturnOptionForDisplay',
127
+ 'onSelectedReturnOptionChange',
128
+ 'getStaySummary',
129
+ 'pricing',
130
+ 'quantities',
131
+ 'totalQuantity',
132
+ 'selectedVacancies',
133
+ 'companyTimezone',
134
+ 'pickupVacancies',
135
+ 'returnVacancies',
136
+ 'currency',
137
+ 'locale',
138
+ 'isSimplifiedPricingView',
139
+ 'onQuantityChange',
140
+ 'minimumQuantities',
141
+ 'applyReceiptPaidFloors',
142
+ 'ticketUnitFloorByCategory',
143
+ 'addOns',
144
+ 'addOnSelections',
145
+ 'onAddOnSelectionsChange',
146
+ 'minimumTotalByAddOnId',
147
+ ] as const;
148
+
149
+ const checkoutPanelPropKeys = [
150
+ 'priceSummaryLines',
151
+ 'replacePriceSummary',
152
+ 'changeFlowAmountDue',
153
+ 'receiptSubtotal',
154
+ 'receiptTax',
155
+ 'receiptTotal',
156
+ 'originalReceipt',
157
+ 'priceSummaryLinesIncludeTaxRow',
158
+ 'isTaxIncludedInPrice',
159
+ 'taxRate',
160
+ 'currency',
161
+ 'locale',
162
+ 't',
163
+ 'showProviderPricingInlineEditor',
164
+ 'providerPricingUi',
165
+ 'providerQuotedLines',
166
+ 'debugPanel',
167
+ 'showChangeFlowManualPriceLines',
168
+ 'showAdminCustomLineEditor',
169
+ 'adminCustomReceiptLines',
170
+ 'onAddAdminCustomReceiptLine',
171
+ 'onUpdateAdminCustomReceiptLine',
172
+ 'onRemoveAdminCustomReceiptLine',
173
+ 'firstName',
174
+ 'lastName',
175
+ 'email',
176
+ 'onFirstNameChange',
177
+ 'onLastNameChange',
178
+ 'onEmailChange',
179
+ 'onClearError',
180
+ 'selectedDate',
181
+ 'pickupLocations',
182
+ 'destinations',
183
+ 'pickupLocationId',
184
+ 'pickupLocationSkipped',
185
+ 'selectedPickupLocation',
186
+ 'highlightedPickupLocationIds',
187
+ 'onPickupLocationIdChange',
188
+ 'onPickupLocationSkippedChange',
189
+ 'termsAccepted',
190
+ 'onTermsAcceptedChange',
191
+ 'onTermsAcceptedAtChange',
192
+ 'isAdmin',
193
+ 'skipConfirmationCommunications',
194
+ 'disableAutoCommunications',
195
+ 'onSkipConfirmationChange',
196
+ 'onDisableCommunicationsChange',
197
+ 'loading',
198
+ 'totalQuantity',
199
+ 'onCheckout',
200
+ 'submitLabel',
201
+ 'showCheckoutModal',
202
+ 'showAdminPaymentChoice',
203
+ 'hasEffectiveChangeSelection',
204
+ 'isChangeQuoteBlocked',
205
+ 'submitDisabled',
206
+ 'attributionSummary',
207
+ 'attributionConfirmLabel',
208
+ 'attributionConfirmed',
209
+ 'onAttributionConfirmedChange',
210
+ 'lineAmountInputs',
211
+ 'onLineAmountInputChange',
212
+ 'onLineAmountInputBlur',
213
+ 'onLineAmountReset',
214
+ 'lineLabelInputs',
215
+ ] as const;
216
+
217
+ export interface AdminChangeBookingContentProps {
218
+ dialogsProps: DialogProps;
219
+ isPartialLaunch: boolean;
220
+ productSwitcherProps: ProductSwitcherProps;
221
+ calendarProps: CalendarProps;
222
+ itineraryProps: ItineraryProps;
223
+ selectionControlsProps: SelectionControlsProps;
224
+ checkoutVisible: boolean;
225
+ checkoutPanelProps: CheckoutPanelProps;
226
+ }
227
+
228
+ export function buildAdminChangeBookingContentProps(
229
+ params: BuildAdminChangeBookingContentPropsParams,
230
+ ): AdminChangeBookingContentProps {
231
+ return {
232
+ dialogsProps: pickProps(params, dialogPropKeys) as DialogProps,
233
+ isPartialLaunch: params.isPartialLaunch,
234
+ productSwitcherProps: {
235
+ ...pickProps(params, productSwitcherPropKeys),
236
+ error: params.productSwitcherError,
237
+ } as ProductSwitcherProps,
238
+ calendarProps: pickProps(params, calendarPropKeys) as CalendarProps,
239
+ itineraryProps: pickProps(params, itineraryPropKeys) as ItineraryProps,
240
+ selectionControlsProps: pickProps(params, selectionControlsPropKeys) as SelectionControlsProps,
241
+ checkoutVisible: params.checkoutVisible,
242
+ checkoutPanelProps: {
243
+ ...pickProps(params, checkoutPanelPropKeys),
244
+ error: params.checkoutError,
245
+ } as CheckoutPanelProps,
246
+ };
247
+ }
248
+
249
+ export function AdminChangeBookingContent({
250
+ dialogsProps,
251
+ isPartialLaunch,
252
+ productSwitcherProps,
253
+ calendarProps,
254
+ itineraryProps,
255
+ selectionControlsProps,
256
+ checkoutVisible,
257
+ checkoutPanelProps,
258
+ }: AdminChangeBookingContentProps) {
259
+ return (
260
+ <div className="booking-flow-root space-y-8">
261
+ <AdminChangeCheckoutDialogs {...dialogsProps} />
262
+ {isPartialLaunch ? null : (
263
+ <div className="booking-calendar-section">
264
+ <AdminChangeProductSwitcher {...productSwitcherProps} />
265
+ <ChangeBookingCalendarPanel {...calendarProps}>
266
+ <div className="mt-6 space-y-6">
267
+ <ChangeBookingItineraryPanel {...itineraryProps} />
268
+ <ChangeBookingSelectionControlsPanel {...selectionControlsProps} />
269
+ {checkoutVisible ? <AdminChangeCheckoutPanel {...checkoutPanelProps} /> : null}
270
+ </div>
271
+ </ChangeBookingCalendarPanel>
272
+ </div>
273
+ )}
274
+ </div>
275
+ );
276
+ }