@voyant-travel/bookings-react 0.201.1 → 0.203.0

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 (76) hide show
  1. package/README.md +8 -8
  2. package/dist/admin/bookings-host.d.ts +1 -2
  3. package/dist/admin/bookings-host.js +2 -3
  4. package/dist/admin/index.d.ts +6 -44
  5. package/dist/admin/index.js +2 -65
  6. package/dist/components/booking-create-utils.d.ts +1 -1
  7. package/dist/components/booking-create-utils.js +5 -17
  8. package/dist/components/booking-dialog.d.ts +4 -19
  9. package/dist/components/booking-dialog.js +3 -12
  10. package/dist/components/booking-list.d.ts +1 -2
  11. package/dist/components/booking-list.js +5 -13
  12. package/dist/components/bookings-page.d.ts +1 -2
  13. package/dist/components/bookings-page.js +2 -2
  14. package/dist/hooks/booking-create-types.d.ts +34 -0
  15. package/dist/hooks/booking-create-types.js +1 -0
  16. package/dist/hooks/index.d.ts +2 -4
  17. package/dist/hooks/index.js +1 -4
  18. package/dist/hooks/use-booking-mutation.d.ts +3 -65
  19. package/dist/hooks/use-booking-mutation.js +1 -10
  20. package/dist/i18n/en-create-list.d.ts +0 -1
  21. package/dist/i18n/en-create-list.js +0 -1
  22. package/dist/i18n/en.d.ts +0 -1
  23. package/dist/i18n/messages-create-list.d.ts +0 -1
  24. package/dist/i18n/provider.d.ts +0 -2
  25. package/dist/i18n/ro-create-list.d.ts +0 -1
  26. package/dist/i18n/ro-create-list.js +0 -1
  27. package/dist/i18n/ro.d.ts +0 -1
  28. package/dist/journey/components/booking-journey-rules.d.ts +0 -22
  29. package/dist/journey/components/booking-journey-rules.js +0 -54
  30. package/dist/journey/components/journey-steps/payment-step.js +1 -1
  31. package/dist/journey/components/journey-steps/shared.d.ts +3 -3
  32. package/dist/journey/components/journey-steps.d.ts +1 -1
  33. package/dist/journey/components/journey-steps.js +1 -1
  34. package/dist/journey/index.d.ts +2 -12
  35. package/dist/journey/index.js +1 -11
  36. package/dist/journey/types.d.ts +3 -208
  37. package/dist/journey/types.js +2 -6
  38. package/dist/storefront/index.d.ts +0 -2
  39. package/dist/storefront/index.js +0 -2
  40. package/dist/ui.d.ts +0 -2
  41. package/dist/ui.js +0 -2
  42. package/package.json +33 -33
  43. package/dist/admin/booking-journey-host.d.ts +0 -23
  44. package/dist/admin/booking-journey-host.js +0 -280
  45. package/dist/admin/journey-billing-duplicate-warning.d.ts +0 -2
  46. package/dist/admin/journey-billing-duplicate-warning.js +0 -26
  47. package/dist/admin/journey-departure-picker.d.ts +0 -6
  48. package/dist/admin/journey-departure-picker.js +0 -91
  49. package/dist/admin/journey-travel-credit-picker.d.ts +0 -2
  50. package/dist/admin/journey-travel-credit-picker.js +0 -72
  51. package/dist/admin/journey-units-picker.d.ts +0 -10
  52. package/dist/admin/journey-units-picker.js +0 -60
  53. package/dist/admin/pages/booking-journey-page.d.ts +0 -11
  54. package/dist/admin/pages/booking-journey-page.js +0 -26
  55. package/dist/admin/pages/booking-new-page.d.ts +0 -15
  56. package/dist/admin/pages/booking-new-page.js +0 -50
  57. package/dist/components/booking-create-page.d.ts +0 -13
  58. package/dist/components/booking-create-page.js +0 -11
  59. package/dist/components/booking-create-sheet.d.ts +0 -34
  60. package/dist/components/booking-create-sheet.js +0 -815
  61. package/dist/hooks/use-booking-convert-mutation.d.ts +0 -80
  62. package/dist/hooks/use-booking-convert-mutation.js +0 -24
  63. package/dist/hooks/use-booking-create-mutation.d.ts +0 -336
  64. package/dist/hooks/use-booking-create-mutation.js +0 -43
  65. package/dist/hooks/use-booking-dual-create-mutation.d.ts +0 -337
  66. package/dist/hooks/use-booking-dual-create-mutation.js +0 -45
  67. package/dist/journey/components/booking-journey.d.ts +0 -2
  68. package/dist/journey/components/booking-journey.js +0 -485
  69. package/dist/storefront/storefront-booking-errors.d.ts +0 -12
  70. package/dist/storefront/storefront-booking-errors.js +0 -50
  71. package/dist/storefront/storefront-booking-journey.d.ts +0 -71
  72. package/dist/storefront/storefront-booking-journey.js +0 -327
  73. package/dist/storefront/storefront-booking-page.d.ts +0 -35
  74. package/dist/storefront/storefront-booking-page.js +0 -215
  75. package/dist/storefront/storefront-checkout-bodies.d.ts +0 -36
  76. package/dist/storefront/storefront-checkout-bodies.js +0 -69
package/README.md CHANGED
@@ -12,7 +12,7 @@ packages) are optional and only needed when you import those subpaths.
12
12
 
13
13
  `@voyant-travel/bookings-react` provides React Query hooks and provider utilities for Voyant bookings.
14
14
 
15
- It now includes public storefront flow helpers alongside the admin hooks:
15
+ It includes public booking-session helpers alongside the admin hooks:
16
16
 
17
17
  - `usePublicBookingSession`
18
18
  - `usePublicBookingSessionState`
@@ -20,13 +20,13 @@ It now includes public storefront flow helpers alongside the admin hooks:
20
20
  - `getPublicBookingSessionQueryOptions`
21
21
  - `getPublicBookingSessionStateQueryOptions`
22
22
 
23
- Those helpers target the public booking session contract for wizard-state
24
- storage and room-selection repricing.
23
+ Those helpers target existing public booking sessions for customer-portal
24
+ state and room-selection repricing. They do not create bookings.
25
25
 
