@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 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, { sku_id: skuId });
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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
- trackExpressWalletImpression(this.#offer.sku_id, {
2142
- entryPoint: this.#entryPoint,
2143
- country: this.#country
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
- trackExpressWalletClick(this.#offer.sku_id);
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, { sku_id: skuId });
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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
- trackExpressWalletImpression(this.#offer.sku_id, {
2137
- entryPoint: this.#entryPoint,
2138
- country: this.#country
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
- trackExpressWalletClick(this.#offer.sku_id);
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, { sku_id: skuId });
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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
- trackExpressWalletImpression(this.#offer.sku_id, {
2145
- entryPoint: this.#entryPoint,
2146
- country: this.#country
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
- trackExpressWalletClick(this.#offer.sku_id);
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, { sku_id: skuId });
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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
- trackExpressWalletImpression(this.#offer.sku_id, {
2137
- entryPoint: this.#entryPoint,
2138
- country: this.#country
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
- trackExpressWalletClick(this.#offer.sku_id);
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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, { sku_id: skuId });
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
- trackWalletPaymentSuccess(skuId, result.basketId);
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
- trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
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
- trackExpressWalletImpression(this.#offer.sku_id, {
2142
- entryPoint: this.#entryPoint,
2143
- country: this.#country
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
- trackExpressWalletClick(this.#offer.sku_id);
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, { sku_id: skuId });
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@economist/web-apple-pay",
3
3
  "description": "Web component package for Apple Pay checkout UI",
4
- "version": "0.1.3-beta.38",
4
+ "version": "0.1.3-beta.39",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",