@economist/web-apple-pay 0.1.3-beta.38 → 0.1.3-beta.39
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/index.js +32 -16
- package/dist/src/apple-pay-button.js +32 -16
- package/dist/src/apple-pay-button.stories.js +32 -16
- package/dist/src/apple-pay-modal.stories.js +32 -16
- package/dist/src/clients/payment-checkout/detects.js +1 -1
- package/dist/src/clients/payment-checkout/payment-handler.js +12 -6
- package/dist/src/index.js +32 -16
- package/dist/src/utils/expressCheckoutTracking.d.ts +4 -4
- package/dist/src/utils/expressCheckoutTracking.js +14 -8
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1120,7 +1120,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
1120
1120
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
1121
1121
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
1122
1122
|
};
|
|
1123
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
1123
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
1124
1124
|
var isApplePayAvailable = async () => {
|
|
1125
1125
|
if (bypassApplePayChecks()) {
|
|
1126
1126
|
return true;
|
|
@@ -1318,17 +1318,21 @@ var track = (action, extra) => {
|
|
|
1318
1318
|
...extra
|
|
1319
1319
|
});
|
|
1320
1320
|
};
|
|
1321
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
1321
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
1322
1322
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
1323
1323
|
wallet_type: "apple_pay",
|
|
1324
1324
|
entry_point: entryPoint,
|
|
1325
1325
|
sku_id: skuId,
|
|
1326
1326
|
country,
|
|
1327
|
-
device: getDevice()
|
|
1327
|
+
device: getDevice(),
|
|
1328
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
1328
1329
|
});
|
|
1329
1330
|
};
|
|
1330
|
-
var trackExpressWalletClick = (skuId) => {
|
|
1331
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1331
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
1332
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1333
|
+
sku_id: skuId,
|
|
1334
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
1335
|
+
});
|
|
1332
1336
|
};
|
|
1333
1337
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
1334
1338
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -1336,16 +1340,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
1336
1340
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
1337
1341
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
1338
1342
|
};
|
|
1339
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
1343
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
1340
1344
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
1341
1345
|
sku_id: skuId,
|
|
1342
|
-
basket_id: basketId
|
|
1346
|
+
basket_id: basketId,
|
|
1347
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1343
1348
|
});
|
|
1344
1349
|
};
|
|
1345
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
1350
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
1346
1351
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
1347
1352
|
sku_id: skuId,
|
|
1348
|
-
failure_reason: reason
|
|
1353
|
+
failure_reason: reason,
|
|
1354
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1349
1355
|
});
|
|
1350
1356
|
};
|
|
1351
1357
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -1607,12 +1613,14 @@ function handleStructuredError(ctx) {
|
|
|
1607
1613
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
1608
1614
|
const { skuId, returnUrl, country } = config;
|
|
1609
1615
|
let validatedEmail;
|
|
1616
|
+
let purchaseStartTime;
|
|
1610
1617
|
try {
|
|
1611
1618
|
validatedEmail = validateContacts(
|
|
1612
1619
|
event,
|
|
1613
1620
|
sessionData,
|
|
1614
1621
|
config.supportedBillingCountries
|
|
1615
1622
|
);
|
|
1623
|
+
purchaseStartTime = Date.now();
|
|
1616
1624
|
const result = await performPurchase({
|
|
1617
1625
|
applePayToken: event.payment.token,
|
|
1618
1626
|
skuId: config.skuId,
|
|
@@ -1623,7 +1631,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1623
1631
|
},
|
|
1624
1632
|
recaptchaTokens: config.recaptchaTokens
|
|
1625
1633
|
});
|
|
1626
|
-
|
|
1634
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
1635
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
1627
1636
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
1628
1637
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
1629
1638
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -1641,7 +1650,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1641
1650
|
return;
|
|
1642
1651
|
}
|
|
1643
1652
|
const walletError = parseWalletApiError(err);
|
|
1644
|
-
|
|
1653
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
1654
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
1645
1655
|
failApplePaySession(session);
|
|
1646
1656
|
if (!walletError) {
|
|
1647
1657
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
|
@@ -1964,6 +1974,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1964
1974
|
#country = "";
|
|
1965
1975
|
#rendering = false;
|
|
1966
1976
|
#readyPromise = null;
|
|
1977
|
+
#loadStartTime = 0;
|
|
1967
1978
|
#sessionData = null;
|
|
1968
1979
|
#paymentOptions = null;
|
|
1969
1980
|
#returnUrl = "";
|
|
@@ -2039,6 +2050,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2039
2050
|
}
|
|
2040
2051
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
2041
2052
|
async #run() {
|
|
2053
|
+
this.#loadStartTime = Date.now();
|
|
2042
2054
|
try {
|
|
2043
2055
|
this.#renderTemplate();
|
|
2044
2056
|
if (await this.#checkAvailability()) return;
|
|
@@ -2138,10 +2150,12 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2138
2150
|
button.classList.remove("wap-loading");
|
|
2139
2151
|
this.#updateDisabledState();
|
|
2140
2152
|
this.#scheduleRecaptchaTokens();
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2153
|
+
const buttonLoadDurationMs = Date.now() - this.#loadStartTime;
|
|
2154
|
+
trackExpressWalletImpression(
|
|
2155
|
+
this.#offer.sku_id,
|
|
2156
|
+
{ entryPoint: this.#entryPoint, country: this.#country },
|
|
2157
|
+
buttonLoadDurationMs
|
|
2158
|
+
);
|
|
2145
2159
|
}
|
|
2146
2160
|
}
|
|
2147
2161
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
@@ -2164,7 +2178,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2164
2178
|
if (document.querySelector(ApplePayModal.tag)) {
|
|
2165
2179
|
return;
|
|
2166
2180
|
}
|
|
2167
|
-
|
|
2181
|
+
const modalOpenStart = Date.now();
|
|
2168
2182
|
ApplePayModal.define();
|
|
2169
2183
|
const modal = document.createElement(ApplePayModal.tag);
|
|
2170
2184
|
modal.offer = this.#offer;
|
|
@@ -2179,6 +2193,8 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2179
2193
|
this.#scheduleRecaptchaTokens();
|
|
2180
2194
|
};
|
|
2181
2195
|
modal.open(this.#recaptchaTokensPromise);
|
|
2196
|
+
const modalRenderDurationMs = Date.now() - modalOpenStart;
|
|
2197
|
+
trackExpressWalletClick(skuId, modalRenderDurationMs);
|
|
2182
2198
|
}
|
|
2183
2199
|
/**
|
|
2184
2200
|
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
@@ -1115,7 +1115,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
1115
1115
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
1116
1116
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
1117
1117
|
};
|
|
1118
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
1118
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
1119
1119
|
var isApplePayAvailable = async () => {
|
|
1120
1120
|
if (bypassApplePayChecks()) {
|
|
1121
1121
|
return true;
|
|
@@ -1313,17 +1313,21 @@ var track = (action, extra) => {
|
|
|
1313
1313
|
...extra
|
|
1314
1314
|
});
|
|
1315
1315
|
};
|
|
1316
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
1316
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
1317
1317
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
1318
1318
|
wallet_type: "apple_pay",
|
|
1319
1319
|
entry_point: entryPoint,
|
|
1320
1320
|
sku_id: skuId,
|
|
1321
1321
|
country,
|
|
1322
|
-
device: getDevice()
|
|
1322
|
+
device: getDevice(),
|
|
1323
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
1323
1324
|
});
|
|
1324
1325
|
};
|
|
1325
|
-
var trackExpressWalletClick = (skuId) => {
|
|
1326
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1326
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
1327
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1328
|
+
sku_id: skuId,
|
|
1329
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
1330
|
+
});
|
|
1327
1331
|
};
|
|
1328
1332
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
1329
1333
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -1331,16 +1335,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
1331
1335
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
1332
1336
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
1333
1337
|
};
|
|
1334
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
1338
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
1335
1339
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
1336
1340
|
sku_id: skuId,
|
|
1337
|
-
basket_id: basketId
|
|
1341
|
+
basket_id: basketId,
|
|
1342
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1338
1343
|
});
|
|
1339
1344
|
};
|
|
1340
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
1345
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
1341
1346
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
1342
1347
|
sku_id: skuId,
|
|
1343
|
-
failure_reason: reason
|
|
1348
|
+
failure_reason: reason,
|
|
1349
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1344
1350
|
});
|
|
1345
1351
|
};
|
|
1346
1352
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -1602,12 +1608,14 @@ function handleStructuredError(ctx) {
|
|
|
1602
1608
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
1603
1609
|
const { skuId, returnUrl, country } = config;
|
|
1604
1610
|
let validatedEmail;
|
|
1611
|
+
let purchaseStartTime;
|
|
1605
1612
|
try {
|
|
1606
1613
|
validatedEmail = validateContacts(
|
|
1607
1614
|
event,
|
|
1608
1615
|
sessionData,
|
|
1609
1616
|
config.supportedBillingCountries
|
|
1610
1617
|
);
|
|
1618
|
+
purchaseStartTime = Date.now();
|
|
1611
1619
|
const result = await performPurchase({
|
|
1612
1620
|
applePayToken: event.payment.token,
|
|
1613
1621
|
skuId: config.skuId,
|
|
@@ -1618,7 +1626,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1618
1626
|
},
|
|
1619
1627
|
recaptchaTokens: config.recaptchaTokens
|
|
1620
1628
|
});
|
|
1621
|
-
|
|
1629
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
1630
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
1622
1631
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
1623
1632
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
1624
1633
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -1636,7 +1645,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1636
1645
|
return;
|
|
1637
1646
|
}
|
|
1638
1647
|
const walletError = parseWalletApiError(err);
|
|
1639
|
-
|
|
1648
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
1649
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
1640
1650
|
failApplePaySession(session);
|
|
1641
1651
|
if (!walletError) {
|
|
1642
1652
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
|
@@ -1959,6 +1969,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1959
1969
|
#country = "";
|
|
1960
1970
|
#rendering = false;
|
|
1961
1971
|
#readyPromise = null;
|
|
1972
|
+
#loadStartTime = 0;
|
|
1962
1973
|
#sessionData = null;
|
|
1963
1974
|
#paymentOptions = null;
|
|
1964
1975
|
#returnUrl = "";
|
|
@@ -2034,6 +2045,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2034
2045
|
}
|
|
2035
2046
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
2036
2047
|
async #run() {
|
|
2048
|
+
this.#loadStartTime = Date.now();
|
|
2037
2049
|
try {
|
|
2038
2050
|
this.#renderTemplate();
|
|
2039
2051
|
if (await this.#checkAvailability()) return;
|
|
@@ -2133,10 +2145,12 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2133
2145
|
button.classList.remove("wap-loading");
|
|
2134
2146
|
this.#updateDisabledState();
|
|
2135
2147
|
this.#scheduleRecaptchaTokens();
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2148
|
+
const buttonLoadDurationMs = Date.now() - this.#loadStartTime;
|
|
2149
|
+
trackExpressWalletImpression(
|
|
2150
|
+
this.#offer.sku_id,
|
|
2151
|
+
{ entryPoint: this.#entryPoint, country: this.#country },
|
|
2152
|
+
buttonLoadDurationMs
|
|
2153
|
+
);
|
|
2140
2154
|
}
|
|
2141
2155
|
}
|
|
2142
2156
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
@@ -2159,7 +2173,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2159
2173
|
if (document.querySelector(ApplePayModal.tag)) {
|
|
2160
2174
|
return;
|
|
2161
2175
|
}
|
|
2162
|
-
|
|
2176
|
+
const modalOpenStart = Date.now();
|
|
2163
2177
|
ApplePayModal.define();
|
|
2164
2178
|
const modal = document.createElement(ApplePayModal.tag);
|
|
2165
2179
|
modal.offer = this.#offer;
|
|
@@ -2174,6 +2188,8 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2174
2188
|
this.#scheduleRecaptchaTokens();
|
|
2175
2189
|
};
|
|
2176
2190
|
modal.open(this.#recaptchaTokensPromise);
|
|
2191
|
+
const modalRenderDurationMs = Date.now() - modalOpenStart;
|
|
2192
|
+
trackExpressWalletClick(skuId, modalRenderDurationMs);
|
|
2177
2193
|
}
|
|
2178
2194
|
/**
|
|
2179
2195
|
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
@@ -1123,7 +1123,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
1123
1123
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
1124
1124
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
1125
1125
|
};
|
|
1126
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
1126
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
1127
1127
|
var isApplePayAvailable = async () => {
|
|
1128
1128
|
if (bypassApplePayChecks()) {
|
|
1129
1129
|
return true;
|
|
@@ -1321,17 +1321,21 @@ var track = (action, extra) => {
|
|
|
1321
1321
|
...extra
|
|
1322
1322
|
});
|
|
1323
1323
|
};
|
|
1324
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
1324
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
1325
1325
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
1326
1326
|
wallet_type: "apple_pay",
|
|
1327
1327
|
entry_point: entryPoint,
|
|
1328
1328
|
sku_id: skuId,
|
|
1329
1329
|
country,
|
|
1330
|
-
device: getDevice()
|
|
1330
|
+
device: getDevice(),
|
|
1331
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
1331
1332
|
});
|
|
1332
1333
|
};
|
|
1333
|
-
var trackExpressWalletClick = (skuId) => {
|
|
1334
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1334
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
1335
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1336
|
+
sku_id: skuId,
|
|
1337
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
1338
|
+
});
|
|
1335
1339
|
};
|
|
1336
1340
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
1337
1341
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -1339,16 +1343,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
1339
1343
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
1340
1344
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
1341
1345
|
};
|
|
1342
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
1346
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
1343
1347
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
1344
1348
|
sku_id: skuId,
|
|
1345
|
-
basket_id: basketId
|
|
1349
|
+
basket_id: basketId,
|
|
1350
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1346
1351
|
});
|
|
1347
1352
|
};
|
|
1348
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
1353
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
1349
1354
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
1350
1355
|
sku_id: skuId,
|
|
1351
|
-
failure_reason: reason
|
|
1356
|
+
failure_reason: reason,
|
|
1357
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1352
1358
|
});
|
|
1353
1359
|
};
|
|
1354
1360
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -1610,12 +1616,14 @@ function handleStructuredError(ctx) {
|
|
|
1610
1616
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
1611
1617
|
const { skuId, returnUrl, country } = config;
|
|
1612
1618
|
let validatedEmail;
|
|
1619
|
+
let purchaseStartTime;
|
|
1613
1620
|
try {
|
|
1614
1621
|
validatedEmail = validateContacts(
|
|
1615
1622
|
event,
|
|
1616
1623
|
sessionData,
|
|
1617
1624
|
config.supportedBillingCountries
|
|
1618
1625
|
);
|
|
1626
|
+
purchaseStartTime = Date.now();
|
|
1619
1627
|
const result = await performPurchase({
|
|
1620
1628
|
applePayToken: event.payment.token,
|
|
1621
1629
|
skuId: config.skuId,
|
|
@@ -1626,7 +1634,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1626
1634
|
},
|
|
1627
1635
|
recaptchaTokens: config.recaptchaTokens
|
|
1628
1636
|
});
|
|
1629
|
-
|
|
1637
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
1638
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
1630
1639
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
1631
1640
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
1632
1641
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -1644,7 +1653,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1644
1653
|
return;
|
|
1645
1654
|
}
|
|
1646
1655
|
const walletError = parseWalletApiError(err);
|
|
1647
|
-
|
|
1656
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
1657
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
1648
1658
|
failApplePaySession(session);
|
|
1649
1659
|
if (!walletError) {
|
|
1650
1660
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
|
@@ -1967,6 +1977,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1967
1977
|
#country = "";
|
|
1968
1978
|
#rendering = false;
|
|
1969
1979
|
#readyPromise = null;
|
|
1980
|
+
#loadStartTime = 0;
|
|
1970
1981
|
#sessionData = null;
|
|
1971
1982
|
#paymentOptions = null;
|
|
1972
1983
|
#returnUrl = "";
|
|
@@ -2042,6 +2053,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2042
2053
|
}
|
|
2043
2054
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
2044
2055
|
async #run() {
|
|
2056
|
+
this.#loadStartTime = Date.now();
|
|
2045
2057
|
try {
|
|
2046
2058
|
this.#renderTemplate();
|
|
2047
2059
|
if (await this.#checkAvailability()) return;
|
|
@@ -2141,10 +2153,12 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2141
2153
|
button.classList.remove("wap-loading");
|
|
2142
2154
|
this.#updateDisabledState();
|
|
2143
2155
|
this.#scheduleRecaptchaTokens();
|
|
2144
|
-
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
|
|
2156
|
+
const buttonLoadDurationMs = Date.now() - this.#loadStartTime;
|
|
2157
|
+
trackExpressWalletImpression(
|
|
2158
|
+
this.#offer.sku_id,
|
|
2159
|
+
{ entryPoint: this.#entryPoint, country: this.#country },
|
|
2160
|
+
buttonLoadDurationMs
|
|
2161
|
+
);
|
|
2148
2162
|
}
|
|
2149
2163
|
}
|
|
2150
2164
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
@@ -2167,7 +2181,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2167
2181
|
if (document.querySelector(ApplePayModal.tag)) {
|
|
2168
2182
|
return;
|
|
2169
2183
|
}
|
|
2170
|
-
|
|
2184
|
+
const modalOpenStart = Date.now();
|
|
2171
2185
|
ApplePayModal.define();
|
|
2172
2186
|
const modal = document.createElement(ApplePayModal.tag);
|
|
2173
2187
|
modal.offer = this.#offer;
|
|
@@ -2182,6 +2196,8 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2182
2196
|
this.#scheduleRecaptchaTokens();
|
|
2183
2197
|
};
|
|
2184
2198
|
modal.open(this.#recaptchaTokensPromise);
|
|
2199
|
+
const modalRenderDurationMs = Date.now() - modalOpenStart;
|
|
2200
|
+
trackExpressWalletClick(skuId, modalRenderDurationMs);
|
|
2185
2201
|
}
|
|
2186
2202
|
/**
|
|
2187
2203
|
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
@@ -1115,7 +1115,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
1115
1115
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
1116
1116
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
1117
1117
|
};
|
|
1118
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
1118
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
1119
1119
|
var isApplePayAvailable = async () => {
|
|
1120
1120
|
if (bypassApplePayChecks()) {
|
|
1121
1121
|
return true;
|
|
@@ -1313,17 +1313,21 @@ var track = (action, extra) => {
|
|
|
1313
1313
|
...extra
|
|
1314
1314
|
});
|
|
1315
1315
|
};
|
|
1316
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
1316
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
1317
1317
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
1318
1318
|
wallet_type: "apple_pay",
|
|
1319
1319
|
entry_point: entryPoint,
|
|
1320
1320
|
sku_id: skuId,
|
|
1321
1321
|
country,
|
|
1322
|
-
device: getDevice()
|
|
1322
|
+
device: getDevice(),
|
|
1323
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
1323
1324
|
});
|
|
1324
1325
|
};
|
|
1325
|
-
var trackExpressWalletClick = (skuId) => {
|
|
1326
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1326
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
1327
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1328
|
+
sku_id: skuId,
|
|
1329
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
1330
|
+
});
|
|
1327
1331
|
};
|
|
1328
1332
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
1329
1333
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -1331,16 +1335,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
1331
1335
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
1332
1336
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
1333
1337
|
};
|
|
1334
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
1338
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
1335
1339
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
1336
1340
|
sku_id: skuId,
|
|
1337
|
-
basket_id: basketId
|
|
1341
|
+
basket_id: basketId,
|
|
1342
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1338
1343
|
});
|
|
1339
1344
|
};
|
|
1340
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
1345
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
1341
1346
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
1342
1347
|
sku_id: skuId,
|
|
1343
|
-
failure_reason: reason
|
|
1348
|
+
failure_reason: reason,
|
|
1349
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1344
1350
|
});
|
|
1345
1351
|
};
|
|
1346
1352
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -1602,12 +1608,14 @@ function handleStructuredError(ctx) {
|
|
|
1602
1608
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
1603
1609
|
const { skuId, returnUrl, country } = config;
|
|
1604
1610
|
let validatedEmail;
|
|
1611
|
+
let purchaseStartTime;
|
|
1605
1612
|
try {
|
|
1606
1613
|
validatedEmail = validateContacts(
|
|
1607
1614
|
event,
|
|
1608
1615
|
sessionData,
|
|
1609
1616
|
config.supportedBillingCountries
|
|
1610
1617
|
);
|
|
1618
|
+
purchaseStartTime = Date.now();
|
|
1611
1619
|
const result = await performPurchase({
|
|
1612
1620
|
applePayToken: event.payment.token,
|
|
1613
1621
|
skuId: config.skuId,
|
|
@@ -1618,7 +1626,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1618
1626
|
},
|
|
1619
1627
|
recaptchaTokens: config.recaptchaTokens
|
|
1620
1628
|
});
|
|
1621
|
-
|
|
1629
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
1630
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
1622
1631
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
1623
1632
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
1624
1633
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -1636,7 +1645,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1636
1645
|
return;
|
|
1637
1646
|
}
|
|
1638
1647
|
const walletError = parseWalletApiError(err);
|
|
1639
|
-
|
|
1648
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
1649
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
1640
1650
|
failApplePaySession(session);
|
|
1641
1651
|
if (!walletError) {
|
|
1642
1652
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
|
@@ -1959,6 +1969,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1959
1969
|
#country = "";
|
|
1960
1970
|
#rendering = false;
|
|
1961
1971
|
#readyPromise = null;
|
|
1972
|
+
#loadStartTime = 0;
|
|
1962
1973
|
#sessionData = null;
|
|
1963
1974
|
#paymentOptions = null;
|
|
1964
1975
|
#returnUrl = "";
|
|
@@ -2034,6 +2045,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2034
2045
|
}
|
|
2035
2046
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
2036
2047
|
async #run() {
|
|
2048
|
+
this.#loadStartTime = Date.now();
|
|
2037
2049
|
try {
|
|
2038
2050
|
this.#renderTemplate();
|
|
2039
2051
|
if (await this.#checkAvailability()) return;
|
|
@@ -2133,10 +2145,12 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2133
2145
|
button.classList.remove("wap-loading");
|
|
2134
2146
|
this.#updateDisabledState();
|
|
2135
2147
|
this.#scheduleRecaptchaTokens();
|
|
2136
|
-
|
|
2137
|
-
|
|
2138
|
-
|
|
2139
|
-
|
|
2148
|
+
const buttonLoadDurationMs = Date.now() - this.#loadStartTime;
|
|
2149
|
+
trackExpressWalletImpression(
|
|
2150
|
+
this.#offer.sku_id,
|
|
2151
|
+
{ entryPoint: this.#entryPoint, country: this.#country },
|
|
2152
|
+
buttonLoadDurationMs
|
|
2153
|
+
);
|
|
2140
2154
|
}
|
|
2141
2155
|
}
|
|
2142
2156
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
@@ -2159,7 +2173,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2159
2173
|
if (document.querySelector(ApplePayModal.tag)) {
|
|
2160
2174
|
return;
|
|
2161
2175
|
}
|
|
2162
|
-
|
|
2176
|
+
const modalOpenStart = Date.now();
|
|
2163
2177
|
ApplePayModal.define();
|
|
2164
2178
|
const modal = document.createElement(ApplePayModal.tag);
|
|
2165
2179
|
modal.offer = this.#offer;
|
|
@@ -2174,6 +2188,8 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2174
2188
|
this.#scheduleRecaptchaTokens();
|
|
2175
2189
|
};
|
|
2176
2190
|
modal.open(this.#recaptchaTokensPromise);
|
|
2191
|
+
const modalRenderDurationMs = Date.now() - modalOpenStart;
|
|
2192
|
+
trackExpressWalletClick(skuId, modalRenderDurationMs);
|
|
2177
2193
|
}
|
|
2178
2194
|
/**
|
|
2179
2195
|
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
@@ -8,7 +8,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
8
8
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
9
9
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
10
10
|
};
|
|
11
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
11
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
12
12
|
var isApplePayAvailable = async () => {
|
|
13
13
|
if (bypassApplePayChecks()) {
|
|
14
14
|
return true;
|
|
@@ -93,16 +93,18 @@ var track = (action, extra) => {
|
|
|
93
93
|
...extra
|
|
94
94
|
});
|
|
95
95
|
};
|
|
96
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
96
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
97
97
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
98
98
|
sku_id: skuId,
|
|
99
|
-
basket_id: basketId
|
|
99
|
+
basket_id: basketId,
|
|
100
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
100
101
|
});
|
|
101
102
|
};
|
|
102
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
103
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
103
104
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
104
105
|
sku_id: skuId,
|
|
105
|
-
failure_reason: reason
|
|
106
|
+
failure_reason: reason,
|
|
107
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
106
108
|
});
|
|
107
109
|
};
|
|
108
110
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -345,12 +347,14 @@ function handleStructuredError(ctx) {
|
|
|
345
347
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
346
348
|
const { skuId, returnUrl, country } = config;
|
|
347
349
|
let validatedEmail;
|
|
350
|
+
let purchaseStartTime;
|
|
348
351
|
try {
|
|
349
352
|
validatedEmail = validateContacts(
|
|
350
353
|
event,
|
|
351
354
|
sessionData,
|
|
352
355
|
config.supportedBillingCountries
|
|
353
356
|
);
|
|
357
|
+
purchaseStartTime = Date.now();
|
|
354
358
|
const result = await performPurchase({
|
|
355
359
|
applePayToken: event.payment.token,
|
|
356
360
|
skuId: config.skuId,
|
|
@@ -361,7 +365,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
361
365
|
},
|
|
362
366
|
recaptchaTokens: config.recaptchaTokens
|
|
363
367
|
});
|
|
364
|
-
|
|
368
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
369
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
365
370
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
366
371
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
367
372
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -379,7 +384,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
379
384
|
return;
|
|
380
385
|
}
|
|
381
386
|
const walletError = parseWalletApiError(err);
|
|
382
|
-
|
|
387
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
388
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
383
389
|
failApplePaySession(session);
|
|
384
390
|
if (!walletError) {
|
|
385
391
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
package/dist/src/index.js
CHANGED
|
@@ -1120,7 +1120,7 @@ var isAppleDeviceOrSafari = () => {
|
|
|
1120
1120
|
const isSafariBrowser = navigator.userAgent.indexOf("Safari") > -1 && navigator.userAgent.indexOf("Chrome") === -1;
|
|
1121
1121
|
return isIOSOrMacTouchDevice || isSafariBrowser;
|
|
1122
1122
|
};
|
|
1123
|
-
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null;
|
|
1123
|
+
var bypassApplePayChecks = () => new URLSearchParams(window.location.search).get("BYPASS_APPLE_PAY_CHECKS") !== null && getApplePayConfig()?.debugBypassEnabled === true;
|
|
1124
1124
|
var isApplePayAvailable = async () => {
|
|
1125
1125
|
if (bypassApplePayChecks()) {
|
|
1126
1126
|
return true;
|
|
@@ -1318,17 +1318,21 @@ var track = (action, extra) => {
|
|
|
1318
1318
|
...extra
|
|
1319
1319
|
});
|
|
1320
1320
|
};
|
|
1321
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
1321
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
1322
1322
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
1323
1323
|
wallet_type: "apple_pay",
|
|
1324
1324
|
entry_point: entryPoint,
|
|
1325
1325
|
sku_id: skuId,
|
|
1326
1326
|
country,
|
|
1327
|
-
device: getDevice()
|
|
1327
|
+
device: getDevice(),
|
|
1328
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
1328
1329
|
});
|
|
1329
1330
|
};
|
|
1330
|
-
var trackExpressWalletClick = (skuId) => {
|
|
1331
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1331
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
1332
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
1333
|
+
sku_id: skuId,
|
|
1334
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
1335
|
+
});
|
|
1332
1336
|
};
|
|
1333
1337
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
1334
1338
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -1336,16 +1340,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
1336
1340
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
1337
1341
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
1338
1342
|
};
|
|
1339
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
1343
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
1340
1344
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
1341
1345
|
sku_id: skuId,
|
|
1342
|
-
basket_id: basketId
|
|
1346
|
+
basket_id: basketId,
|
|
1347
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1343
1348
|
});
|
|
1344
1349
|
};
|
|
1345
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
1350
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
1346
1351
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
1347
1352
|
sku_id: skuId,
|
|
1348
|
-
failure_reason: reason
|
|
1353
|
+
failure_reason: reason,
|
|
1354
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
1349
1355
|
});
|
|
1350
1356
|
};
|
|
1351
1357
|
var trackFallbackCheckout = (skuId) => {
|
|
@@ -1607,12 +1613,14 @@ function handleStructuredError(ctx) {
|
|
|
1607
1613
|
async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
1608
1614
|
const { skuId, returnUrl, country } = config;
|
|
1609
1615
|
let validatedEmail;
|
|
1616
|
+
let purchaseStartTime;
|
|
1610
1617
|
try {
|
|
1611
1618
|
validatedEmail = validateContacts(
|
|
1612
1619
|
event,
|
|
1613
1620
|
sessionData,
|
|
1614
1621
|
config.supportedBillingCountries
|
|
1615
1622
|
);
|
|
1623
|
+
purchaseStartTime = Date.now();
|
|
1616
1624
|
const result = await performPurchase({
|
|
1617
1625
|
applePayToken: event.payment.token,
|
|
1618
1626
|
skuId: config.skuId,
|
|
@@ -1623,7 +1631,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1623
1631
|
},
|
|
1624
1632
|
recaptchaTokens: config.recaptchaTokens
|
|
1625
1633
|
});
|
|
1626
|
-
|
|
1634
|
+
const purchaseDurationMs = Date.now() - purchaseStartTime;
|
|
1635
|
+
trackWalletPaymentSuccess(skuId, result.basketId, purchaseDurationMs);
|
|
1627
1636
|
session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
|
|
1628
1637
|
const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
|
|
1629
1638
|
const userStatus = sessionData.loggedIn ? "lex" : "nex";
|
|
@@ -1641,7 +1650,8 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
|
|
|
1641
1650
|
return;
|
|
1642
1651
|
}
|
|
1643
1652
|
const walletError = parseWalletApiError(err);
|
|
1644
|
-
|
|
1653
|
+
const purchaseDurationMs = purchaseStartTime !== void 0 ? Date.now() - purchaseStartTime : void 0;
|
|
1654
|
+
trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN", purchaseDurationMs);
|
|
1645
1655
|
failApplePaySession(session);
|
|
1646
1656
|
if (!walletError) {
|
|
1647
1657
|
redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
|
|
@@ -1964,6 +1974,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1964
1974
|
#country = "";
|
|
1965
1975
|
#rendering = false;
|
|
1966
1976
|
#readyPromise = null;
|
|
1977
|
+
#loadStartTime = 0;
|
|
1967
1978
|
#sessionData = null;
|
|
1968
1979
|
#paymentOptions = null;
|
|
1969
1980
|
#returnUrl = "";
|
|
@@ -2039,6 +2050,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2039
2050
|
}
|
|
2040
2051
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
2041
2052
|
async #run() {
|
|
2053
|
+
this.#loadStartTime = Date.now();
|
|
2042
2054
|
try {
|
|
2043
2055
|
this.#renderTemplate();
|
|
2044
2056
|
if (await this.#checkAvailability()) return;
|
|
@@ -2138,10 +2150,12 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2138
2150
|
button.classList.remove("wap-loading");
|
|
2139
2151
|
this.#updateDisabledState();
|
|
2140
2152
|
this.#scheduleRecaptchaTokens();
|
|
2141
|
-
|
|
2142
|
-
|
|
2143
|
-
|
|
2144
|
-
|
|
2153
|
+
const buttonLoadDurationMs = Date.now() - this.#loadStartTime;
|
|
2154
|
+
trackExpressWalletImpression(
|
|
2155
|
+
this.#offer.sku_id,
|
|
2156
|
+
{ entryPoint: this.#entryPoint, country: this.#country },
|
|
2157
|
+
buttonLoadDurationMs
|
|
2158
|
+
);
|
|
2145
2159
|
}
|
|
2146
2160
|
}
|
|
2147
2161
|
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
@@ -2164,7 +2178,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2164
2178
|
if (document.querySelector(ApplePayModal.tag)) {
|
|
2165
2179
|
return;
|
|
2166
2180
|
}
|
|
2167
|
-
|
|
2181
|
+
const modalOpenStart = Date.now();
|
|
2168
2182
|
ApplePayModal.define();
|
|
2169
2183
|
const modal = document.createElement(ApplePayModal.tag);
|
|
2170
2184
|
modal.offer = this.#offer;
|
|
@@ -2179,6 +2193,8 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2179
2193
|
this.#scheduleRecaptchaTokens();
|
|
2180
2194
|
};
|
|
2181
2195
|
modal.open(this.#recaptchaTokensPromise);
|
|
2196
|
+
const modalRenderDurationMs = Date.now() - modalOpenStart;
|
|
2197
|
+
trackExpressWalletClick(skuId, modalRenderDurationMs);
|
|
2182
2198
|
}
|
|
2183
2199
|
/**
|
|
2184
2200
|
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
@@ -47,17 +47,17 @@ export type ImpressionMetadata = {
|
|
|
47
47
|
country: string;
|
|
48
48
|
};
|
|
49
49
|
/** Wallet button displayed — emits all 5 required analytics dimensions. */
|
|
50
|
-
export declare const trackExpressWalletImpression: (skuId: string, { entryPoint, country }: ImpressionMetadata) => void;
|
|
50
|
+
export declare const trackExpressWalletImpression: (skuId: string, { entryPoint, country }: ImpressionMetadata, buttonLoadDurationMs?: number) => void;
|
|
51
51
|
/** Wallet button clicked */
|
|
52
|
-
export declare const trackExpressWalletClick: (skuId: string) => void;
|
|
52
|
+
export declare const trackExpressWalletClick: (skuId: string, modalRenderDurationMs?: number) => void;
|
|
53
53
|
/** Apple Pay sheet opened (session.begin() called) */
|
|
54
54
|
export declare const trackWalletPaymentSheetOpen: (skuId: string) => void;
|
|
55
55
|
/** Payment authorised by the user in the Apple Pay sheet */
|
|
56
56
|
export declare const trackWalletPaymentAuthorised: (skuId: string) => void;
|
|
57
57
|
/** Purchase completed — BFF returned success */
|
|
58
|
-
export declare const trackWalletPaymentSuccess: (skuId: string, basketId: string) => void;
|
|
58
|
+
export declare const trackWalletPaymentSuccess: (skuId: string, basketId: string, purchaseDurationMs?: number) => void;
|
|
59
59
|
/** Payment failed — BFF returned an error */
|
|
60
|
-
export declare const trackWalletPaymentFailure: (skuId: string, reason: string) => void;
|
|
60
|
+
export declare const trackWalletPaymentFailure: (skuId: string, reason: string, purchaseDurationMs?: number) => void;
|
|
61
61
|
/** Redirect to standard checkout triggered */
|
|
62
62
|
export declare const trackFallbackCheckout: (skuId: string) => void;
|
|
63
63
|
/** Billing/shipping field failed validation (emitted per-field when Apple Pay sheet stays open) */
|
|
@@ -35,17 +35,21 @@ var track = (action, extra) => {
|
|
|
35
35
|
...extra
|
|
36
36
|
});
|
|
37
37
|
};
|
|
38
|
-
var trackExpressWalletImpression = (skuId, { entryPoint, country }) => {
|
|
38
|
+
var trackExpressWalletImpression = (skuId, { entryPoint, country }, buttonLoadDurationMs) => {
|
|
39
39
|
track(EXPRESS_CHECKOUT_EVENTS.IMPRESSION, {
|
|
40
40
|
wallet_type: "apple_pay",
|
|
41
41
|
entry_point: entryPoint,
|
|
42
42
|
sku_id: skuId,
|
|
43
43
|
country,
|
|
44
|
-
device: getDevice()
|
|
44
|
+
device: getDevice(),
|
|
45
|
+
...buttonLoadDurationMs !== void 0 && { button_load_duration_ms: buttonLoadDurationMs }
|
|
45
46
|
});
|
|
46
47
|
};
|
|
47
|
-
var trackExpressWalletClick = (skuId) => {
|
|
48
|
-
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
48
|
+
var trackExpressWalletClick = (skuId, modalRenderDurationMs) => {
|
|
49
|
+
track(EXPRESS_CHECKOUT_EVENTS.BUTTON_CLICK, {
|
|
50
|
+
sku_id: skuId,
|
|
51
|
+
...modalRenderDurationMs !== void 0 && { modal_render_duration_ms: modalRenderDurationMs }
|
|
52
|
+
});
|
|
49
53
|
};
|
|
50
54
|
var trackWalletPaymentSheetOpen = (skuId) => {
|
|
51
55
|
track(EXPRESS_CHECKOUT_EVENTS.SHEET_OPEN, { sku_id: skuId });
|
|
@@ -53,16 +57,18 @@ var trackWalletPaymentSheetOpen = (skuId) => {
|
|
|
53
57
|
var trackWalletPaymentAuthorised = (skuId) => {
|
|
54
58
|
track(EXPRESS_CHECKOUT_EVENTS.AUTHORISED, { sku_id: skuId });
|
|
55
59
|
};
|
|
56
|
-
var trackWalletPaymentSuccess = (skuId, basketId) => {
|
|
60
|
+
var trackWalletPaymentSuccess = (skuId, basketId, purchaseDurationMs) => {
|
|
57
61
|
track(EXPRESS_CHECKOUT_EVENTS.SUCCESS, {
|
|
58
62
|
sku_id: skuId,
|
|
59
|
-
basket_id: basketId
|
|
63
|
+
basket_id: basketId,
|
|
64
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
60
65
|
});
|
|
61
66
|
};
|
|
62
|
-
var trackWalletPaymentFailure = (skuId, reason) => {
|
|
67
|
+
var trackWalletPaymentFailure = (skuId, reason, purchaseDurationMs) => {
|
|
63
68
|
track(EXPRESS_CHECKOUT_EVENTS.FAILURE, {
|
|
64
69
|
sku_id: skuId,
|
|
65
|
-
failure_reason: reason
|
|
70
|
+
failure_reason: reason,
|
|
71
|
+
...purchaseDurationMs !== void 0 && { purchase_duration_ms: purchaseDurationMs }
|
|
66
72
|
});
|
|
67
73
|
};
|
|
68
74
|
var trackFallbackCheckout = (skuId) => {
|
package/package.json
CHANGED