@bigz-app/booking-widget 1.3.1 → 1.3.2
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/dist/booking-widget.js +117 -75
- package/dist/booking-widget.js.map +1 -1
- package/dist/components/UniversalBookingWidget.d.ts +0 -7
- package/dist/components/UniversalBookingWidget.d.ts.map +1 -1
- package/dist/components/booking/BookingSuccessModal.d.ts +3 -1
- package/dist/components/booking/BookingSuccessModal.d.ts.map +1 -1
- package/dist/index.cjs +117 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +117 -75
- package/dist/index.esm.js.map +1 -1
- package/dist/utils/google-ads-tracking.d.ts +9 -19
- package/dist/utils/google-ads-tracking.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -180,13 +180,6 @@ export interface UniversalBookingConfig {
|
|
|
180
180
|
buttonText?: string;
|
|
181
181
|
locale?: string;
|
|
182
182
|
showLanguagePicker?: boolean;
|
|
183
|
-
googleAds?: {
|
|
184
|
-
tagId?: string;
|
|
185
|
-
conversionId?: string;
|
|
186
|
-
conversionCurrency?: string;
|
|
187
|
-
includeValue?: boolean;
|
|
188
|
-
consent?: boolean;
|
|
189
|
-
};
|
|
190
183
|
promo?: PromoDialogConfig;
|
|
191
184
|
voucherValue?: number | number[];
|
|
192
185
|
voucherCategory?: number | number[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniversalBookingWidget.d.ts","sourceRoot":"","sources":["../../src/components/UniversalBookingWidget.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UniversalBookingWidget.d.ts","sourceRoot":"","sources":["../../src/components/UniversalBookingWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
+
import { type GoogleAdsConfig } from "../../utils/google-ads-tracking";
|
|
1
2
|
interface BookingSuccessModalProps {
|
|
2
3
|
isOpen: boolean;
|
|
3
4
|
onClose: () => void;
|
|
4
5
|
config: any;
|
|
5
6
|
onError?: (error: string) => void;
|
|
6
7
|
paymentIntentId?: string | null;
|
|
8
|
+
googleAdsConfig?: GoogleAdsConfig | null;
|
|
7
9
|
}
|
|
8
|
-
export declare const BookingSuccessModal: ({ isOpen, onClose, config, onError, paymentIntentId, }: BookingSuccessModalProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
export declare const BookingSuccessModal: ({ isOpen, onClose, config, onError, paymentIntentId, googleAdsConfig: googleAdsConfigProp, }: BookingSuccessModalProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
9
11
|
export {};
|
|
10
12
|
//# sourceMappingURL=BookingSuccessModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookingSuccessModal.d.ts","sourceRoot":"","sources":["../../../src/components/booking/BookingSuccessModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BookingSuccessModal.d.ts","sourceRoot":"","sources":["../../../src/components/booking/BookingSuccessModal.tsx"],"names":[],"mappings":"AAUA,OAAO,EAA6B,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAIlG,UAAU,wBAAwB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,mBAAmB,GAAI,8FAOjC,wBAAwB,mDA+zB1B,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -12028,121 +12028,145 @@ function BookingForm({ config, eventDetails, stripePromise, onSuccess, onError,
|
|
|
12028
12028
|
}
|
|
12029
12029
|
|
|
12030
12030
|
/**
|
|
12031
|
-
* Google Ads
|
|
12031
|
+
* Google Ads Tracking Utility
|
|
12032
12032
|
*
|
|
12033
|
-
*
|
|
12034
|
-
|
|
12035
|
-
/**
|
|
12036
|
-
* Check if gtag is available in current or parent window
|
|
12033
|
+
* Handles pageview tracking (widget load) and conversion tracking (successful booking).
|
|
12034
|
+
* Supports both direct gtag.js and GTM dataLayer setups.
|
|
12037
12035
|
*/
|
|
12038
12036
|
function isGtagAvailable() {
|
|
12039
|
-
if (typeof window === "undefined")
|
|
12037
|
+
if (typeof window === "undefined")
|
|
12040
12038
|
return false;
|
|
12041
|
-
|
|
12042
|
-
// Check current window
|
|
12043
|
-
if (typeof window.gtag === "function") {
|
|
12039
|
+
if (typeof window.gtag === "function")
|
|
12044
12040
|
return true;
|
|
12045
|
-
}
|
|
12046
|
-
// Check parent window (for iframe/widget scenarios)
|
|
12047
12041
|
if (window !== window.parent) {
|
|
12048
12042
|
try {
|
|
12049
|
-
if (typeof window.parent?.gtag === "function")
|
|
12043
|
+
if (typeof window.parent?.gtag === "function")
|
|
12050
12044
|
return true;
|
|
12051
|
-
}
|
|
12052
12045
|
}
|
|
12053
12046
|
catch {
|
|
12054
|
-
//
|
|
12047
|
+
// Cross-origin
|
|
12055
12048
|
}
|
|
12056
12049
|
}
|
|
12057
12050
|
return false;
|
|
12058
12051
|
}
|
|
12059
|
-
/**
|
|
12060
|
-
* Initialize gtag if not already available
|
|
12061
|
-
*/
|
|
12062
12052
|
function initializeGtag(tagId) {
|
|
12063
|
-
if (typeof window === "undefined")
|
|
12064
|
-
return;
|
|
12065
|
-
}
|
|
12066
|
-
// Skip if gtag already exists
|
|
12067
|
-
if (isGtagAvailable()) {
|
|
12053
|
+
if (typeof window === "undefined" || isGtagAvailable())
|
|
12068
12054
|
return;
|
|
12069
|
-
}
|
|
12070
|
-
// Initialize dataLayer and gtag function
|
|
12071
12055
|
window.dataLayer = window.dataLayer || [];
|
|
12072
12056
|
window.gtag = (...args) => {
|
|
12073
12057
|
window.dataLayer.push(args);
|
|
12074
12058
|
};
|
|
12075
|
-
// Set current timestamp
|
|
12076
12059
|
window.gtag("js", new Date());
|
|
12077
|
-
// Load gtag script
|
|
12078
12060
|
const script = document.createElement("script");
|
|
12079
12061
|
script.async = true;
|
|
12080
12062
|
script.src = `https://www.googletagmanager.com/gtag/js?id=${tagId}`;
|
|
12081
12063
|
document.head.appendChild(script);
|
|
12082
|
-
// Configure the tag
|
|
12083
12064
|
window.gtag("config", tagId, {
|
|
12084
12065
|
anonymize_ip: true,
|
|
12085
12066
|
allow_google_signals: false,
|
|
12086
12067
|
allow_ad_personalization_signals: false,
|
|
12087
12068
|
});
|
|
12088
12069
|
}
|
|
12089
|
-
|
|
12090
|
-
|
|
12091
|
-
|
|
12092
|
-
|
|
12093
|
-
|
|
12094
|
-
return;
|
|
12070
|
+
function getGtag() {
|
|
12071
|
+
if (typeof window === "undefined")
|
|
12072
|
+
return null;
|
|
12073
|
+
if (typeof window.gtag === "function") {
|
|
12074
|
+
return window.gtag;
|
|
12095
12075
|
}
|
|
12096
|
-
|
|
12097
|
-
// Try parent window gtag if current window doesn't have it
|
|
12098
|
-
if (typeof gtag !== "function" && window !== window.parent) {
|
|
12076
|
+
if (window !== window.parent) {
|
|
12099
12077
|
try {
|
|
12100
|
-
|
|
12078
|
+
const parentGtag = window.parent?.gtag;
|
|
12079
|
+
if (typeof parentGtag === "function")
|
|
12080
|
+
return parentGtag;
|
|
12101
12081
|
}
|
|
12102
12082
|
catch {
|
|
12103
|
-
//
|
|
12083
|
+
// Cross-origin
|
|
12104
12084
|
}
|
|
12105
12085
|
}
|
|
12106
|
-
|
|
12086
|
+
return null;
|
|
12087
|
+
}
|
|
12088
|
+
/**
|
|
12089
|
+
* Push an event to the dataLayer for GTM visibility,
|
|
12090
|
+
* then also fire via gtag for direct Google Ads tracking.
|
|
12091
|
+
*/
|
|
12092
|
+
function sendEvent(eventName, params) {
|
|
12093
|
+
if (typeof window === "undefined")
|
|
12107
12094
|
return;
|
|
12095
|
+
// GTM dataLayer push (object format — visible in Tag Assistant)
|
|
12096
|
+
window.dataLayer = window.dataLayer || [];
|
|
12097
|
+
window.dataLayer.push({
|
|
12098
|
+
event: eventName,
|
|
12099
|
+
...params,
|
|
12100
|
+
});
|
|
12101
|
+
// gtag call (array format — processed by gtag.js for Google Ads)
|
|
12102
|
+
const gtag = getGtag();
|
|
12103
|
+
if (gtag) {
|
|
12104
|
+
gtag("event", eventName, params);
|
|
12108
12105
|
}
|
|
12109
|
-
|
|
12110
|
-
|
|
12106
|
+
}
|
|
12107
|
+
function sendConversion(config) {
|
|
12108
|
+
const params = {
|
|
12111
12109
|
send_to: `${config.tagId}/${config.conversionId}`,
|
|
12112
12110
|
};
|
|
12113
|
-
// Add optional parameters
|
|
12114
12111
|
if (config.conversionValue !== undefined) {
|
|
12115
|
-
|
|
12112
|
+
params.value = config.conversionValue;
|
|
12116
12113
|
}
|
|
12117
12114
|
if (config.conversionCurrency) {
|
|
12118
|
-
|
|
12115
|
+
params.currency = config.conversionCurrency;
|
|
12119
12116
|
}
|
|
12120
12117
|
if (config.transactionId) {
|
|
12121
|
-
|
|
12118
|
+
params.transaction_id = config.transactionId;
|
|
12122
12119
|
}
|
|
12123
|
-
|
|
12124
|
-
gtag("event", "conversion", conversionData);
|
|
12120
|
+
sendEvent("conversion", params);
|
|
12125
12121
|
}
|
|
12126
12122
|
/**
|
|
12127
|
-
*
|
|
12128
|
-
* Waits 1500ms, checks/initializes gtag, then sends conversion
|
|
12123
|
+
* Track widget pageview (fired once on widget mount).
|
|
12129
12124
|
*/
|
|
12130
|
-
function
|
|
12131
|
-
|
|
12132
|
-
if (!config.tagId || !config.conversionId) {
|
|
12125
|
+
function handleGoogleAdsPageview(tagId, consent) {
|
|
12126
|
+
if (!tagId || false || typeof window === "undefined")
|
|
12133
12127
|
return;
|
|
12128
|
+
if (!isGtagAvailable()) {
|
|
12129
|
+
initializeGtag(tagId);
|
|
12134
12130
|
}
|
|
12135
|
-
|
|
12131
|
+
const fire = () => sendEvent("widget_pageview", {
|
|
12132
|
+
send_to: tagId,
|
|
12133
|
+
page_location: window.location.href,
|
|
12134
|
+
page_title: document.title,
|
|
12135
|
+
});
|
|
12136
|
+
if (isGtagAvailable()) {
|
|
12137
|
+
fire();
|
|
12138
|
+
return;
|
|
12139
|
+
}
|
|
12140
|
+
const script = document.querySelector(`script[src*="googletagmanager.com/gtag/js?id=${tagId}"]`);
|
|
12141
|
+
if (script) {
|
|
12142
|
+
script.addEventListener("load", fire, { once: true });
|
|
12143
|
+
}
|
|
12144
|
+
}
|
|
12145
|
+
/**
|
|
12146
|
+
* Handle Google Ads conversion tracking.
|
|
12147
|
+
* Waits 1500ms for the success page to settle, then fires.
|
|
12148
|
+
*/
|
|
12149
|
+
function handleGoogleAdsConversion(config) {
|
|
12150
|
+
if (!config.tagId || !config.conversionId)
|
|
12151
|
+
return;
|
|
12136
12152
|
setTimeout(() => {
|
|
12137
|
-
|
|
12138
|
-
|
|
12139
|
-
|
|
12153
|
+
if (isGtagAvailable()) {
|
|
12154
|
+
sendConversion(config);
|
|
12155
|
+
return;
|
|
12156
|
+
}
|
|
12157
|
+
initializeGtag(config.tagId);
|
|
12158
|
+
const script = document.querySelector(`script[src*="googletagmanager.com/gtag/js?id=${config.tagId}"]`);
|
|
12159
|
+
if (script) {
|
|
12160
|
+
script.addEventListener("load", () => sendConversion(config));
|
|
12161
|
+
script.addEventListener("error", () => sendConversion(config));
|
|
12162
|
+
}
|
|
12163
|
+
else {
|
|
12164
|
+
sendConversion(config);
|
|
12140
12165
|
}
|
|
12141
|
-
sendConversion(config);
|
|
12142
12166
|
}, 1500);
|
|
12143
12167
|
}
|
|
12144
12168
|
|
|
12145
|
-
const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId, }) => {
|
|
12169
|
+
const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId, googleAdsConfig: googleAdsConfigProp, }) => {
|
|
12146
12170
|
const t = useTranslations();
|
|
12147
12171
|
const { locale } = useLocale();
|
|
12148
12172
|
const timezone = useTimezone();
|
|
@@ -12191,20 +12215,16 @@ const BookingSuccessModal = ({ isOpen, onClose, config, onError, paymentIntentId
|
|
|
12191
12215
|
});
|
|
12192
12216
|
setPaymentStatus(data.stripePaymentIntent?.status || data.order.status);
|
|
12193
12217
|
const finalPaymentStatus = data.stripePaymentIntent?.status || data.order.status;
|
|
12218
|
+
const adsConfig = googleAdsConfigProp ?? data.googleAdsConfig;
|
|
12194
12219
|
if (finalPaymentStatus === "succeeded" &&
|
|
12195
|
-
|
|
12196
|
-
|
|
12197
|
-
config.googleAds?.consent !== false) {
|
|
12198
|
-
// Prepare conversion tracking data
|
|
12199
|
-
const conversionValue = data.order.total / 100;
|
|
12200
|
-
const transactionId = data.order.id;
|
|
12201
|
-
// Track the conversion
|
|
12220
|
+
adsConfig?.tagId &&
|
|
12221
|
+
adsConfig?.conversionId) {
|
|
12202
12222
|
handleGoogleAdsConversion({
|
|
12203
|
-
tagId:
|
|
12204
|
-
conversionId:
|
|
12205
|
-
conversionValue,
|
|
12206
|
-
conversionCurrency:
|
|
12207
|
-
transactionId,
|
|
12223
|
+
tagId: adsConfig.tagId,
|
|
12224
|
+
conversionId: adsConfig.conversionId,
|
|
12225
|
+
conversionValue: data.order.total / 100,
|
|
12226
|
+
conversionCurrency: adsConfig.conversionCurrency || "EUR",
|
|
12227
|
+
transactionId: data.order.id,
|
|
12208
12228
|
});
|
|
12209
12229
|
}
|
|
12210
12230
|
}
|
|
@@ -15469,6 +15489,13 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15469
15489
|
const [shouldRenderInstanceSelection, setShouldRenderInstanceSelection] = React.useState(false);
|
|
15470
15490
|
const [shouldRenderUpsells, setShouldRenderUpsells] = React.useState(false);
|
|
15471
15491
|
const [shouldRenderBookingForm, setShouldRenderBookingForm] = React.useState(false);
|
|
15492
|
+
// Google Ads config (received from API, set once from the first API response)
|
|
15493
|
+
const [googleAdsConfig, setGoogleAdsConfig] = React.useState(null);
|
|
15494
|
+
const extractGoogleAdsConfig = (data) => {
|
|
15495
|
+
if (!googleAdsConfig && data?.googleAdsConfig?.tagId) {
|
|
15496
|
+
setGoogleAdsConfig(data.googleAdsConfig);
|
|
15497
|
+
}
|
|
15498
|
+
};
|
|
15472
15499
|
// Promo dialog state
|
|
15473
15500
|
const [showPromoDialog, setShowPromoDialog] = React.useState(false);
|
|
15474
15501
|
const [widgetContainerRef, setWidgetContainerRef] = React.useState(null);
|
|
@@ -15552,6 +15579,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15552
15579
|
image: resolvedImage,
|
|
15553
15580
|
};
|
|
15554
15581
|
setVoucherConfig(mergedConfig);
|
|
15582
|
+
extractGoogleAdsConfig(data);
|
|
15555
15583
|
setVoucherEventTypes(data.eventTypes || []);
|
|
15556
15584
|
// Set system config for payment processing
|
|
15557
15585
|
if (data.paymentProvider) {
|
|
@@ -15574,6 +15602,14 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15574
15602
|
setIsLoadingVoucherConfig(false);
|
|
15575
15603
|
}
|
|
15576
15604
|
};
|
|
15605
|
+
// Fire widget pageview once when Google Ads config is received from API
|
|
15606
|
+
const pageviewFiredRef = React.useRef(false);
|
|
15607
|
+
React.useEffect(() => {
|
|
15608
|
+
if (!pageviewFiredRef.current && googleAdsConfig?.tagId) {
|
|
15609
|
+
pageviewFiredRef.current = true;
|
|
15610
|
+
handleGoogleAdsPageview(googleAdsConfig.tagId);
|
|
15611
|
+
}
|
|
15612
|
+
}, [googleAdsConfig]);
|
|
15577
15613
|
// Determine initial step and load data
|
|
15578
15614
|
React.useEffect(() => {
|
|
15579
15615
|
const initializeWidget = async () => {
|
|
@@ -15787,6 +15823,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15787
15823
|
onWidgetLanguage?.(wl);
|
|
15788
15824
|
onTimezone?.(wl.timezone);
|
|
15789
15825
|
}
|
|
15826
|
+
extractGoogleAdsConfig(data);
|
|
15790
15827
|
setEventTypes(data.eventTypes);
|
|
15791
15828
|
if (isSingleEventTypeMode && data.eventTypes.length === 1) {
|
|
15792
15829
|
setSelectedEventType(data.eventTypes[0]);
|
|
@@ -15823,6 +15860,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15823
15860
|
onWidgetLanguage?.(wl);
|
|
15824
15861
|
onTimezone?.(wl.timezone);
|
|
15825
15862
|
}
|
|
15863
|
+
extractGoogleAdsConfig(data);
|
|
15826
15864
|
setUpcomingEvents(data.upcomingEvents || []);
|
|
15827
15865
|
}
|
|
15828
15866
|
else {
|
|
@@ -15858,6 +15896,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15858
15896
|
onWidgetLanguage?.(wl);
|
|
15859
15897
|
onTimezone?.(wl.timezone);
|
|
15860
15898
|
}
|
|
15899
|
+
extractGoogleAdsConfig(data);
|
|
15861
15900
|
setSpecials(data.specials || []);
|
|
15862
15901
|
}
|
|
15863
15902
|
else {
|
|
@@ -15884,6 +15923,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15884
15923
|
onWidgetLanguage?.(wl);
|
|
15885
15924
|
onTimezone?.(wl.timezone);
|
|
15886
15925
|
}
|
|
15926
|
+
extractGoogleAdsConfig(data);
|
|
15887
15927
|
setEventInstances(data.eventInstances);
|
|
15888
15928
|
if (data.paymentProvider) {
|
|
15889
15929
|
setSystemConfig({
|
|
@@ -15944,6 +15984,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
15944
15984
|
onWidgetLanguage?.(wl);
|
|
15945
15985
|
onTimezone?.(wl.timezone);
|
|
15946
15986
|
}
|
|
15987
|
+
extractGoogleAdsConfig(data);
|
|
15947
15988
|
setEventDetails(data.eventDetails);
|
|
15948
15989
|
setSystemConfig({
|
|
15949
15990
|
paymentProvider: data.paymentProvider,
|
|
@@ -16013,6 +16054,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16013
16054
|
onWidgetLanguage?.(wl);
|
|
16014
16055
|
onTimezone?.(wl.timezone);
|
|
16015
16056
|
}
|
|
16057
|
+
extractGoogleAdsConfig(data);
|
|
16016
16058
|
return data.upsells || [];
|
|
16017
16059
|
}
|
|
16018
16060
|
else {
|
|
@@ -16426,7 +16468,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16426
16468
|
url.searchParams.delete("mollie_payment_id");
|
|
16427
16469
|
url.searchParams.delete("mollie_status");
|
|
16428
16470
|
window.history.replaceState({}, "", url.toString());
|
|
16429
|
-
}, config: config, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16471
|
+
}, config: config, googleAdsConfig: googleAdsConfig, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16430
16472
|
}
|
|
16431
16473
|
if (viewMode === "specials" && showingPreview) {
|
|
16432
16474
|
return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, children: [jsxRuntime.jsx(SpecialsView, { specials: specials, onEventSelect: handleUpcomingEventSelect, isLoading: isLoadingSpecials, showSavingsAmount: config.specialsSettings?.showSavingsAmount ?? true, showSavingsPercent: config.specialsSettings?.showSavingsPercent ?? false, emptyStateText: config.specialsSettings?.emptyStateText }), shouldRenderBookingForm && eventDetails && (jsxRuntime.jsx(BookingForm, { config: config, eventDetails: eventDetails, stripePromise: stripePromise, onSuccess: handleBookingSuccess, onError: handleBookingError, onBackToEventInstances: () => {
|
|
@@ -16451,7 +16493,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16451
16493
|
setShouldRenderBookingForm(false);
|
|
16452
16494
|
setSelectedUpsells([]);
|
|
16453
16495
|
setUpsells([]);
|
|
16454
|
-
}, config: config, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16496
|
+
}, config: config, googleAdsConfig: googleAdsConfig, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16455
16497
|
}
|
|
16456
16498
|
if (viewMode === "next-events" && !showingPreview && currentStep === "eventInstances") {
|
|
16457
16499
|
return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, children: [shouldRenderInstanceSelection && (jsxRuntime.jsx(EventInstanceSelection, { eventInstances: eventInstances, selectedEventType: selectedEventType, onEventInstanceSelect: handleEventInstanceSelect, onBackToEventTypes: () => {
|
|
@@ -16474,7 +16516,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16474
16516
|
url.searchParams.delete("mollie_payment_id");
|
|
16475
16517
|
url.searchParams.delete("mollie_status");
|
|
16476
16518
|
window.history.replaceState({}, "", url.toString());
|
|
16477
|
-
}, config: config, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16519
|
+
}, config: config, googleAdsConfig: googleAdsConfig, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16478
16520
|
}
|
|
16479
16521
|
if (viewMode === "button" && (isSingleEventTypeMode || isDirectInstanceMode)) {
|
|
16480
16522
|
return (jsxRuntime.jsxs(StyleProvider, { config: config, children: [jsxRuntime.jsxs("div", { ref: setWidgetContainerRef, style: {
|
|
@@ -16520,7 +16562,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16520
16562
|
url.searchParams.delete("mollie_payment_id");
|
|
16521
16563
|
url.searchParams.delete("mollie_status");
|
|
16522
16564
|
window.history.replaceState({}, "", url.toString());
|
|
16523
|
-
}, config: config, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16565
|
+
}, config: config, googleAdsConfig: googleAdsConfig, onError: setError, paymentIntentId: successPaymentId })] }), showPromoDialog && config.promo && (jsxRuntime.jsx(PromoDialog, { config: config.promo, onClose: handlePromoDialogClose, onCtaClick: handlePromoCtaClick }))] }));
|
|
16524
16566
|
}
|
|
16525
16567
|
// Cards mode (default) - show event type selection with optional voucher card
|
|
16526
16568
|
const cardsView = (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [hasEventSelection && (jsxRuntime.jsx(EventTypeSelection, { eventTypes: eventTypes, onEventTypeSelect: handleEventTypeSelect, onInstancePreview: (instanceId, eventTypeId) => void handleUpcomingEventSelect(instanceId, eventTypeId), isLoading: isLoading, skeletonCount: getSkeletonCount(), showVoucherAttachment: Boolean(voucherConfig?.enabled && voucherCardIntegrationEnabled && !isStandaloneVoucherMode), onVoucherClick: handleVoucherAttachmentClick })), isStandaloneVoucherMode && (jsxRuntime.jsx(VoucherIntegration, { config: config, voucherConfig: voucherConfig, eventTypes: voucherEventTypes, systemConfig: systemConfig, isFormOpen: false, isLoadingConfig: isLoadingVoucherConfig, preselectedEventTypeId: null, voucherPurchaseResult: null, isSuccess: false, showStandaloneCard: Boolean(voucherConfig?.enabled && voucherCardIntegrationEnabled), onCardClick: handleVoucherCardClick, onFormClose: handleVoucherFormClose, onSuccess: handleVoucherSuccess, onError: handleVoucherError, onSuccessModalClose: () => { } })), isStandaloneVoucherMode && isLoading && !voucherConfig && (jsxRuntime.jsx("div", { style: { padding: "24px", textAlign: "center" }, children: jsxRuntime.jsx("div", { style: {
|
|
@@ -16576,7 +16618,7 @@ function UniversalBookingWidgetInner({ config: baseConfig, onWidgetLanguage, onT
|
|
|
16576
16618
|
url.searchParams.delete("mollie_payment_id");
|
|
16577
16619
|
url.searchParams.delete("mollie_status");
|
|
16578
16620
|
window.history.replaceState({}, "", url.toString());
|
|
16579
|
-
}, config: config, onError: setError, paymentIntentId: successPaymentId }), jsxRuntime.jsx(VoucherIntegration, { config: config, voucherConfig: voucherConfig, eventTypes: voucherEventTypes, systemConfig: systemConfig, isFormOpen: isVoucherFormOpen, isLoadingConfig: isLoadingVoucherConfig, preselectedEventTypeId: preselectedVoucherEventTypeId, voucherPurchaseResult: voucherPurchaseResult, isSuccess: isSuccess, showStandaloneCard: false, onCardClick: handleVoucherCardClick, onFormClose: handleVoucherFormClose, onSuccess: handleVoucherSuccess, onError: handleVoucherError, onSuccessModalClose: () => {
|
|
16621
|
+
}, config: config, googleAdsConfig: googleAdsConfig, onError: setError, paymentIntentId: successPaymentId }), jsxRuntime.jsx(VoucherIntegration, { config: config, voucherConfig: voucherConfig, eventTypes: voucherEventTypes, systemConfig: systemConfig, isFormOpen: isVoucherFormOpen, isLoadingConfig: isLoadingVoucherConfig, preselectedEventTypeId: preselectedVoucherEventTypeId, voucherPurchaseResult: voucherPurchaseResult, isSuccess: isSuccess, showStandaloneCard: false, onCardClick: handleVoucherCardClick, onFormClose: handleVoucherFormClose, onSuccess: handleVoucherSuccess, onError: handleVoucherError, onSuccessModalClose: () => {
|
|
16580
16622
|
setIsSuccess(false);
|
|
16581
16623
|
setVoucherPurchaseResult(null);
|
|
16582
16624
|
const url = new URL(window.location.href);
|