@ticketboothapp/booking 1.2.25-rc.0 → 1.2.27
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.
- package/package.json +11 -29
- package/src/components/booking/AddOnsSection.tsx +2 -2
- package/src/components/booking/AdminPaymentChoiceModal.tsx +1 -1
- package/src/components/booking/BookingDialog.tsx +31 -13
- package/src/components/booking/BookingFlow.tsx +32 -27
- package/src/components/booking/BookingFlowCollage.tsx +10 -6
- package/src/components/booking/BookingFlowPlaceholder.tsx +1 -1
- package/src/components/booking/BookingFlowPreview.tsx +18 -9
- package/src/components/booking/BookingProductGrid.tsx +55 -19
- package/src/components/booking/Calendar.module.css +19 -4
- package/src/components/booking/Calendar.tsx +13 -8
- package/src/components/booking/CancellationPolicySelector.tsx +2 -2
- package/src/components/booking/ChangeBookingDialog.tsx +22 -12
- package/src/components/booking/CheckoutForm.module.css +10 -0
- package/src/components/booking/CheckoutForm.tsx +10 -2
- package/src/components/booking/CheckoutModal.tsx +16 -14
- package/src/components/booking/DapFlowCollage.tsx +5 -2
- package/src/components/booking/DapTourDescription.tsx +4 -4
- package/src/components/booking/DependentAddOnBookingDialog.tsx +23 -16
- package/src/components/booking/DependentAddOnPaymentForm.tsx +10 -7
- package/src/components/booking/ItineraryBox.tsx +6 -6
- package/src/components/booking/ItineraryBuilder.tsx +1 -1
- package/src/components/booking/MealDrinkAddOnSelector.tsx +3 -3
- package/src/components/booking/PickupLocationSelector.tsx +20 -18
- package/src/components/booking/PickupTimeSelector.tsx +3 -3
- package/src/components/booking/PriceBreakdown.tsx +5 -5
- package/src/components/booking/PriceSummary.module.css +7 -0
- package/src/components/booking/PriceSummary.tsx +8 -7
- package/src/components/booking/PrivateShuttleBookingFlow.tsx +28 -19
- package/src/components/booking/PromoCodeInput.module.css +31 -25
- package/src/components/booking/PromoCodeInput.tsx +36 -24
- package/src/components/booking/ReturnTimeSelector.tsx +3 -3
- package/src/components/booking/TermsAcceptance.tsx +7 -2
- package/src/components/booking/TicketSelector.tsx +1 -1
- package/src/components/booking/TourDescription.tsx +11 -6
- package/src/components/booking/booking-flow.css +65 -4
- package/src/hooks/useBookingSourceMetadataFromLocation.ts +1 -1
- package/src/hooks/useIsBookingLaunchLive.ts +1 -1
- package/src/index.ts +26 -64
- package/src/providers/booking-dialog-provider.tsx +62 -53
- package/src/runtime/BookingHostContext.tsx +39 -0
- package/src/runtime/index.ts +13 -0
- package/src/runtime/types.ts +86 -0
- package/tsconfig.json +3 -5
- package/src/assets/icons/minus.svg +0 -7
- package/src/assets/icons/partner-logos/getyourguide.svg +0 -8
- package/src/assets/icons/plus.svg +0 -3
- package/src/colours.css +0 -23
- package/src/components/BookingDetails.module.css +0 -1591
- package/src/components/BookingDetails.tsx +0 -2264
- package/src/components/BookingWidget.tsx +0 -302
- package/src/components/ManageBookingView.tsx +0 -437
- package/src/components/PhoneInputWithCountry.module.css +0 -131
- package/src/components/PhoneInputWithCountry.tsx +0 -44
- package/src/components/PickupLocationDialog.module.css +0 -360
- package/src/components/PickupLocationDialog.tsx +0 -357
- package/src/components/PostBookingDependentAddOnUpsell.module.css +0 -174
- package/src/components/PostBookingDependentAddOnUpsell.tsx +0 -407
- package/src/components/button.css +0 -245
- package/src/components/button.tsx +0 -152
- package/src/components/colorable-svg.tsx +0 -29
- package/src/components/image.css +0 -29
- package/src/components/image.tsx +0 -113
- package/src/components/partner/PartnerBookingPage.module.css +0 -130
- package/src/components/partner/PartnerBookingPage.tsx +0 -390
- package/src/components/partner/PartnerBookingPageWithBrowserMetadata.tsx +0 -45
- package/src/components/product-tag.module.css +0 -30
- package/src/components/product-tag.tsx +0 -34
- package/src/components/product-theme-pages/image-modal.tsx +0 -248
- package/src/components/product-theme-pages/photo-gallery.module.css +0 -200
- package/src/components/terms/TermsContent.tsx +0 -178
- package/src/components/value-pill.module.css +0 -59
- package/src/components/value-pill.tsx +0 -46
- package/src/constants/images.ts +0 -556
- package/src/constants/pill-values.ts +0 -210
- package/src/constants/products.ts +0 -155
- package/src/contexts/AvailabilitiesCacheContext.tsx +0 -125
- package/src/contexts/CompanyContext.tsx +0 -70
- package/src/data/dap-descriptions/session-couples-families-friends.en.json +0 -61
- package/src/data/dap-descriptions/session-elopements.en.json +0 -60
- package/src/data/dap-descriptions/session-proposals.en.json +0 -60
- package/src/data/product-descriptions/afternoon-delight.en.json +0 -35
- package/src/data/product-descriptions/emerald-lake-escape.en.json +0 -68
- package/src/data/product-descriptions/lake-louise-adventure.en.json +0 -74
- package/src/data/product-descriptions/moraine-lake-adventure.en.json +0 -78
- package/src/data/product-descriptions/moraine-lake-sunrise-lake-louise-golden-hour.en.json +0 -65
- package/src/data/product-descriptions/moraine-lake-sunrise.en.json +0 -64
- package/src/data/product-descriptions/private-tour.en.json +0 -80
- package/src/data/product-descriptions/two-lakes-combo.en.json +0 -65
- package/src/data/products-config.json +0 -101
- package/src/lib/analytics.ts +0 -197
- package/src/lib/booking/booking-source.ts +0 -51
- package/src/lib/booking/checkout-breakdown.ts +0 -69
- package/src/lib/booking/correlation-id.ts +0 -46
- package/src/lib/booking/i18n/config.ts +0 -21
- package/src/lib/booking/i18n/index.tsx +0 -144
- package/src/lib/booking/i18n/messages/en.json +0 -236
- package/src/lib/booking/i18n/messages/fr.json +0 -236
- package/src/lib/booking/itinerary-display.ts +0 -36
- package/src/lib/booking/itinerary-labels.ts +0 -70
- package/src/lib/booking/location-calculations.ts +0 -43
- package/src/lib/booking/location-utils.ts +0 -165
- package/src/lib/booking/map-utils.ts +0 -153
- package/src/lib/booking/marker-icons.ts +0 -113
- package/src/lib/booking/normalize-booking-product-id.ts +0 -21
- package/src/lib/booking/pickup-location-types.ts +0 -25
- package/src/lib/booking/places-api.ts +0 -154
- package/src/lib/booking/pricing.ts +0 -466
- package/src/lib/booking/product-option-id.ts +0 -35
- package/src/lib/booking/source-metadata.ts +0 -226
- package/src/lib/booking/sunday-week.ts +0 -14
- package/src/lib/booking/theme.ts +0 -83
- package/src/lib/booking/trace-context.ts +0 -62
- package/src/lib/booking/utils.ts +0 -9
- package/src/lib/booking-api.ts +0 -1793
- package/src/lib/booking-constants.ts +0 -23
- package/src/lib/booking-ref.ts +0 -13
- package/src/lib/booking-types.ts +0 -36
- package/src/lib/currency.ts +0 -81
- package/src/lib/dap-descriptions.ts +0 -50
- package/src/lib/dap-itinerary-preview.ts +0 -315
- package/src/lib/dependent-add-on-api.ts +0 -434
- package/src/lib/env.ts +0 -96
- package/src/lib/firebase.ts +0 -20
- package/src/lib/job-application-api.ts +0 -83
- package/src/lib/manage-booking-embed-print.ts +0 -16
- package/src/lib/manage-booking-post-checkout.ts +0 -68
- package/src/lib/photo-dap-config.ts +0 -228
- package/src/lib/photo-packages.ts +0 -75
- package/src/lib/pickup/map-utils.ts +0 -56
- package/src/lib/pickup/marker-icons.ts +0 -19
- package/src/lib/product-descriptions.ts +0 -66
- package/src/lib/products-config.ts +0 -73
- package/src/providers/dependent-add-on-dialog-provider.tsx +0 -105
- package/src/radius.css +0 -5
- package/src/spacing.css +0 -7
- package/src/strings/en.json +0 -1774
- package/src/strings/es.json +0 -1573
- package/src/strings/fr.json +0 -1573
- package/src/strings/index.js +0 -23
- package/src/text-style.css +0 -56
- package/src/utils/currency-converter.ts +0 -101
package/src/strings/index.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import enStrings from './en.json';
|
|
2
|
-
import frStrings from './fr.json';
|
|
3
|
-
import esStrings from './es.json';
|
|
4
|
-
|
|
5
|
-
// This can be expanded later to handle different languages
|
|
6
|
-
const strings = {
|
|
7
|
-
en: enStrings,
|
|
8
|
-
fr: frStrings,
|
|
9
|
-
es: esStrings
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
export const SUPPORTED_LANGUAGES = ['en', 'fr', 'es'];
|
|
13
|
-
|
|
14
|
-
// Default to English for now
|
|
15
|
-
export const getStrings = (lang = 'en') => {
|
|
16
|
-
if (!strings[lang]) {
|
|
17
|
-
console.warn(`Language ${lang} not found, falling back to English`);
|
|
18
|
-
return strings.en;
|
|
19
|
-
}
|
|
20
|
-
return strings[lang];
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export default getStrings('en');
|
package/src/text-style.css
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
@import url('./colours.css');
|
|
2
|
-
|
|
3
|
-
/* @font-face rules live in the host app (e.g. viavia-website src/font-faces.css) so font files stay out of the npm bundle. */
|
|
4
|
-
|
|
5
|
-
/* Common styles for all headings */
|
|
6
|
-
h1, h2, h3, h4, h5, h6 {
|
|
7
|
-
font-family: 'Poppins';
|
|
8
|
-
font-weight: 800;
|
|
9
|
-
text-transform: lowercase;
|
|
10
|
-
color: var(--accent-orange);
|
|
11
|
-
text-align: center;
|
|
12
|
-
margin: 0;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
p, body {
|
|
16
|
-
font-weight: 400;
|
|
17
|
-
font-family: 'Figtree', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
|
18
|
-
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
|
19
|
-
sans-serif;
|
|
20
|
-
color: var(--primary-text);
|
|
21
|
-
margin: 0;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
a {
|
|
25
|
-
color: var(--accent-orange);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Desktop */
|
|
29
|
-
@media (min-width: 1024px) {
|
|
30
|
-
h1 { font-size: 3rem; }
|
|
31
|
-
h2 { font-size: 2.5rem; }
|
|
32
|
-
h3 { font-size: 2rem; }
|
|
33
|
-
h4 { font-size: 1.75rem; }
|
|
34
|
-
h5 { font-size: 1.5rem; }
|
|
35
|
-
p { font-size: 1.2rem; }
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* Tablet */
|
|
39
|
-
@media (min-width: 768px) and (max-width: 1023px) {
|
|
40
|
-
h1 { font-size: 2.5rem; }
|
|
41
|
-
h2 { font-size: 2rem; }
|
|
42
|
-
h3 { font-size: 1.75rem; }
|
|
43
|
-
h4 { font-size: 1.5rem; }
|
|
44
|
-
h5 { font-size: 1.25rem; }
|
|
45
|
-
p { font-size: 1.2rem; }
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Mobile */
|
|
49
|
-
@media (max-width: 768px) {
|
|
50
|
-
h1 { font-size: 2.5rem; }
|
|
51
|
-
h2 { font-size: 1.75rem; }
|
|
52
|
-
h3 { font-size: 1.5rem; }
|
|
53
|
-
h4 { font-size: 1.25rem; }
|
|
54
|
-
h5 { font-size: 1rem; }
|
|
55
|
-
p { font-size: 1rem; }
|
|
56
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
type SupportedCurrency = 'CAD' | 'USD' | 'AUD' | 'MXN' | 'EUR' | 'GBP';
|
|
2
|
-
|
|
3
|
-
interface CurrencyFormat {
|
|
4
|
-
symbol: string;
|
|
5
|
-
position: 'before' | 'after';
|
|
6
|
-
rate: number; // Exchange rate from CAD
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const currencyFormats: Record<SupportedCurrency, CurrencyFormat> = {
|
|
10
|
-
CAD: { symbol: 'CA$', position: 'before', rate: 1 },
|
|
11
|
-
USD: { symbol: 'US$', position: 'before', rate: 0.70 },
|
|
12
|
-
AUD: { symbol: 'AU$', position: 'before', rate: 1.11 },
|
|
13
|
-
MXN: { symbol: 'MX$', position: 'before', rate: 14.25 },
|
|
14
|
-
EUR: { symbol: '€', position: 'before', rate: 0.65 },
|
|
15
|
-
GBP: { symbol: '£', position: 'before', rate: 0.54 }
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
let cachedCurrency: SupportedCurrency | null = null;
|
|
19
|
-
|
|
20
|
-
export function getUserCurrency(): SupportedCurrency {
|
|
21
|
-
// Return CAD during server-side rendering
|
|
22
|
-
if (typeof window === 'undefined') {
|
|
23
|
-
return 'CAD';
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Use cached value if available
|
|
27
|
-
if (cachedCurrency) {
|
|
28
|
-
return cachedCurrency;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
try {
|
|
32
|
-
const locale = navigator.language;
|
|
33
|
-
const languages = navigator.languages || [];
|
|
34
|
-
|
|
35
|
-
// Try to find a Canadian locale in the language list
|
|
36
|
-
const hasCanadianLocale = languages.some(lang =>
|
|
37
|
-
lang.toLowerCase().includes('en-ca') ||
|
|
38
|
-
lang.toLowerCase().includes('fr-ca')
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
// Check for Canadian region/timezone hints
|
|
42
|
-
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
43
|
-
const isCanadianTimeZone = timeZone.includes('America') &&
|
|
44
|
-
['Vancouver', 'Edmonton', 'Calgary', 'Regina', 'Winnipeg', 'Toronto', 'Montreal', 'Halifax', 'St_Johns']
|
|
45
|
-
.some(city => timeZone.includes(city));
|
|
46
|
-
|
|
47
|
-
if (hasCanadianLocale || isCanadianTimeZone) {
|
|
48
|
-
cachedCurrency = 'CAD';
|
|
49
|
-
return cachedCurrency;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const country = locale.split('-')[1] || locale.split('_')[1];
|
|
53
|
-
|
|
54
|
-
// Map common locales to currencies
|
|
55
|
-
const currencyMap: Record<string, SupportedCurrency> = {
|
|
56
|
-
'CA': 'CAD',
|
|
57
|
-
'US': 'USD',
|
|
58
|
-
'AU': 'AUD',
|
|
59
|
-
'MX': 'MXN',
|
|
60
|
-
'GB': 'GBP'
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
// Check if we're in a European country
|
|
64
|
-
const euroCountries = ['DE', 'FR', 'IT', 'ES', 'NL', 'BE', 'AT', 'IE', 'FI', 'PT'];
|
|
65
|
-
|
|
66
|
-
// Check both country code and language for European detection
|
|
67
|
-
if (euroCountries.includes(country) ||
|
|
68
|
-
languages.some(lang => euroCountries.includes(lang.split('-')[1] || lang.split('_')[1]))) {
|
|
69
|
-
cachedCurrency = 'EUR';
|
|
70
|
-
return cachedCurrency;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
cachedCurrency = currencyMap[country] || 'CAD';
|
|
74
|
-
return cachedCurrency;
|
|
75
|
-
} catch {
|
|
76
|
-
cachedCurrency = 'CAD';
|
|
77
|
-
return cachedCurrency;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function formatPrice(cadPrice: string, language?: 'en' | 'es' | 'fr'): string {
|
|
82
|
-
// Extract numeric value from CAD price string
|
|
83
|
-
const numericValue = parseFloat(cadPrice.replace(/[^0-9.]/g, ''));
|
|
84
|
-
if (isNaN(numericValue)) return cadPrice;
|
|
85
|
-
|
|
86
|
-
const userCurrency = getUserCurrency();
|
|
87
|
-
const format = currencyFormats[userCurrency];
|
|
88
|
-
|
|
89
|
-
// Convert price
|
|
90
|
-
const convertedPrice = Math.round(numericValue * format.rate);
|
|
91
|
-
|
|
92
|
-
// Handle French formatting
|
|
93
|
-
if (language === 'fr') {
|
|
94
|
-
return `${convertedPrice}$CA`;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Format the price for other languages
|
|
98
|
-
return format.position === 'before'
|
|
99
|
-
? `${format.symbol}${convertedPrice}`
|
|
100
|
-
: `${convertedPrice}${format.symbol}`;
|
|
101
|
-
}
|