26
- The `./storefront` subpath owns the reusable customer booking journey. Apps
27
- provide route navigation, localized customer copy, and selected market scope;
28
- the package owns public booking and checkout, contract preview, payment-policy
29
- resolution, and contract-variable mapping.
26
+ The `./journey` subpath retains composable booking-draft sections for trip and
27
+ staff-tool composition. The retired routed admin/storefront creation shell is
28
+ not part of the public API. The `./storefront` subpath retains only
29
+ contract-variable mapping for customer documents.
30
30
 
31
31
  ## UI components
32
32
 
@@ -50,7 +50,7 @@ that spacing when a shell owns the page chrome.
50
50
  ### Components
51
51
 
52
52
  - `BookingsPage`, `BookingDetailPage`
53
- - `BookingList`, `BookingDialog`, `BookingCreateSheet`, `BookingCancellationDialog`, `StatusChangeDialog`
53
+ - `BookingList`, `BookingDialog`, `BookingCancellationDialog`, `StatusChangeDialog`
54
54
  - `TravelerList`, `TravelerDialog`, `BookingItemList`, `BookingGroupSection`
55
55
  - `BookingPaymentsSummary`, `BookingPaymentScheduleList`, `BookingGuaranteeList`
56
56
  - `SupplierStatusList`, `BookingActivityTimeline`, `BookingNotes`
