@ticketboothapp/booking 0.1.23 → 1.2.24

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 (158) hide show
  1. package/package.json +2 -29
  2. package/src/index.ts +0 -79
  3. package/tsconfig.json +2 -8
  4. package/src/assets/icons/minus.svg +0 -7
  5. package/src/assets/icons/partner-logos/getyourguide.svg +0 -8
  6. package/src/assets/icons/plus.svg +0 -3
  7. package/src/colours.css +0 -23
  8. package/src/components/BookingDetails.module.css +0 -1591
  9. package/src/components/BookingDetails.tsx +0 -2264
  10. package/src/components/BookingWidget.tsx +0 -302
  11. package/src/components/ManageBookingView.tsx +0 -437
  12. package/src/components/PhoneInputWithCountry.module.css +0 -131
  13. package/src/components/PhoneInputWithCountry.tsx +0 -44
  14. package/src/components/PickupLocationDialog.module.css +0 -360
  15. package/src/components/PickupLocationDialog.tsx +0 -357
  16. package/src/components/PostBookingDependentAddOnUpsell.module.css +0 -174
  17. package/src/components/PostBookingDependentAddOnUpsell.tsx +0 -407
  18. package/src/components/booking/AddOnsSection.module.css +0 -10
  19. package/src/components/booking/AddOnsSection.tsx +0 -184
  20. package/src/components/booking/AdminPaymentChoiceModal.tsx +0 -98
  21. package/src/components/booking/BookingDialog.module.css +0 -643
  22. package/src/components/booking/BookingDialog.tsx +0 -356
  23. package/src/components/booking/BookingFlow.tsx +0 -4385
  24. package/src/components/booking/BookingFlowCollage.module.css +0 -148
  25. package/src/components/booking/BookingFlowCollage.tsx +0 -184
  26. package/src/components/booking/BookingFlowPlaceholder.module.css +0 -27
  27. package/src/components/booking/BookingFlowPlaceholder.tsx +0 -25
  28. package/src/components/booking/BookingFlowPreview.tsx +0 -51
  29. package/src/components/booking/BookingProductGrid.module.css +0 -359
  30. package/src/components/booking/BookingProductGrid.tsx +0 -497
  31. package/src/components/booking/Calendar.module.css +0 -616
  32. package/src/components/booking/Calendar.tsx +0 -1123
  33. package/src/components/booking/CancellationPolicySelector.module.css +0 -124
  34. package/src/components/booking/CancellationPolicySelector.tsx +0 -142
  35. package/src/components/booking/ChangeBookingDialog.tsx +0 -562
  36. package/src/components/booking/CheckoutForm.module.css +0 -244
  37. package/src/components/booking/CheckoutForm.tsx +0 -364
  38. package/src/components/booking/CheckoutModal.tsx +0 -451
  39. package/src/components/booking/CurrencySwitcher.tsx +0 -81
  40. package/src/components/booking/DapFlowCollage.tsx +0 -88
  41. package/src/components/booking/DapTourDescription.tsx +0 -35
  42. package/src/components/booking/DependentAddOnBookingDialog.tsx +0 -1350
  43. package/src/components/booking/DependentAddOnPaymentForm.tsx +0 -124
  44. package/src/components/booking/ErrorBoundary.tsx +0 -63
  45. package/src/components/booking/InfoTooltip.tsx +0 -108
  46. package/src/components/booking/ItineraryBox.module.css +0 -258
  47. package/src/components/booking/ItineraryBox.tsx +0 -550
  48. package/src/components/booking/ItineraryBuilder.tsx +0 -82
  49. package/src/components/booking/ItineraryPlaceholder.module.css +0 -45
  50. package/src/components/booking/ItineraryPlaceholder.tsx +0 -26
  51. package/src/components/booking/MealDrinkAddOnSelector.tsx +0 -338
  52. package/src/components/booking/PickupLocationSelector.module.css +0 -124
  53. package/src/components/booking/PickupLocationSelector.tsx +0 -1566
  54. package/src/components/booking/PickupTimeSelector.module.css +0 -134
  55. package/src/components/booking/PickupTimeSelector.tsx +0 -112
  56. package/src/components/booking/PriceBreakdown.tsx +0 -154
  57. package/src/components/booking/PriceSummary.tsx +0 -234
  58. package/src/components/booking/PrivateShuttleBookingFlow.module.css +0 -357
  59. package/src/components/booking/PrivateShuttleBookingFlow.tsx +0 -2662
  60. package/src/components/booking/PromoCodeInput.module.css +0 -166
  61. package/src/components/booking/PromoCodeInput.tsx +0 -99
  62. package/src/components/booking/ReturnTimeSelector.module.css +0 -173
  63. package/src/components/booking/ReturnTimeSelector.tsx +0 -145
  64. package/src/components/booking/TermsAcceptance.tsx +0 -111
  65. package/src/components/booking/TicketSelector.module.css +0 -164
  66. package/src/components/booking/TicketSelector.tsx +0 -199
  67. package/src/components/booking/TourDescription.module.css +0 -304
  68. package/src/components/booking/TourDescription.tsx +0 -273
  69. package/src/components/booking/booking-flow-ui.ts +0 -38
  70. package/src/components/booking/booking-flow.css +0 -944
  71. package/src/components/button.css +0 -245
  72. package/src/components/button.tsx +0 -152
  73. package/src/components/colorable-svg.tsx +0 -29
  74. package/src/components/image.css +0 -29
  75. package/src/components/image.tsx +0 -113
  76. package/src/components/partner/PartnerBookingPage.module.css +0 -130
  77. package/src/components/partner/PartnerBookingPage.tsx +0 -390
  78. package/src/components/partner/PartnerBookingPageWithBrowserMetadata.tsx +0 -45
  79. package/src/components/product-tag.module.css +0 -30
  80. package/src/components/product-tag.tsx +0 -34
  81. package/src/components/product-theme-pages/image-modal.tsx +0 -248
  82. package/src/components/product-theme-pages/photo-gallery.module.css +0 -200
  83. package/src/components/terms/TermsContent.tsx +0 -178
  84. package/src/components/value-pill.module.css +0 -59
  85. package/src/components/value-pill.tsx +0 -46
  86. package/src/constants/images.ts +0 -556
  87. package/src/constants/pill-values.ts +0 -210
  88. package/src/constants/products.ts +0 -155
  89. package/src/contexts/AvailabilitiesCacheContext.tsx +0 -125
  90. package/src/contexts/BookingAppContext.tsx +0 -134
  91. package/src/contexts/CompanyContext.tsx +0 -70
  92. package/src/data/dap-descriptions/session-couples-families-friends.en.json +0 -61
  93. package/src/data/dap-descriptions/session-elopements.en.json +0 -60
  94. package/src/data/dap-descriptions/session-proposals.en.json +0 -60
  95. package/src/data/product-descriptions/afternoon-delight.en.json +0 -35
  96. package/src/data/product-descriptions/emerald-lake-escape.en.json +0 -68
  97. package/src/data/product-descriptions/lake-louise-adventure.en.json +0 -74
  98. package/src/data/product-descriptions/moraine-lake-adventure.en.json +0 -78
  99. package/src/data/product-descriptions/moraine-lake-sunrise-lake-louise-golden-hour.en.json +0 -65
  100. package/src/data/product-descriptions/moraine-lake-sunrise.en.json +0 -64
  101. package/src/data/product-descriptions/private-tour.en.json +0 -80
  102. package/src/data/product-descriptions/two-lakes-combo.en.json +0 -65
  103. package/src/data/products-config.json +0 -101
  104. package/src/hooks/useBookingSourceMetadataFromLocation.ts +0 -21
  105. package/src/hooks/useIsBookingLaunchLive.ts +0 -49
  106. package/src/lib/analytics.ts +0 -197
  107. package/src/lib/booking/booking-source.ts +0 -51
  108. package/src/lib/booking/checkout-breakdown.ts +0 -69
  109. package/src/lib/booking/correlation-id.ts +0 -46
  110. package/src/lib/booking/i18n/config.ts +0 -21
  111. package/src/lib/booking/i18n/index.tsx +0 -144
  112. package/src/lib/booking/i18n/messages/en.json +0 -236
  113. package/src/lib/booking/i18n/messages/fr.json +0 -236
  114. package/src/lib/booking/itinerary-display.ts +0 -36
  115. package/src/lib/booking/itinerary-labels.ts +0 -70
  116. package/src/lib/booking/location-calculations.ts +0 -43
  117. package/src/lib/booking/location-utils.ts +0 -165
  118. package/src/lib/booking/map-utils.ts +0 -153
  119. package/src/lib/booking/marker-icons.ts +0 -113
  120. package/src/lib/booking/normalize-booking-product-id.ts +0 -21
  121. package/src/lib/booking/pickup-location-types.ts +0 -25
  122. package/src/lib/booking/places-api.ts +0 -154
  123. package/src/lib/booking/pricing.ts +0 -466
  124. package/src/lib/booking/product-option-id.ts +0 -35
  125. package/src/lib/booking/source-metadata.ts +0 -226
  126. package/src/lib/booking/sunday-week.ts +0 -14
  127. package/src/lib/booking/theme.ts +0 -83
  128. package/src/lib/booking/trace-context.ts +0 -62
  129. package/src/lib/booking/utils.ts +0 -9
  130. package/src/lib/booking-api.ts +0 -1793
  131. package/src/lib/booking-constants.ts +0 -23
  132. package/src/lib/booking-ref.ts +0 -13
  133. package/src/lib/booking-types.ts +0 -36
  134. package/src/lib/currency.ts +0 -81
  135. package/src/lib/dap-descriptions.ts +0 -50
  136. package/src/lib/dap-itinerary-preview.ts +0 -315
  137. package/src/lib/dependent-add-on-api.ts +0 -434
  138. package/src/lib/env.ts +0 -96
  139. package/src/lib/firebase.ts +0 -20
  140. package/src/lib/job-application-api.ts +0 -83
  141. package/src/lib/manage-booking-embed-print.ts +0 -16
  142. package/src/lib/manage-booking-post-checkout.ts +0 -68
  143. package/src/lib/photo-dap-config.ts +0 -228
  144. package/src/lib/photo-packages.ts +0 -75
  145. package/src/lib/pickup/map-utils.ts +0 -56
  146. package/src/lib/pickup/marker-icons.ts +0 -19
  147. package/src/lib/product-descriptions.ts +0 -66
  148. package/src/lib/products-config.ts +0 -73
  149. package/src/providers/booking-dialog-provider.tsx +0 -282
  150. package/src/providers/dependent-add-on-dialog-provider.tsx +0 -105
  151. package/src/radius.css +0 -5
  152. package/src/spacing.css +0 -7
  153. package/src/strings/en.json +0 -1774
  154. package/src/strings/es.json +0 -1573
  155. package/src/strings/fr.json +0 -1573
  156. package/src/strings/index.js +0 -23
  157. package/src/text-style.css +0 -56
  158. package/src/utils/currency-converter.ts +0 -101