@@ -17,8 +17,7 @@ export interface BookingsHostProps {
17
17
  *
18
18
  * Proof-of-contract for semantic destinations (RFC §4.7): no host route
19
19
  * tree is imported — opening a booking resolves `"booking.detail"` and the
20
- * "New booking" button resolves `"booking.create"` through the resolvers
21
- * the workspace shell registered. The route file stays the thin binding
20
+ * detail route resolves through the workspace's semantic resolver. The route file stays the thin binding
22
21
  * layer for search-state (via {@link bookingsIndexSearchSchema} and the
23
22
  * `bookingsSearchToFilters`/`bookingsFiltersToSearch` helpers).
24
23
  */
@@ -7,12 +7,11 @@ import { BookingsPage } from "../components/bookings-page.js";
7
7
  *
8
8
  * Proof-of-contract for semantic destinations (RFC §4.7): no host route
9
9
  * tree is imported — opening a booking resolves `"booking.detail"` and the
10
- * "New booking" button resolves `"booking.create"` through the resolvers
11
- * the workspace shell registered. The route file stays the thin binding
10
+ * detail route resolves through the workspace's semantic resolver. The route file stays the thin binding
12
11
  * layer for search-state (via {@link bookingsIndexSearchSchema} and the
13
12
  * `bookingsSearchToFilters`/`bookingsFiltersToSearch` helpers).
14
13
  */
15
14
  export function BookingsHost({ initialFilters, onFiltersChange, headerActions, }) {
16
15
  const navigateTo = useAdminNavigate();
17
- return (_jsx(BookingsPage, { onCreateBooking: () => navigateTo("booking.create", {}), onBookingOpen: (booking) => navigateTo("booking.detail", { bookingId: booking.id }), headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange }));
16
+ return (_jsx(BookingsPage, { onBookingOpen: (booking) => navigateTo("booking.detail", { bookingId: booking.id }), headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange }));
18
17
  }
@@ -11,7 +11,7 @@ import type { BookingListFiltersState } from "../components/booking-list.js";
11
11
  * `@voyant-travel/admin`. Hosts register one resolver per key
12
12
  * (`satisfies AdminDestinationResolvers`).
13
13
  *
14
- * `booking.detail`/`booking.list`/`booking.create` are declared here even
14
+ * `booking.detail`/`booking.list` are declared here even
15
15
  * though bookings pages are their first consumers: other domains' packaged
16
16
  * pages navigate TO bookings through the same keys.
17
17
  */
@@ -24,8 +24,6 @@ declare module "@voyant-travel/admin" {
24
24
  bookingId: string;
25
25
  tab?: BookingDetailTabValue;
26
26
  };
27
- /** The "New booking" entry point (product picker → unified journey). */
28
- "booking.create": Record<string, never>;
29
27
  /** A CRM person's detail page. */
30
28
  "person.detail": {
31
29
  personId: string;
@@ -77,7 +75,6 @@ export type { BookingDetailHostProps, BookingDetailHostSlot, BookingDetailHostSl
77
75
  export { BookingDetailSkeleton } from "./booking-detail-skeleton.js";
78
76
  export type { BookingDocumentsTableProps } from "./booking-documents-table.js";
79
77
  export type { BookingInvoiceSheetProps } from "./booking-invoice-sheet.js";
80
- export type { BookingJourneyHostProps } from "./booking-journey-host.js";
81
78
  export type { BookingsHostProps } from "./bookings-host.js";
82
79
  export { BookingsListSkeleton } from "./bookings-list-skeleton.js";
83
80
  export type { PersonBookingsWidgetProps } from "./person-bookings-widget.js";
@@ -134,61 +131,26 @@ export declare const bookingDetailTabSchema: z.ZodEnum<{
134
131
  travelers: "travelers";
135
132
  activity: "activity";
136
133
  documents: "documents";
137
- suppliers: "suppliers";
138
- invoices: "invoices";
139
134
  finance: "finance";
135
+ invoices: "invoices";
136
+ suppliers: "suppliers";
140
137
  }>;
141
138
  /**
142
- * Search contract for the booking detail page. `productId`/`slotId` only
143
- * matter for the `"new"` pseudo-id: a deep link with a product pre-chosen
144
- * redirects into the unified booking journey (host route concern).
139
+ * Search contract for the booking detail page.
145
140
  */
146
141
  export declare const bookingDetailSearchSchema: z.ZodObject<{
147
- productId: z.ZodOptional<z.ZodString>;
148
- slotId: z.ZodOptional<z.ZodString>;
149
142
  tab: z.ZodOptional<z.ZodEnum<{
150
143
  metadata: "metadata";
151
144
  items: "items";
152
145
  travelers: "travelers";
153
146
  activity: "activity";
154
147
  documents: "documents";
155
- suppliers: "suppliers";
156
- invoices: "invoices";
157
148
  finance: "finance";
149
+ invoices: "invoices";
150
+ suppliers: "suppliers";
158
151
  }>>;
159
152
  }, z.core.$strip>;
160
153
  export type BookingDetailSearchParams = z.infer<typeof bookingDetailSearchSchema>;
161
- /**
162
- * Search contract for the packaged "New booking" entry page. A deep link
163
- * with `productId` pre-chosen (e.g. launched from a product page) forwards
164
- * straight into the unified booking journey; `slotId` pins the departure.
165
- */
166
- export declare const bookingNewSearchSchema: z.ZodObject<{
167
- productId: z.ZodOptional<z.ZodString>;
168
- slotId: z.ZodOptional<z.ZodString>;
169
- }, z.core.$strip>;
170
- export type BookingNewSearchParams = z.infer<typeof bookingNewSearchSchema>;
171
- /**
172
- * Search contract for the unified booking journey page — the URL projection
173
- * of the journey's entry state (provenance, pre-pinned departure/option/
174
- * rate, side-panel preview hints). Key PRESENCE is meaningful: callers pass
175
- * only the fields their selection actually carries.
176
- */
177
- export declare const bookingJourneySearchSchema: z.ZodObject<{
178
- sourceKind: z.ZodOptional<z.ZodString>;
179
- sourceConnectionId: z.ZodOptional<z.ZodString>;
180
- sourceRef: z.ZodOptional<z.ZodString>;
181
- departureId: z.ZodOptional<z.ZodString>;
182
- departureDate: z.ZodOptional<z.ZodString>;
183
- optionId: z.ZodOptional<z.ZodString>;
184
- roomTypeId: z.ZodOptional<z.ZodString>;
185
- ratePlanId: z.ZodOptional<z.ZodString>;
186
- board: z.ZodOptional<z.ZodString>;
187
- entityName: z.ZodOptional<z.ZodString>;
188
- entityImageUrl: z.ZodOptional<z.ZodString>;
189
- draftId: z.ZodOptional<z.ZodString>;
190
- }, z.core.$strip>;
191
- export type BookingJourneySearchParams = z.infer<typeof bookingJourneySearchSchema>;
192
154
  /**
193
155
  * Props contract of the booking detail PAGE component the "bookings-detail"
194
156
  * contribution mounts — the route-state subset of `BookingDetailHostProps`.
@@ -114,46 +114,11 @@ export const bookingDetailTabSchema = z.enum([
114
114
  "metadata",
115
115
  ]);
116
116
  /**
117
- * Search contract for the booking detail page. `productId`/`slotId` only
118
- * matter for the `"new"` pseudo-id: a deep link with a product pre-chosen
119
- * redirects into the unified booking journey (host route concern).
117
+ * Search contract for the booking detail page.
120
118
  */
121
119
  export const bookingDetailSearchSchema = z.object({
122
- productId: z.string().optional(),
123
- slotId: z.string().optional(),
124
120
  tab: bookingDetailTabSchema.optional(),
125
121
  });
126
- /**
127
- * Search contract for the packaged "New booking" entry page. A deep link
128
- * with `productId` pre-chosen (e.g. launched from a product page) forwards
129
- * straight into the unified booking journey; `slotId` pins the departure.
130
- */
131
- export const bookingNewSearchSchema = z.object({
132
- productId: z.string().optional(),
133
- slotId: z.string().optional(),
134
- });
135
- /**
136
- * Search contract for the unified booking journey page — the URL projection
137
- * of the journey's entry state (provenance, pre-pinned departure/option/
138
- * rate, side-panel preview hints). Key PRESENCE is meaningful: callers pass
139
- * only the fields their selection actually carries.
140
- */
141
- export const bookingJourneySearchSchema = z.object({
142
- sourceKind: z.string().min(1).optional(),
143
- sourceConnectionId: z.string().optional(),
144
- sourceRef: z.string().optional(),
145
- departureId: z.string().optional(),
146
- departureDate: z.string().optional(),
147
- optionId: z.string().optional(),
148
- roomTypeId: z.string().optional(),
149
- ratePlanId: z.string().optional(),
150
- board: z.string().optional(),
151
- entityName: z.string().optional(),
152
- entityImageUrl: z.string().optional(),
153
- /** Stable draft id — refresh-safe. When absent, the journey page
154
- * generates a fresh id on mount. */
155
- draftId: z.string().optional(),
156
- });
157
122
  /** Map the host-supplied route runtime onto the bookings data client shape. */
158
123
  function loaderClient(runtime) {
159
124
  return { baseUrl: runtime.baseUrl, fetcher: runtime.fetcher ?? defaultFetcher };
@@ -241,12 +206,9 @@ export function createBookingsAdminExtension(options = {}) {
241
206
  ssr: "data-only",
242
207
  validateSearch: (search) => bookingDetailSearchSchema.parse(search),
243
208
  pendingComponent: BookingDetailSkeleton,
244
- // The static `/bookings/new` route (the "bookings-new" contribution
245
- // below) outranks this param route for the `"new"` segment, but the
246
- // loader stays defensive — nothing to prefetch for a pseudo-id.
247
209
  loader: async ({ queryClient, runtime, params }) => {
248
210
  const id = params.id;
249
- if (!id || id === "new")
211
+ if (!id)
250
212
  return;
251
213
  // Dynamic import on purpose — see the index loader above.
252
214
  const { getBookingActivityQueryOptions, getBookingNotesQueryOptions, getBookingQueryOptions, getSupplierStatusesQueryOptions, getTravelersQueryOptions, } = await import("../query-options.js");
@@ -268,17 +230,6 @@ export function createBookingsAdminExtension(options = {}) {
268
230
  };
269
231
  },
270
232
  },
271
- {
272
- id: "bookings-new",
273
- path: `${basePath}/new`,
274
- title: bookings,
275
- // Route-backed destination (RFC §4.7 endgame): the key resolves by
276
- // pure path interpolation of this route (no params), so the host's
277
- // resolver is generated.
278
- destination: "booking.create",
279
- validateSearch: (search) => bookingNewSearchSchema.parse(search),
280
- page: () => import("./pages/booking-new-page.js"),
281
- },
282
233
  {
283
234
  id: "bookings-compose",
284
235
  path: `${basePath}/compose`,
@@ -287,20 +238,6 @@ export function createBookingsAdminExtension(options = {}) {
287
238
  // `trip.create` destination (see the page module).
288
239
  page: () => import("./pages/booking-compose-page.js"),
289
240
  },
290
- {
291
- id: "bookings-journey",
292
- // Deliberately OUTSIDE `basePath`: the journey mounts on the catalog
293
- // plane (`bookingJourney.start` hrefs point here), flat under the
294
- // workspace layout so it renders without catalog section nesting —
295
- // the same semantics the old escaped `catalog_.journey` route file
296
- // had. NOT destination-annotated: `bookingJourney.start` constructs
297
- // search params, which is beyond path interpolation — its resolver
298
- // stays hand-written in the host map.
299
- path: "/catalog/journey/$entityModule/$entityId",
300
- title: bookings,
301
- validateSearch: (search) => bookingJourneySearchSchema.parse(search),
302
- page: () => import("./pages/booking-journey-page.js"),
303
- },
304
241
  ],
305
242
  widgets: [
306
243
  {
@@ -60,6 +60,6 @@ export declare function getBookableDepartureSlots<TSlot extends DepartureSlotSea
60
60
  nowIso: string;
61
61
  optionId: string | null;
62
62
  }): TSlot[];
63
- export declare function itemLinesToRows(quantities: Record<string, number>, units: BookingCreateUnitLineRecord[], pricing: BookingCreatePricingRecord | null, travelerIndexesByUnitId?: Record<string, number[]>, travelerKeysByUnitId?: Record<string, string[]>, travelerIndexesByUnitAndCategoryId?: Record<string, Record<string, number[]>>, travelerKeysByUnitAndCategoryId?: Record<string, Record<string, string[]>>): BookingCreateItemLineInput[];
63
+ export declare function itemLinesToRows(quantities: Record<string, number>, units: BookingCreateUnitLineRecord[], pricing: BookingCreatePricingRecord | null, travelerKeysByUnitId?: Record<string, string[]>, travelerKeysByUnitAndCategoryId?: Record<string, Record<string, string[]>>): BookingCreateItemLineInput[];
64
64
  export declare function getSelectedSharedRoomUnitId(quantities: Record<string, number>): string | null;
65
65
  export {};
@@ -90,7 +90,7 @@ export function getBookableDepartureSlots(slots, options) {
90
90
  })
91
91
  .sort((left, right) => left.startsAt.localeCompare(right.startsAt));
92
92
  }
93
- export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUnitId = {}, travelerKeysByUnitId = {}, travelerIndexesByUnitAndCategoryId = {}, travelerKeysByUnitAndCategoryId = {}) {
93
+ export function itemLinesToRows(quantities, units, pricing, travelerKeysByUnitId = {}, travelerKeysByUnitAndCategoryId = {}) {
94
94
  const unitsById = new Map(units.map((unit) => [unit.optionUnitId, unit]));
95
95
  const unitNames = new Map(units.map((unit) => [unit.optionUnitId, unit.unitName]));
96
96
  const pricedLines = new Map((pricing?.lines ?? [])
@@ -121,13 +121,10 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
121
121
  return categoryPricedLines.map((pricedLine) => {
122
122
  const pricingCategoryId = pricedLine.pricingCategoryId;
123
123
  const categoryQuantity = Math.max(1, pricedLine.quantity ?? 1);
124
- const travelerIndexes = pricingCategoryId
125
- ? travelerIndexesByUnitAndCategoryId[optionUnitId]?.[pricingCategoryId]
126
- : undefined;
127
124
  const travelerKeys = pricingCategoryId
128
125
  ? travelerKeysByUnitAndCategoryId[optionUnitId]?.[pricingCategoryId]
129
126
  : undefined;
130
- const hasTravelerLinks = Boolean(travelerKeys?.length || travelerIndexes?.length);
127
+ const hasTravelerLinks = Boolean(travelerKeys?.length);
131
128
  return {
132
129
  clientLineKey: hasTravelerLinks
133
130
  ? `unit:${optionUnitId}:category:${pricingCategoryId ?? "default"}`
@@ -139,11 +136,7 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
139
136
  title: pricedLine.label ?? unitNames.get(optionUnitId) ?? null,
140
137
  unitSellAmountCents: pricedLine.unitAmountCents,
141
138
  totalSellAmountCents: pricedLine.totalAmountCents,
142
- ...(travelerKeys?.length
143
- ? { travelerKeys }
144
- : travelerIndexes?.length
145
- ? { travelerIndexes }
146
- : {}),
139
+ ...(travelerKeys?.length ? { travelerKeys } : {}),
147
140
  };
148
141
  });
149
142
  }
@@ -158,9 +151,8 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
158
151
  }
159
152
  const unitSellAmountCents = pricedLine?.unitAmountCents ??
160
153
  (totalSellAmountCents != null ? Math.floor(totalSellAmountCents / quantity) : null);
161
- const travelerIndexes = travelerIndexesByUnitId[optionUnitId];
162
154
  const travelerKeys = travelerKeysByUnitId[optionUnitId];
163
- const hasTravelerLinks = Boolean(travelerKeys?.length || travelerIndexes?.length);
155
+ const hasTravelerLinks = Boolean(travelerKeys?.length);
164
156
  return {
165
157
  // Server uses `clientLineKey` to look up this item after insert
166
158
  // and link it to travelers via `booking_item_travelers`. Only
@@ -172,11 +164,7 @@ export function itemLinesToRows(quantities, units, pricing, travelerIndexesByUni
172
164
  title: pricedLine?.label ?? unitNames.get(optionUnitId) ?? null,
173
165
  unitSellAmountCents,
174
166
  totalSellAmountCents,
175
- ...(travelerKeys?.length
176
- ? { travelerKeys }
177
- : travelerIndexes?.length
178
- ? { travelerIndexes }
179
- : {}),
167
+ ...(travelerKeys?.length ? { travelerKeys } : {}),
180
168
  };
181
169
  });
182
170
  }
@@ -2,26 +2,11 @@ import { type BookingRecord } from "../index.js";
2
2
  export interface BookingDialogProps {
3
3
  open: boolean;
4
4
  onOpenChange: (open: boolean) => void;
5
- booking?: BookingRecord;
5
+ booking: BookingRecord;
6
6
  onSuccess?: (booking: BookingRecord) => void;
7
- /**
8
- * Pre-seeds the product picker in create mode. Useful when opened from
9
- * a product detail page. Ignored when editing an existing booking.
10
- */
11
- defaultProductId?: string;
12
- /**
13
- * Pre-seeds and locks the departure picker in create mode. Useful when opened from
14
- * a slot allocation page. Ignored when editing an existing booking.
15
- */
16
- defaultSlotId?: string;
17
7
  }
18
8
  /**
19
- * Single booking dialog that handles both create and edit:
20
- * - Create (no `booking` prop): renders the rich product → option → person
21
- * picker flow via `BookingCreateSheet`, so the draft booking inherits
22
- * pricing, dates, and currency from the catalogue instead of being
23
- * hand-entered.
24
- * - Edit (with `booking` prop): renders the flat form below that patches
25
- * the existing row's metadata (status, amounts, dates, notes).
9
+ * Existing-booking editor. Booking creation is admitted only through the
10
+ * durable Finance Tool command.
26
11
  */