@@ -1,184 +0,0 @@
1
- 'use client';
2
-
3
- import { formatCurrencyAmount } from '@/lib/currency';
4
- import type { AddOn } from '@/lib/booking-api';
5
- import { MealDrinkAddOnSelector, canUseMealDrinkSelector } from './MealDrinkAddOnSelector';
6
- import type { Currency } from './CurrencySwitcher';
7
- import styles from './AddOnsSection.module.css';
8
-
9
- export type AddOnSelection = { addOnId: string; variantId?: string; quantity?: number };
10
-
11
- interface AddOnsSectionProps {
12
- addOns: AddOn[];
13
- addOnSelections: AddOnSelection[];
14
- currency: Currency;
15
- locale: string;
16
- onSelectionsChange: (selections: AddOnSelection[] | ((prev: AddOnSelection[]) => AddOnSelection[])) => void;
17
- minimumTotalByAddOnId?: Map<string, number>;
18
- }
19
-
20
- export function AddOnsSection({
21
- addOns,
22
- addOnSelections,
23
- currency,
24
- locale,
25
- onSelectionsChange,
26
- minimumTotalByAddOnId,
27
- }: AddOnsSectionProps) {
28
- return (
29
- <div className="border-t border-stone-200 pt-6 space-y-4">
30
- <label className={styles.label}>
31
- Add-ons
32
- </label>
33
- {addOns.map((addOn) => {
34
- const minTotalForAddOn = minimumTotalByAddOnId?.get(addOn.addOnId) ?? 0;
35
- if (addOn.variantType === 'none') {
36
- const isSelected = addOnSelections.some((s) => s.addOnId === addOn.addOnId);
37
- const canToggleOff = minTotalForAddOn <= 0;
38
- return (
39
- <div key={addOn.addOnId}>
40
- <label className="block text-sm font-medium text-stone-700 mb-2">{addOn.name}</label>
41
- {addOn.description && (
42
- <p className="text-sm text-stone-500 mb-2">{addOn.description}</p>
43
- )}
44
- <button
45
- type="button"
46
- onClick={() => {
47
- onSelectionsChange((prev) => {
48
- if (isSelected) {
49
- if (!canToggleOff) return prev;
50
- return prev.filter((s) => s.addOnId !== addOn.addOnId);
51
- }
52
- return [...prev, { addOnId: addOn.addOnId, quantity: 1 }];
53
- });
54
- }}
55
- className={`flex items-center justify-between w-full p-4 rounded-lg border-2 text-left transition-colors ${
56
- isSelected ? 'border-emerald-500 bg-emerald-50' : 'border-stone-200 bg-white hover:border-stone-300'
57
- }`}
58
- >
59
- <span className="font-medium text-stone-900">
60
- {isSelected ? `Yes, add ${addOn.name}` : `No ${addOn.name}`}
61
- </span>
62
- <span className="text-sm font-semibold text-stone-700">
63
- +{formatCurrencyAmount(addOn.price ?? 0, currency, locale as 'en' | 'fr')}
64
- </span>
65
- </button>
66
- </div>
67
- );
68
- }
69
- if (addOn.variantType === 'multi_quantity' && addOn.variants?.length) {
70
- if (canUseMealDrinkSelector(addOn)) {
71
- return (
72
- <MealDrinkAddOnSelector
73
- key={addOn.addOnId}
74
- addOn={addOn}
75
- selections={addOnSelections}
76
- onSelectionsChange={onSelectionsChange}
77
- currency={currency}
78
- locale={locale as 'en' | 'fr'}
79
- minimumTotal={minTotalForAddOn}
80
- />
81
- );
82
- }
83
- return (
84
- <div key={addOn.addOnId}>
85
- <label className="block text-sm font-medium text-stone-700 mb-2">{addOn.name}</label>
86
- {addOn.description && (
87
- <p className="text-sm text-stone-500 mb-2">{addOn.description}</p>
88
- )}
89
- <div className="space-y-2">
90
- {addOn.variants.map((variant) => {
91
- const sel = addOnSelections.find((s) => s.addOnId === addOn.addOnId && s.variantId === variant.id);
92
- const qty = sel?.quantity ?? 0;
93
- const currentTotalForAddOn = addOnSelections
94
- .filter((s) => s.addOnId === addOn.addOnId)
95
- .reduce((sum, s) => sum + Math.max(1, Number(s.quantity) || 1), 0);
96
- const canDecrement = qty > 0 && currentTotalForAddOn > minTotalForAddOn;
97
- const price = (addOn.price ?? 0) + (variant.priceAdjustment ?? 0);
98
- return (
99
- <div key={variant.id} className="flex items-center gap-3 p-3 bg-stone-50 rounded-lg">
100
- <span className="text-sm text-stone-800">{variant.label}</span>
101
- <div className="flex items-center gap-2 shrink-0">
102
- <button
103
- type="button"
104
- onClick={() => {
105
- onSelectionsChange((prev) => {
106
- const next = Math.max(0, qty - 1);
107
- const rest = prev.filter((s) => !(s.addOnId === addOn.addOnId && s.variantId === variant.id));
108
- if (next > 0) return [...rest, { addOnId: addOn.addOnId, variantId: variant.id, quantity: next }];
109
- return rest;
110
- });
111
- }}
112
- disabled={!canDecrement}
113
- className="h-8 w-8 rounded-full border border-stone-300 bg-white text-stone-600 hover:bg-stone-50 disabled:opacity-50 disabled:cursor-not-allowed text-sm"
114
- >
115
-
116
- </button>
117
- <span className="w-6 text-center font-medium tabular-nums text-sm">{qty}</span>
118
- <button
119
- type="button"
120
- onClick={() => {
121
- onSelectionsChange((prev) => {
122
- const rest = prev.filter((s) => !(s.addOnId === addOn.addOnId && s.variantId === variant.id));
123
- return [...rest, { addOnId: addOn.addOnId, variantId: variant.id, quantity: qty + 1 }];
124
- });
125
- }}
126
- className="h-8 w-8 rounded-full border border-stone-300 bg-white text-stone-600 hover:bg-stone-50 text-sm"
127
- >
128
- +
129
- </button>
130
- <span className="text-sm font-medium text-stone-700 w-16 text-right">
131
- {formatCurrencyAmount(price, currency, locale as 'en' | 'fr')} ea
132
- </span>
133
- </div>
134
- </div>
135
- );
136
- })}
137
- </div>
138
- </div>
139
- );
140
- }
141
- if (addOn.variantType === 'single_choice' && addOn.variants?.length) {
142
- const sel = addOnSelections.find((s) => s.addOnId === addOn.addOnId);
143
- const hasLockedInitialSelection = minTotalForAddOn > 0;
144
- return (
145
- <div key={addOn.addOnId}>
146
- <label className="block text-sm font-medium text-stone-700 mb-2">{addOn.name}</label>
147
- {addOn.description && (
148
- <p className="text-sm text-stone-500 mb-2">{addOn.description}</p>
149
- )}
150
- <div className="space-y-2">
151
- {addOn.variants.map((variant) => {
152
- const isSelected = sel?.variantId === variant.id;
153
- const price = (addOn.price ?? 0) + (variant.priceAdjustment ?? 0);
154
- return (
155
- <button
156
- key={variant.id}
157
- type="button"
158
- onClick={() => {
159
- onSelectionsChange((prev) => {
160
- const rest = prev.filter((s) => s.addOnId !== addOn.addOnId);
161
- if (isSelected) return hasLockedInitialSelection ? prev : rest;
162
- return [...rest, { addOnId: addOn.addOnId, variantId: variant.id, quantity: 1 }];
163
- });
164
- }}
165
- className={`flex items-center justify-between w-full p-3 rounded-lg border-2 text-left transition-colors ${
166
- isSelected ? 'border-emerald-500 bg-emerald-50' : 'border-stone-200 bg-white hover:border-stone-300'
167
- }`}
168
- >
169
- <span className="text-sm font-medium text-stone-800">{variant.label}</span>
170
- <span className="text-sm font-semibold text-stone-700">
171
- +{formatCurrencyAmount(price, currency, locale as 'en' | 'fr')}
172
- </span>
173
- </button>
174
- );
175
- })}
176
- </div>
177
- </div>
178
- );
179
- }
180
- return null;
181
- })}
182
- </div>
183
- );
184
- }
@@ -1,98 +0,0 @@
1
- 'use client';
2
-
3
- import { createPortal } from 'react-dom';
4
- import { formatCurrencyAmount } from '@/lib/currency';
5
- import type { Currency } from './CurrencySwitcher';
6
-
7
- interface AdminPaymentChoiceModalProps {
8
- open: boolean;
9
- totalAmount: number;
10
- currency: Currency;
11
- loading: boolean;
12
- error: string;
13
- onPayNow: () => void;
14
- onConfirmWithoutPayment: () => void;
15
- onCancel: () => void;
16
- }
17
-
18
- /**
19
- * Provider / staff: pay now vs confirm without payment.
20
- * Uses the same overlay + card + Tailwind button pattern as {@link CheckoutModal}
21
- * so `.booking-flow-preflight button { background: transparent }` does not strip primary styles.
22
- */
23
- export function AdminPaymentChoiceModal({
24
- open,
25
- totalAmount,
26
- currency,
27
- loading,
28
- error,
29
- onPayNow,
30
- onConfirmWithoutPayment,
31
- onCancel,
32
- }: AdminPaymentChoiceModalProps) {
33
- if (!open) return null;
34
-
35
- const modal = (
36
- <div
37
- className="booking-flow-root booking-flow-preflight fixed inset-0 z-[10050] flex items-center justify-center p-4 bg-black/50"
38
- style={{ zIndex: 100_000 }}
39
- >
40
- <div className="bg-white rounded-xl shadow-xl max-w-lg w-full max-h-[90vh] overflow-hidden flex flex-col">
41
- <div className="p-6 border-b border-stone-200 flex-shrink-0">
42
- <div className="flex justify-between items-start gap-3">
43
- <h3 className="text-lg font-semibold text-stone-900 pr-2">
44
- Complete booking
45
- </h3>
46
- <button
47
- type="button"
48
- onClick={onCancel}
49
- className="text-stone-400 hover:text-stone-600 p-1 shrink-0 rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500/40"
50
- aria-label="Close"
51
- >
52
- <svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
53
- <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
54
- </svg>
55
- </button>
56
- </div>
57
- <p className="mt-3 text-sm text-stone-600 leading-relaxed">
58
- Pay now, or confirm without payment. The customer can pay the full balance from the Manage Booking page.
59
- </p>
60
- </div>
61
-
62
- <div className="p-6 flex flex-col gap-3 flex-1 min-h-0">
63
- {error ? (
64
- <p className="text-sm text-red-600" role="alert">
65
- {error}
66
- </p>
67
- ) : null}
68
-
69
- <button
70
- type="button"
71
- onClick={onPayNow}
72
- disabled={loading}
73
- className="w-full py-3 px-4 bg-emerald-600 text-white font-semibold rounded-lg hover:bg-emerald-700 disabled:opacity-50 disabled:cursor-not-allowed"
74
- >
75
- {loading ? 'Loading...' : `Pay now (${formatCurrencyAmount(totalAmount, currency)})`}
76
- </button>
77
- <button
78
- type="button"
79
- onClick={onConfirmWithoutPayment}
80
- disabled={loading}
81
- className="w-full py-3 px-4 border border-stone-300 text-stone-700 rounded-lg hover:bg-stone-50 font-medium disabled:opacity-50 disabled:cursor-not-allowed"
82
- >
83
- Confirm without payment
84
- </button>
85
- <button
86
- type="button"
87
- onClick={onCancel}
88
- disabled={loading}
89
- className="w-full py-2 text-sm text-stone-500 hover:text-stone-700 font-medium disabled:opacity-50"
90
- >
91
- Cancel
92
- </button>
93
- </div>
94
- </div>
95
- </div>
96
- );
97
- return typeof document !== 'undefined' ? createPortal(modal, document.body) : null;
98
- }