27
- export declare function BookingDialog({ open, onOpenChange, booking, onSuccess, defaultProductId, defaultSlotId, }: BookingDialogProps): import("react").JSX.Element;
12
+ export declare function BookingDialog({ open, onOpenChange, booking, onSuccess }: BookingDialogProps): import("react").JSX.Element;
@@ -11,7 +11,6 @@ import { useForm } from "react-hook-form";
11
11
  import { z } from "zod/v4";
12
12
  import { useBookingsUiMessagesOrDefault } from "../i18n/provider.js";
13
13
  import { useBookingMutation } from "../index.js";
14
- import { BookingCreateSheet } from "./booking-create-sheet.js";
15
14
  function createBookingFormSchema(messages) {
16
15
  return z.object({
17
16
  bookingNumber: z.string().min(1, messages.bookingDialog.validation.bookingNumberRequired),
@@ -42,18 +41,10 @@ const BOOKING_STATUS_VALUES = [
42
41
  const DEFAULT_CURRENCY = "EUR"; // i18n-literal-ok ISO default currency
43
42
  const noopCurrencyChange = (_value) => { };
44
43
  /**
45
- * Single booking dialog that handles both create and edit:
46
- * - Create (no `booking` prop): renders the rich product → option → person
47
- * picker flow via `BookingCreateSheet`, so the draft booking inherits
48
- * pricing, dates, and currency from the catalogue instead of being
49
- * hand-entered.
50
- * - Edit (with `booking` prop): renders the flat form below that patches
51
- * the existing row's metadata (status, amounts, dates, notes).
44
+ * Existing-booking editor. Booking creation is admitted only through the
45
+ * durable Finance Tool command.
52
46
  */
53
- export function BookingDialog({ open, onOpenChange, booking, onSuccess, defaultProductId, defaultSlotId, }) {
54
- if (!booking) {
55
- return (_jsx(BookingCreateSheet, { open: open, onOpenChange: onOpenChange, defaultProductId: defaultProductId, defaultSlotId: defaultSlotId, onCreated: onSuccess }));
56
- }
47
+ export function BookingDialog({ open, onOpenChange, booking, onSuccess }) {
57
48
  return (_jsx(BookingEditDialog, { open: open, onOpenChange: onOpenChange, booking: booking, onSuccess: onSuccess }));
58
49
  }
59
50
  function BookingEditDialog({ open, onOpenChange, booking, onSuccess }) {
@@ -28,7 +28,6 @@ export interface BookingListFiltersState {
28
28
  export interface BookingListProps {
29
29
  pageSize?: number;
30
30
  onSelectBooking?: (booking: BookingRecord) => void;
31
- onCreateBooking?: () => void;
32
31
  /**
33
32
  * Extra action(s) rendered next to the primary "New booking" button in
34
33
  * the filter bar. Templates use this to surface adjacent flows such as
@@ -46,4 +45,4 @@ export interface BookingListProps {
46
45
  */
47
46
  onFiltersChange?: (filters: BookingListFiltersState) => void;
48
47
  }
49
- export declare function BookingList({ pageSize, onSelectBooking, onCreateBooking, headerActions, initialFilters, onFiltersChange, }?: BookingListProps): React.JSX.Element;
48
+ export declare function BookingList({ pageSize, onSelectBooking, headerActions, initialFilters, onFiltersChange, }?: BookingListProps): React.JSX.Element;
@@ -1,13 +1,12 @@
1
1
  // agent-quality: file-size exception -- owner: bookings-react; existing UI surface stays co-located until a dedicated split preserves behavior and tests.
2
2
  "use client";
3
3
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
- import { Button } from "@voyant-travel/ui/components/button";
5
4
  import { Input } from "@voyant-travel/ui/components/input";
6
5
  import { Label } from "@voyant-travel/ui/components/label";
7
6
  import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@voyant-travel/ui/components/pagination";
8
7
  import { Skeleton } from "@voyant-travel/ui/components/skeleton";
9
8
  import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@voyant-travel/ui/components/table";
10
- import { ArrowDown, ArrowUp, ArrowUpDown, Plus, Search } from "lucide-react";
9
+ import { ArrowDown, ArrowUp, ArrowUpDown, Search } from "lucide-react";
11
10
  import * as React from "react";
12
11
  import { BOOKING_STATUS_ALL } from "../booking-list-constants.js";
13
12
  import { formatMessage, useBookingsUiI18nOrDefault, useBookingsUiMessagesOrDefault, } from "../i18n/provider.js";
@@ -52,7 +51,7 @@ const SORTABLE_COLUMNS = {
52
51
  };
53
52
  const SKELETON_ROW_COUNT = 6;
54
53
  const TABLE_COLUMN_COUNT = 8;
55
- export function BookingList({ pageSize = 25, onSelectBooking, onCreateBooking, headerActions, initialFilters, onFiltersChange, } = {}) {
54
+ export function BookingList({ pageSize = 25, onSelectBooking, headerActions, initialFilters, onFiltersChange, } = {}) {
56
55
  // Single bag of filter / sort / paging state so we can hand the host
57
56
  // a snapshot whenever anything changes. We seed once from
58
57
  // `initialFilters` and don't re-seed if the prop later mutates —
@@ -173,14 +172,7 @@ export function BookingList({ pageSize = 25, onSelectBooking, onCreateBooking, h
173
172
  const statusLabels = messages.common.bookingStatusLabels;
174
173
  return (_jsxs("div", { "data-slot": "booking-list", className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "relative min-w-[14rem] flex-1", children: [_jsx(Label, { htmlFor: "bookings-search", className: "sr-only", children: messages.bookingList.searchPlaceholder }), _jsx(Search, { className: "absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" }), _jsx(Input, { id: "bookings-search", placeholder: messages.bookingList.searchPlaceholder, value: search, onChange: (event) => updateFilters({ search: event.target.value, offset: 0 }), className: "pl-9" })] }), _jsx(BookingListFiltersPopover, { open: filterPopoverOpen, onOpenChange: setFilterPopoverOpen, activeFilterCount: activeFilterCount, status: status, onStatusChange: (next) => updateFilters({ status: next }), productId: productId, onProductIdChange: (next) =>
175
174
  // Slot picker is product-scoped; clear when the product changes.
176
- updateFilters({ productId: next, availabilitySlotId: null }), optionId: optionId, onOptionIdChange: (next) => updateFilters({ optionId: next }), availabilitySlotId: availabilitySlotId, onAvailabilitySlotIdChange: (next) => updateFilters({ availabilitySlotId: next }), supplierId: supplierId, onSupplierIdChange: (next) => updateFilters({ supplierId: next }), productCategoryId: productCategoryId, onProductCategoryIdChange: (next) => updateFilters({ productCategoryId: next }), personId: personId, onPersonIdChange: (next) => updateFilters({ personId: next }), organizationId: organizationId, onOrganizationIdChange: (next) => updateFilters({ organizationId: next }), dateRange: dateRange, onDateRangeChange: (next) => updateFilters({ dateFrom: next?.from ?? null, dateTo: next?.to ?? null }), paxMin: paxMin, onPaxMinChange: (next) => updateFilters({ paxMin: next }), paxMax: paxMax, onPaxMaxChange: (next) => updateFilters({ paxMax: next }), onFiltersChanged: resetOffset, hasActiveFilters: hasActiveFilters, onClearFilters: clearFilters }), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [headerActions, _jsxs(Button, { onClick: () => {
177
- if (onCreateBooking) {
178
- onCreateBooking();
179
- return;
180
- }
181
- setEditing(undefined);
182
- setDialogOpen(true);
183
- }, children: [_jsx(Plus, { className: "mr-2 size-4" }), messages.bookingList.newBooking] })] })] }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.bookingNumber, field: SORTABLE_COLUMNS.bookingNumber, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.createdAt, field: SORTABLE_COLUMNS.createdAt, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: columnMessages.lead }), _jsx(TableHead, { children: columnMessages.whatBooked }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.status, field: SORTABLE_COLUMNS.status, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.sellAmount, field: SORTABLE_COLUMNS.sellAmount, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.pax, field: SORTABLE_COLUMNS.pax, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.startDate, field: SORTABLE_COLUMNS.startDate, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) })] }) }), _jsx(TableBody, { children: showSkeleton ? (_jsx(BookingTableSkeleton, { rows: SKELETON_ROW_COUNT })) : isError ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-destructive", children: messages.bookingList.loadingError }) })) : bookings.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-muted-foreground", children: messages.bookingList.empty }) })) : (bookings.map((booking) => (_jsxs(TableRow, { onClick: () => handleSelect(booking), className: "cursor-pointer", children: [_jsx(TableCell, { className: "font-medium", children: booking.bookingNumber }), _jsx(TableCell, { children: formatBookingDateTime(booking.createdAt, formatDateTime) }), _jsx(TableCell, { children: formatLead(booking) }), _jsx(TableCell, { children: formatBookingItems(booking, messages.bookingList.itemsMore, messages.bookingList.itemDays) }), _jsx(TableCell, { children: _jsx(StatusBadge, { status: booking.status, children: statusLabels[booking.status] }) }), _jsx(TableCell, { children: booking.sellAmountCents == null
175
+ updateFilters({ productId: next, availabilitySlotId: null }), optionId: optionId, onOptionIdChange: (next) => updateFilters({ optionId: next }), availabilitySlotId: availabilitySlotId, onAvailabilitySlotIdChange: (next) => updateFilters({ availabilitySlotId: next }), supplierId: supplierId, onSupplierIdChange: (next) => updateFilters({ supplierId: next }), productCategoryId: productCategoryId, onProductCategoryIdChange: (next) => updateFilters({ productCategoryId: next }), personId: personId, onPersonIdChange: (next) => updateFilters({ personId: next }), organizationId: organizationId, onOrganizationIdChange: (next) => updateFilters({ organizationId: next }), dateRange: dateRange, onDateRangeChange: (next) => updateFilters({ dateFrom: next?.from ?? null, dateTo: next?.to ?? null }), paxMin: paxMin, onPaxMinChange: (next) => updateFilters({ paxMin: next }), paxMax: paxMax, onPaxMaxChange: (next) => updateFilters({ paxMax: next }), onFiltersChanged: resetOffset, hasActiveFilters: hasActiveFilters, onClearFilters: clearFilters }), _jsx("div", { className: "ml-auto flex items-center gap-2", children: headerActions })] }), _jsx("div", { className: "rounded-md border", children: _jsxs(Table, { children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.bookingNumber, field: SORTABLE_COLUMNS.bookingNumber, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.createdAt, field: SORTABLE_COLUMNS.createdAt, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: columnMessages.lead }), _jsx(TableHead, { children: columnMessages.whatBooked }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.status, field: SORTABLE_COLUMNS.status, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.sellAmount, field: SORTABLE_COLUMNS.sellAmount, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.pax, field: SORTABLE_COLUMNS.pax, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) }), _jsx(TableHead, { children: _jsx(SortHeader, { label: columnMessages.startDate, field: SORTABLE_COLUMNS.startDate, sortBy: sortBy, sortDir: sortDir, onSort: handleSort }) })] }) }), _jsx(TableBody, { children: showSkeleton ? (_jsx(BookingTableSkeleton, { rows: SKELETON_ROW_COUNT })) : isError ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-destructive", children: messages.bookingList.loadingError }) })) : bookings.length === 0 ? (_jsx(TableRow, { children: _jsx(TableCell, { colSpan: TABLE_COLUMN_COUNT, className: "h-24 text-center text-sm text-muted-foreground", children: messages.bookingList.empty }) })) : (bookings.map((booking) => (_jsxs(TableRow, { onClick: () => handleSelect(booking), className: "cursor-pointer", children: [_jsx(TableCell, { className: "font-medium", children: booking.bookingNumber }), _jsx(TableCell, { children: formatBookingDateTime(booking.createdAt, formatDateTime) }), _jsx(TableCell, { children: formatLead(booking) }), _jsx(TableCell, { children: formatBookingItems(booking, messages.bookingList.itemsMore, messages.bookingList.itemDays) }), _jsx(TableCell, { children: _jsx(StatusBadge, { status: booking.status, children: statusLabels[booking.status] }) }), _jsx(TableCell, { children: booking.sellAmountCents == null
184
176
  ? "—"
185
177
  : `${formatNumber(booking.sellAmountCents / 100, {
186
178
  minimumFractionDigits: 2,
@@ -188,9 +180,9 @@ export function BookingList({ pageSize = 25, onSelectBooking, onCreateBooking, h
188
180
  })} ${booking.sellCurrency}` }), _jsx(TableCell, { children: booking.pax ?? "—" }), _jsx(TableCell, { className: "whitespace-nowrap", children: formatBookingDateRange(booking.startsAt ?? booking.startDate, booking.endsAt ?? booking.endDate, formatDate, locale) })] }, booking.id)))) })] }) }), _jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 text-sm text-muted-foreground", children: [_jsx("span", { children: formatMessage(messages.bookingList.showingSummary, {
189
181
  count: bookings.length,
190
182
  total,
191
- }) }), pageCount > 1 ? (_jsx(BookingListPagination, { page: page, pageCount: pageCount, previousLabel: messages.bookingList.previousPage, nextLabel: messages.bookingList.nextPage, onPageChange: (nextPage) => updateFilters({ offset: (nextPage - 1) * pageSize }) })) : null] }), _jsx(BookingDialog, { open: dialogOpen, onOpenChange: setDialogOpen, booking: editing, onSuccess: (booking) => {
183
+ }) }), pageCount > 1 ? (_jsx(BookingListPagination, { page: page, pageCount: pageCount, previousLabel: messages.bookingList.previousPage, nextLabel: messages.bookingList.nextPage, onPageChange: (nextPage) => updateFilters({ offset: (nextPage - 1) * pageSize }) })) : null] }), editing ? (_jsx(BookingDialog, { open: dialogOpen, onOpenChange: setDialogOpen, booking: editing, onSuccess: (booking) => {
192
184
  onSelectBooking?.(booking);
193
- } })] }));
185
+ } })) : null] }));
194
186
  }
195
187
  function BookingListPagination({ page, pageCount, previousLabel, nextLabel, onPageChange, }) {
196
188
  const canPrev = page > 1;
@@ -4,7 +4,6 @@ import { type BookingListFiltersState } from "./booking-list.js";
4
4
  export interface BookingsPageProps {
5
5
  pageSize?: number;
6
6
  onBookingOpen?: (booking: BookingRecord) => void;
7
- onCreateBooking?: () => void;
8
7
  /**
9
8
  * Extra action(s) rendered alongside the primary "New booking" button.
10
9
  * Templates pass adjacent flows (e.g. a "Compose trip" link) here.
@@ -15,4 +14,4 @@ export interface BookingsPageProps {
15
14
  initialFilters?: Partial<BookingListFiltersState>;
16
15
  onFiltersChange?: (filters: BookingListFiltersState) => void;
17
16
  }
18
- export declare function BookingsPage({ pageSize, onBookingOpen, onCreateBooking, headerActions, className, initialFilters, onFiltersChange, }?: BookingsPageProps): React.JSX.Element;
17
+ export declare function BookingsPage({ pageSize, onBookingOpen, headerActions, className, initialFilters, onFiltersChange, }?: BookingsPageProps): React.JSX.Element;
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { cn } from "@voyant-travel/ui/lib/utils";
4
4
  import { useBookingsUiMessagesOrDefault } from "../i18n/index.js";
5
5
  import { BookingList } from "./booking-list.js";
6
- export function BookingsPage({ pageSize, onBookingOpen, onCreateBooking, headerActions, className, initialFilters, onFiltersChange, } = {}) {
6
+ export function BookingsPage({ pageSize, onBookingOpen, headerActions, className, initialFilters, onFiltersChange, } = {}) {
7
7
  const messages = useBookingsUiMessagesOrDefault().bookingsPage;
8
- return (_jsxs("div", { "data-slot": "bookings-page", className: cn("flex flex-col gap-6", className), children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: messages.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.description })] }), _jsx(BookingList, { pageSize: pageSize, onSelectBooking: onBookingOpen, onCreateBooking: onCreateBooking, headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange })] }));
8
+ return (_jsxs("div", { "data-slot": "bookings-page", className: cn("flex flex-col gap-6", className), children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold tracking-tight", children: messages.title }), _jsx("p", { className: "text-sm text-muted-foreground", children: messages.description })] }), _jsx(BookingList, { pageSize: pageSize, onSelectBooking: onBookingOpen, headerActions: headerActions, initialFilters: initialFilters, onFiltersChange: onFiltersChange })] }));
9
9
  }
@@ -0,0 +1,34 @@
1
+ export interface BookingCreatePaymentScheduleInput {
2
+ scheduleType?: "deposit" | "installment" | "balance" | "hold" | "other";
3
+ status?: "pending" | "due" | "paid" | "waived" | "cancelled" | "expired";
4
+ dueDate: string;
5
+ currency: string;
6
+ amountCents: number;
7
+ notes?: string | null;
8
+ }
9
+ export interface BookingCreateItemLineInput {
10
+ clientLineKey?: string | null;
11
+ optionId?: string | null;
12
+ optionUnitId: string;
13
+ pricingCategoryId?: string | null;
14
+ quantity: number;
15
+ title?: string | null;
16
+ description?: string | null;
17
+ unitSellAmountCents?: number | null;
18
+ totalSellAmountCents?: number | null;
19
+ travelerKeys?: string[] | null;
20
+ }
21
+ export interface BookingCreateExtraLineInput {
22
+ clientLineKey?: string | null;
23
+ productExtraId: string;
24
+ optionExtraConfigId?: string | null;
25
+ name: string;
26
+ description?: string | null;
27
+ pricingMode?: string | null;
28
+ pricedPerPerson?: boolean | null;
29
+ quantity: number;
30
+ sellCurrency: string;
31
+ unitSellAmountCents?: number | null;
32
+ totalSellAmountCents?: number | null;
33
+ travelerKeys?: string[] | null;
34
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,11 +1,9 @@
1
+ export type { BookingCreateExtraLineInput, BookingCreateItemLineInput, BookingCreatePaymentScheduleInput, } from "./booking-create-types.js";
1
2
  export { type UseBookingOptions, useBooking } from "./use-booking.js";
2
3
  export { type UseBookingActionLedgerOptions, useBookingActionLedger, } from "./use-booking-action-ledger.js";
3
4
  export { type UseBookingActivityOptions, useBookingActivity } from "./use-booking-activity.js";
4
5
  export { type CancelBookingInput, useBookingCancelMutation, } from "./use-booking-cancel-mutation.js";
5
- export { type ConvertProductToBookingInput, useBookingConvertMutation, } from "./use-booking-convert-mutation.js";
6
- export { type BookingCreateExtraLineInput, type BookingCreateGroupMembershipInput, type BookingCreateInput, type BookingCreateItemLineInput, type BookingCreatePaymentScheduleInput, type BookingCreateResult, type BookingCreateTravelCreditRedemptionInput, type BookingCreateTravelerInput, useBookingCreateMutation, } from "./use-booking-create-mutation.js";
7
6
  export { type CreateBookingTravelerDocumentInput, type UseBookingTravelerDocumentsOptions, useBookingTravelerDocumentMutation, useBookingTravelerDocuments, } from "./use-booking-documents.js";
8
- export { type DualCreateBookingInput, type DualCreateBookingResult, type DualCreateGroupInput, type DualCreateSubBookingInput, useBookingDualCreateMutation, } from "./use-booking-dual-create-mutation.js";
9
7
  export { type UseBookingGroupOptions, useBookingGroup } from "./use-booking-group.js";
10
8
  export { type UseBookingGroupForBookingOptions, useBookingGroupForBooking, } from "./use-booking-group-for-booking.js";
11
9
  export { type AddBookingGroupMemberInput, useBookingGroupMemberMutation, } from "./use-booking-group-member-mutation.js";
@@ -14,7 +12,7 @@ export { type UseBookingGroupsOptions, useBookingGroups } from "./use-booking-gr
14
12
  export { type CreateBookingItemInput, type UpdateBookingItemInput, useBookingItemMutation, } from "./use-booking-item-mutation.js";
15
13
  export { type AddItemTravelerInput, type UseBookingItemTravelersOptions, useBookingItemTravelerMutation, useBookingItemTravelers, } from "./use-booking-item-travelers.js";
16
14
  export { type UseBookingItemsOptions, useBookingItems } from "./use-booking-items.js";
17
- export { type CreateBookingInput, type UpdateBookingInput, useBookingMutation, } from "./use-booking-mutation.js";
15
+ export { type UpdateBookingInput, useBookingMutation } from "./use-booking-mutation.js";
18
16
  export { type CreateBookingNoteInput, useBookingNoteMutation, } from "./use-booking-note-mutation.js";
19
17
  export { type UseBookingNotesOptions, useBookingNotes } from "./use-booking-notes.js";
20
18
  export { type UseBookingPrimaryProductOptions, type UseBookingPrimaryProductResult, useBookingPrimaryProduct, } from "./use-booking-primary-product.js";
@@ -2,10 +2,7 @@ export { useBooking } from "./use-booking.js";
2
2
  export { useBookingActionLedger, } from "./use-booking-action-ledger.js";
3
3
  export { useBookingActivity } from "./use-booking-activity.js";
4
4
  export { useBookingCancelMutation, } from "./use-booking-cancel-mutation.js";
5
- export { useBookingConvertMutation, } from "./use-booking-convert-mutation.js";
6
- export { useBookingCreateMutation, } from "./use-booking-create-mutation.js";
7
5
  export { useBookingTravelerDocumentMutation, useBookingTravelerDocuments, } from "./use-booking-documents.js";
8
- export { useBookingDualCreateMutation, } from "./use-booking-dual-create-mutation.js";
9
6
  export { useBookingGroup } from "./use-booking-group.js";
10
7
  export { useBookingGroupForBooking, } from "./use-booking-group-for-booking.js";
11
8
  export { useBookingGroupMemberMutation, } from "./use-booking-group-member-mutation.js";
@@ -14,7 +11,7 @@ export { useBookingGroups } from "./use-booking-groups.js";
14
11
  export { useBookingItemMutation, } from "./use-booking-item-mutation.js";
15
12
  export { useBookingItemTravelerMutation, useBookingItemTravelers, } from "./use-booking-item-travelers.js";
16
13
  export { useBookingItems } from "./use-booking-items.js";
17
- export { useBookingMutation, } from "./use-booking-mutation.js";
14
+ export { useBookingMutation } from "./use-booking-mutation.js";
18
15
  export { useBookingNoteMutation, } from "./use-booking-note-mutation.js";
19
16
  export { useBookingNotes } from "./use-booking-notes.js";
20
17
  export { useBookingPrimaryProduct, } from "./use-booking-primary-product.js";