@economist/web-apple-pay 1.7.9 → 1.8.0

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
@@ -66,12 +66,13 @@ function formatPrice(price, currencyCode, shouldFixDecimalPlaces = true, roundUp
66
66
  // src/apple-pay-logo.ts
67
67
  var LOGO_DEFS_ID = "apple-pay-logo-defs";
68
68
  var LOGO_PATH = "M10.2651 4.21143C10.4299 4.21143 10.7106 4.23763 11.1074 4.29004C11.5042 4.34245 11.9385 4.49219 12.4102 4.73926C12.8893 4.97884 13.3236 5.37939 13.7129 5.94092C13.6904 5.96338 13.5819 6.04574 13.3872 6.18799C13.1925 6.32275 12.9754 6.5249 12.7358 6.79443C12.4963 7.05648 12.2866 7.39339 12.1069 7.80518C11.9272 8.20947 11.8374 8.69238 11.8374 9.25391C11.8374 9.89779 11.9497 10.4443 12.1743 10.8936C12.4064 11.3428 12.6722 11.7059 12.9717 11.9829C13.2786 12.2524 13.5482 12.4508 13.7803 12.5781C14.0199 12.7054 14.1471 12.7728 14.1621 12.7803C14.1546 12.8102 14.0573 13.076 13.8701 13.5776C13.6904 14.0793 13.391 14.637 12.9717 15.251C12.6048 15.7826 12.208 16.2729 11.7812 16.7222C11.362 17.1714 10.8566 17.396 10.2651 17.396C9.86833 17.396 9.54264 17.3398 9.28809 17.2275C9.03353 17.1077 8.77148 16.9917 8.50195 16.8794C8.23242 16.7596 7.8693 16.6997 7.4126 16.6997C6.97087 16.6997 6.60026 16.7596 6.30078 16.8794C6.00879 16.9992 5.72803 17.119 5.4585 17.2388C5.19645 17.3586 4.88574 17.4185 4.52637 17.4185C3.97982 17.4185 3.50065 17.2013 3.08887 16.7671C2.67708 16.3328 2.25407 15.8125 1.81982 15.2061C1.3182 14.4873 0.887695 13.6113 0.52832 12.5781C0.176432 11.5374 0.000488281 10.4893 0.000488281 9.43359C0.000488281 8.30306 0.213867 7.35596 0.640625 6.59229C1.06738 5.82113 1.61393 5.24089 2.28027 4.85156C2.9541 4.45475 3.65039 4.25635 4.36914 4.25635C4.75098 4.25635 5.11035 4.31999 5.44727 4.44727C5.78418 4.56706 6.09863 4.69059 6.39062 4.81787C6.6901 4.94515 6.95964 5.00879 7.19922 5.00879C7.43132 5.00879 7.70085 4.94141 8.00781 4.80664C8.31478 4.67188 8.65918 4.54085 9.04102 4.41357C9.42285 4.27881 9.83089 4.21143 10.2651 4.21143ZM9.64746 2.78516C9.35547 3.13704 8.98861 3.43278 8.54688 3.67236C8.10514 3.90446 7.68587 4.02051 7.28906 4.02051C7.20671 4.02051 7.12809 4.01302 7.05322 3.99805C7.04574 3.97559 7.03825 3.93441 7.03076 3.87451C7.02327 3.81462 7.01953 3.75098 7.01953 3.68359C7.01953 3.23438 7.11686 2.80013 7.31152 2.38086C7.50618 1.9541 7.72705 1.60221 7.97412 1.3252C8.28857 0.950846 8.68538 0.640137 9.16455 0.393066C9.64372 0.145996 10.1004 0.014974 10.5347 0C10.5571 0.0973307 10.5684 0.213379 10.5684 0.348145C10.5684 0.797363 10.4823 1.23535 10.3101 1.66211C10.1379 2.08138 9.91699 2.45573 9.64746 2.78516ZM17.6885 11.5112V9.71436H22.0459C23.2064 9.71436 24.1048 9.41488 24.7412 8.81592C25.3776 8.20947 25.6958 7.37467 25.6958 6.31152V6.28906C25.6958 5.21842 25.3776 4.38363 24.7412 3.78467C24.1048 3.18571 23.2064 2.88623 22.0459 2.88623H17.6885V1.08936H22.5625C23.5807 1.08936 24.4792 1.30648 25.2578 1.74072C26.0365 2.17497 26.6466 2.78141 27.0884 3.56006C27.5376 4.3387 27.7622 5.24089 27.7622 6.2666V6.28906C27.7622 7.31478 27.5376 8.2207 27.0884 9.00684C26.6466 9.79297 26.0365 10.4069 25.2578 10.8486C24.4792 11.2904 23.5807 11.5112 22.5625 11.5112H17.6885ZM16.6777 17.2949V1.08936H18.6992V17.2949H16.6777ZM32.6699 17.5195C31.9062 17.5195 31.2249 17.3735 30.626 17.0815C30.0345 16.7896 29.5703 16.3778 29.2334 15.8462C28.904 15.3071 28.7393 14.682 28.7393 13.9707V13.9482C28.7393 13.2594 28.9077 12.668 29.2446 12.1738C29.5815 11.6797 30.0682 11.2904 30.7046 11.0059C31.3485 10.7139 32.1234 10.5417 33.0293 10.4893L37.3979 10.2422V11.7695L33.2539 12.0278C32.4303 12.0728 31.8052 12.2599 31.3784 12.5894C30.9517 12.9188 30.7383 13.3643 30.7383 13.9258V13.9482C30.7383 14.5322 30.9554 14.9927 31.3896 15.3296C31.8239 15.659 32.3929 15.8237 33.0967 15.8237C33.7331 15.8237 34.2983 15.6927 34.7925 15.4307C35.2941 15.1686 35.6909 14.813 35.9829 14.3638C36.2749 13.9071 36.4209 13.3979 36.4209 12.8364V9.27637C36.4209 8.55762 36.1963 7.99609 35.7471 7.5918C35.2979 7.1875 34.6502 6.98535 33.8042 6.98535C33.063 6.98535 32.4603 7.13883 31.9961 7.4458C31.5394 7.74528 31.2474 8.14958 31.1201 8.65869L31.0977 8.7373H29.1885L29.1997 8.625C29.2746 7.98861 29.5067 7.41585 29.896 6.90674C30.2928 6.39762 30.8244 5.99707 31.4907 5.70508C32.1646 5.4056 32.9469 5.25586 33.8379 5.25586C34.7812 5.25586 35.5898 5.41683 36.2637 5.73877C36.945 6.05322 37.4653 6.50244 37.8247 7.08643C38.1916 7.66292 38.375 8.35173 38.375 9.15283V17.2949H36.4209V15.4307H36.3311C36.0915 15.8574 35.7845 16.228 35.4102 16.5425C35.0433 16.8569 34.6278 17.1003 34.1636 17.2725C33.6994 17.4372 33.2015 17.5195 32.6699 17.5195ZM42.1484 21.3267C41.9837 21.3267 41.8115 21.3192 41.6318 21.3042C41.4521 21.2892 41.2987 21.2705 41.1714 21.248V19.6421C41.2612 19.6646 41.366 19.6795 41.4858 19.687C41.6056 19.702 41.7292 19.7095 41.8564 19.7095C42.4554 19.7095 42.9383 19.5897 43.3052 19.3501C43.672 19.1105 43.9678 18.6576 44.1924 17.9912L44.4282 17.3062L40.0371 5.48047H42.126L45.6187 15.981L45.0796 15.2734H45.7759L45.248 15.981L48.7407 5.48047H50.7959L46.1802 18.0249C45.8807 18.826 45.555 19.4661 45.2031 19.9453C44.8512 20.432 44.432 20.7839 43.9453 21.001C43.4587 21.2181 42.8597 21.3267 42.1484 21.3267Z";
69
+ var APPLE_LOGO_PATH = LOGO_PATH.slice(0, LOGO_PATH.indexOf("M17.6885"));
69
70
  function ensureApplePayLogoSymbol() {
70
71
  if (document.getElementById(LOGO_DEFS_ID)) {
71
72
  return;
72
73
  }
73
74
  const tmp = document.createElement("div");
74
- tmp.innerHTML = `<svg aria-hidden="true" style="display:none" id="${LOGO_DEFS_ID}"><defs><symbol id="apple-pay-logo" viewBox="0 0 51 22"><path d="${LOGO_PATH}" fill="currentColor"/></symbol></defs></svg>`;
75
+ tmp.innerHTML = `<svg aria-hidden="true" style="display:none" id="${LOGO_DEFS_ID}"><defs><symbol id="apple-pay-logo" viewBox="0 0 51 22"><path d="${LOGO_PATH}" fill="currentColor"/></symbol><symbol id="apple-logo" viewBox="0 0 15 18"><path d="${APPLE_LOGO_PATH}" fill="currentColor"/></symbol></defs></svg>`;
75
76
  document.body.prepend(tmp.firstElementChild);
76
77
  }
77
78
 
@@ -575,10 +576,9 @@ var loadRecaptchaScript = (siteKey) => {
575
576
  );
576
577
  if (existingScript) {
577
578
  existingScript.addEventListener("load", () => resolve());
578
- existingScript.addEventListener(
579
- "error",
580
- () => reject(new Error("Failed to load existing reCAPTCHA script"))
581
- );
579
+ existingScript.addEventListener("error", () => {
580
+ reject(new Error("Failed to load existing reCAPTCHA script"));
581
+ });
582
582
  return;
583
583
  }
584
584
  const script = document.createElement("script");
@@ -586,7 +586,9 @@ var loadRecaptchaScript = (siteKey) => {
586
586
  script.async = true;
587
587
  script.defer = true;
588
588
  script.onload = () => resolve();
589
- script.onerror = () => reject(new Error("Failed to load reCAPTCHA script"));
589
+ script.onerror = () => {
590
+ reject(new Error("Failed to load reCAPTCHA script"));
591
+ };
590
592
  document.head.appendChild(script);
591
593
  });
592
594
  };
@@ -835,17 +837,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
835
837
  #country = "";
836
838
  #triggerElement = null;
837
839
  #keyHandler = null;
838
- #recaptchaTokens = null;
839
- #recaptchaTokensPromise = null;
840
+ #isClosed = false;
840
841
  /**
841
- * Synchronous callback invoked directly from the CTA click handler once the
842
- * user confirms. The caller (ApplePayButton) must call startApplePaySession
843
- * inside this callback to preserve the browser's user-gesture chain — Safari
844
- * requires new ApplePaySession() to execute within the original click stack.
845
- *
846
- * reCAPTCHA tokens are guaranteed non-null here: the CTA remains disabled
847
- * until the token pre-fetch resolves, so this callback is never reached
848
- * without valid tokens.
842
+ * Callback invoked synchronously from the CTA click handler.
843
+ * Receives a Promise of reCAPTCHA tokens — the promise is already in-flight
844
+ * by the time this is called. The caller (ApplePayButton) must call
845
+ * new ApplePaySession() synchronously inside this callback to stay within
846
+ * Safari's user-gesture window. The token promise resolves before
847
+ * onPaymentAuthorized fires (user still needs to authenticate on the sheet).
849
848
  */
850
849
  onConfirm = null;
851
850
  set offer(value) {
@@ -942,28 +941,32 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
942
941
  }
943
942
  });
944
943
  }
945
- if (this.#recaptchaTokensPromise) {
946
- if (cta) {
947
- cta.setAttribute("disabled", "");
948
- cta.setAttribute("aria-disabled", "true");
949
- cta.setAttribute("aria-busy", "true");
944
+ cta?.addEventListener("click", () => {
945
+ if (cta.disabled) return;
946
+ if (isUS && checkbox && !checkbox.checked) {
947
+ errorElement?.classList.add("apm__error--visible");
948
+ checkboxLabel?.classList.add("apm__checkbox-label--error");
949
+ return;
950
950
  }
951
- this.#recaptchaTokensPromise.then((tokens) => {
952
- this.#recaptchaTokens = tokens;
953
- if (cta) {
954
- cta.removeAttribute("disabled");
955
- cta.removeAttribute("aria-disabled");
956
- cta.removeAttribute("aria-busy");
957
- }
958
- }).catch(() => {
959
- if (cta) {
960
- cta.removeAttribute("aria-busy");
961
- }
951
+ errorElement?.classList.remove("apm__error--visible");
952
+ this.querySelector('[role="alert"]:not(#apple-pay-modal-error)')?.remove();
953
+ cta.disabled = true;
954
+ cta.setAttribute("aria-busy", "true");
955
+ const recaptchaTokensPromise = getPurchaseRecaptchaTokens();
956
+ if (!this.#isClosed && this.onConfirm) {
957
+ this.onConfirm(recaptchaTokensPromise);
958
+ this.close();
959
+ }
960
+ recaptchaTokensPromise.catch(() => {
961
+ if (this.#isClosed) return;
962
+ cta.disabled = false;
963
+ cta.removeAttribute("aria-busy");
962
964
  const existingError = this.querySelector("#apple-pay-modal-error");
963
965
  if (existingError) {
964
966
  const icon = existingError.querySelector("svg");
965
967
  existingError.textContent = MSG_RECAPTCHA_LOAD_ERROR;
966
968
  if (icon) existingError.prepend(icon);
969
+ existingError.setAttribute("role", "alert");
967
970
  existingError.classList.add("apm__error--visible");
968
971
  } else {
969
972
  const errorNotice = document.createElement("div");
@@ -973,25 +976,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
973
976
  cta?.insertAdjacentElement("beforebegin", errorNotice);
974
977
  }
975
978
  });
976
- }
977
- cta?.addEventListener("click", () => {
978
- if (isUS && checkbox && !checkbox.checked) {
979
- errorElement?.classList.add("apm__error--visible");
980
- checkboxLabel?.classList.add("apm__checkbox-label--error");
981
- return;
982
- }
983
- if (this.#recaptchaTokens) {
984
- this.onConfirm?.(this.#recaptchaTokens);
985
- this.close();
986
- }
987
979
  });
988
980
  this.querySelector("#apple-pay-modal-close")?.addEventListener(
989
981
  "click",
990
982
  () => this.close()
991
983
  );
992
984
  }
993
- open(recaptchaTokensPromise) {
994
- this.#recaptchaTokensPromise = recaptchaTokensPromise ?? getPurchaseRecaptchaTokens();
985
+ open() {
986
+ this.#isClosed = false;
995
987
  this.#triggerElement = document.activeElement;
996
988
  document.body.appendChild(this);
997
989
  this.#keyHandler = (event) => {
@@ -1006,6 +998,7 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
1006
998
  this.querySelector("#apple-pay-modal")?.focus();
1007
999
  }
1008
1000
  close() {
1001
+ this.#isClosed = true;
1009
1002
  if (this.#keyHandler) {
1010
1003
  document.removeEventListener("keydown", this.#keyHandler, {
1011
1004
  capture: true
@@ -1019,8 +1012,27 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
1019
1012
 
1020
1013
  // src/templates/apple-pay-button.template.html
1021
1014
  var apple_pay_button_template_default = `<style>
1022
- /* Use CSS variables for layout so parent walls can easily override placement and sizing */
1015
+ /*
1016
+ * Entry CTA only: \u201CSubscribe with [apple logo] Apple Pay\u201D.
1017
+ * Uses OS SF Pro via local() (no Marber). Modal styling is unchanged.
1018
+ */
1019
+ @font-face {
1020
+ font-family: 'WAP Apple Pay Text';
1021
+ src:
1022
+ local('SF Pro Text Light'),
1023
+ local('SFProText-Light'),
1024
+ local('SF Pro Text'),
1025
+ local('SFProText-Regular'),
1026
+ local('-apple-system'),
1027
+ local('BlinkMacSystemFont'),
1028
+ local('Helvetica Neue');
1029
+ font-weight: 300;
1030
+ font-style: normal;
1031
+ font-display: swap;
1032
+ }
1033
+
1023
1034
  teg-apple-pay-button {
1035
+ --wap-apple-pay-scale: 1.375; /* default height 44px / 32 */
1024
1036
  display: block;
1025
1037
  margin: var(--apple-pay-margin, 0);
1026
1038
  width: 100%;
@@ -1036,27 +1048,43 @@ var apple_pay_button_template_default = `<style>
1036
1048
  }
1037
1049
 
1038
1050
  teg-apple-pay-button .apple-pay-btn {
1039
- display: flex;
1051
+ display: inline-flex;
1040
1052
  align-items: center;
1041
1053
  justify-content: center;
1042
- gap: 0.375rem;
1043
1054
  width: 100%;
1044
1055
  min-width: 0;
1045
1056
  height: 100%;
1046
1057
  min-height: var(--apple-pay-height, 2.75rem);
1058
+ padding: 0 calc(8px * var(--wap-apple-pay-scale));
1059
+ box-sizing: border-box;
1047
1060
  background-color: var(--apple-pay-background-color, #000);
1048
1061
  color: var(--apple-pay-foreground-color, #fff);
1049
1062
  border: none;
1050
- border-radius: var(--apple-pay-border-radius, 1.375rem);
1063
+ border-radius: var(--apple-pay-border-radius, 5px);
1051
1064
  cursor: pointer;
1052
- font-family: var(--mb-typeface-sans, var(--wall-type-system-sans));
1053
- font-size: 1.0625rem;
1054
- font-weight: 500;
1065
+ font-family: 'WAP Apple Pay Text', -apple-system, BlinkMacSystemFont,
1066
+ 'SF Pro Text', 'Helvetica Neue', Helvetica, Arial, sans-serif;
1067
+ font-size: calc(12px * var(--wap-apple-pay-scale));
1068
+ font-weight: 300;
1069
+ font-style: normal;
1070
+ line-height: 1;
1071
+ letter-spacing: -0.01em;
1072
+ -webkit-font-smoothing: antialiased;
1073
+ -moz-osx-font-smoothing: grayscale;
1074
+ }
1075
+
1076
+ teg-apple-pay-button .apple-pay-btn__label {
1077
+ display: inline-flex;
1078
+ align-items: center;
1079
+ gap: calc(4px * var(--wap-apple-pay-scale));
1080
+ white-space: nowrap;
1055
1081
  }
1056
1082
 
1057
- teg-apple-pay-button .apple-pay-btn svg {
1083
+ teg-apple-pay-button .apple-pay-btn__apple-logo {
1058
1084
  flex-shrink: 0;
1059
1085
  display: block;
1086
+ width: calc(12px * var(--wap-apple-pay-scale));
1087
+ height: calc(14px * var(--wap-apple-pay-scale));
1060
1088
  color: currentColor;
1061
1089
  }
1062
1090
 
@@ -1065,6 +1093,10 @@ var apple_pay_button_template_default = `<style>
1065
1093
  cursor: default;
1066
1094
  }
1067
1095
 
1096
+ teg-apple-pay-button .apple-pay-btn.wap-loading .apple-pay-btn__label {
1097
+ visibility: hidden;
1098
+ }
1099
+
1068
1100
  teg-apple-pay-button .apple-pay-btn.wap-loading::before {
1069
1101
  content: '';
1070
1102
  position: absolute;
@@ -1078,11 +1110,6 @@ var apple_pay_button_template_default = `<style>
1078
1110
  animation: wap-button-spinner 0.8s linear infinite;
1079
1111
  }
1080
1112
 
1081
- teg-apple-pay-button .apple-pay-btn__logo {
1082
- display: inline-flex;
1083
- align-items: center;
1084
- }
1085
-
1086
1113
  teg-apple-pay-button .apple-pay-btn__loading {
1087
1114
  display: none;
1088
1115
  }
@@ -1097,17 +1124,26 @@ var apple_pay_button_template_default = `<style>
1097
1124
  }
1098
1125
  </style>
1099
1126
 
1100
- <div class="apple-pay-container" aria-label="Express checkout with Apple Pay">
1127
+ <div class="apple-pay-container" aria-label="Subscribe with Apple Pay">
1101
1128
  <button
1102
1129
  class="apple-pay-btn"
1103
1130
  type="button"
1104
- aria-label="Pay with Apple Pay"
1131
+ aria-label="Subscribe with Apple Pay"
1105
1132
  data-analytics="paywall:apple-pay-checkout"
1106
1133
  >
1107
- <span class="apple-pay-btn__logo">
1108
- <svg width="51" height="22" aria-label="Apple Pay" role="img">
1109
- <use href="#apple-pay-logo" />
1134
+ <span class="apple-pay-btn__label">
1135
+ Subscribe with
1136
+ <svg
1137
+ class="apple-pay-btn__apple-logo"
1138
+ width="17"
1139
+ height="19"
1140
+ viewBox="0 0 15 18"
1141
+ aria-hidden="true"
1142
+ role="img"
1143
+ >
1144
+ <use href="#apple-logo" />
1110
1145
  </svg>
1146
+ Apple Pay
1111
1147
  </span>
1112
1148
  <span class="apple-pay-btn__loading" aria-hidden="true">Loading...</span>
1113
1149
  </button>
@@ -1418,7 +1454,10 @@ function startApplePaySession(config) {
1418
1454
  };
1419
1455
  session.onpaymentauthorized = (event) => {
1420
1456
  trackWalletPaymentAuthorised(config.skuId);
1421
- config.onPaymentAuthorized(event, session);
1457
+ config.onPaymentAuthorized(event, session).catch(() => {
1458
+ session.completePayment({ status: ApplePaySession.STATUS_FAILURE });
1459
+ redirectToFallbackCheckout(config);
1460
+ });
1422
1461
  };
1423
1462
  session.oncancel = () => {
1424
1463
  config.onCancel?.();
@@ -1969,7 +2008,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
1969
2008
  #returnUrl = "";
1970
2009
  #supportedBillingCountries = [];
1971
2010
  #entryPoint = "";
1972
- #recaptchaTokensPromise = null;
1973
2011
  // ─── Public API ─────────────────────────────────────────────────────────────
1974
2012
  get offer() {
1975
2013
  return this.#offer;
@@ -2034,7 +2072,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2034
2072
  this.#paymentOptions = null;
2035
2073
  this.#returnUrl = "";
2036
2074
  this.#supportedBillingCountries = [];
2037
- this.#recaptchaTokensPromise = null;
2038
2075
  this.querySelector(SEL_CONTAINER)?.remove();
2039
2076
  }
2040
2077
  // ─── Render pipeline ────────────────────────────────────────────────────────
@@ -2137,7 +2174,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2137
2174
  if (button) {
2138
2175
  button.classList.remove("wap-loading");
2139
2176
  this.#updateDisabledState();
2140
- this.#scheduleRecaptchaTokens();
2141
2177
  trackExpressWalletImpression(this.#offer.sku_id, {
2142
2178
  entryPoint: this.#entryPoint,
2143
2179
  country: this.#country
@@ -2174,27 +2210,10 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2174
2210
  }
2175
2211
  const skuId = this.#offer.sku_id;
2176
2212
  const country = this.#country;
2177
- modal.onConfirm = (recaptchaTokens) => {
2178
- this.#initiateApplePay(skuId, country, recaptchaTokens);
2179
- this.#scheduleRecaptchaTokens();
2213
+ modal.onConfirm = (recaptchaTokensPromise) => {
2214
+ this.#initiateApplePay(skuId, country, recaptchaTokensPromise);
2180
2215
  };
2181
- modal.open(this.#recaptchaTokensPromise);
2182
- }
2183
- /**
2184
- * Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
2185
- * If the fetch rejects, the field is cleared so the next `modal.open()` call
2186
- * falls back to a new attempt via the modal's own null-fallback path — preventing
2187
- * a single transient failure from permanently disabling the CTA on all retries.
2188
- * The identity guard prevents a late rejection from clobbering a newer attempt.
2189
- */
2190
- #scheduleRecaptchaTokens() {
2191
- const attempt = getPurchaseRecaptchaTokens();
2192
- attempt.catch(() => {
2193
- if (this.#recaptchaTokensPromise === attempt) {
2194
- this.#recaptchaTokensPromise = null;
2195
- }
2196
- });
2197
- this.#recaptchaTokensPromise = attempt;
2216
+ modal.open();
2198
2217
  }
2199
2218
  async #fetchSession() {
2200
2219
  try {
@@ -2215,7 +2234,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2215
2234
  return null;
2216
2235
  }
2217
2236
  }
2218
- #buildSessionParams(skuId, country, sessionData, paymentOptions, recaptchaTokens) {
2237
+ #buildSessionParams(skuId, country, sessionData, paymentOptions, recaptchaTokensPromise) {
2219
2238
  const offer = this.#offer;
2220
2239
  const totalAmount = offer.price?.purchase ? `${offer.price.purchase}` : DEFAULT_TOTAL;
2221
2240
  return {
@@ -2227,30 +2246,41 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2227
2246
  skuId,
2228
2247
  returnUrl: this.#returnUrl,
2229
2248
  userLoggedIn: sessionData.loggedIn,
2230
- onPaymentAuthorized: (event, session) => handlePaymentAuthorized(event, session, sessionData, {
2231
- skuId,
2232
- country,
2233
- currency: offer.price?.currency_code ?? DEFAULT_CURRENCY,
2234
- returnUrl: this.#returnUrl,
2235
- supportedBillingCountries: this.#supportedBillingCountries,
2236
- recaptchaTokens
2237
- })
2249
+ onPaymentAuthorized: async (event, session) => {
2250
+ const recaptchaTokens = await recaptchaTokensPromise;
2251
+ return handlePaymentAuthorized(event, session, sessionData, {
2252
+ skuId,
2253
+ country,
2254
+ currency: offer.price?.currency_code ?? DEFAULT_CURRENCY,
2255
+ returnUrl: this.#returnUrl,
2256
+ supportedBillingCountries: this.#supportedBillingCountries,
2257
+ recaptchaTokens
2258
+ });
2259
+ }
2238
2260
  };
2239
2261
  }
2240
- #initiateApplePay(skuId, country, recaptchaTokens) {
2262
+ #initiateApplePay(skuId, country, recaptchaTokensPromise) {
2241
2263
  try {
2242
2264
  const sessionData = this.#sessionData ?? _ApplePayButton.#ANONYMOUS_SESSION;
2243
2265
  const paymentOptions = this.#paymentOptions;
2266
+ if (!paymentOptions) {
2267
+ return;
2268
+ }
2244
2269
  startApplePaySession(
2245
2270
  this.#buildSessionParams(
2246
2271
  skuId,
2247
2272
  country,
2248
2273
  sessionData,
2249
2274
  paymentOptions,
2250
- recaptchaTokens
2275
+ recaptchaTokensPromise
2251
2276
  )
2252
2277
  );
2253
2278
  } catch {
2279
+ redirectToFallbackCheckout({
2280
+ returnUrl: this.#returnUrl,
2281
+ skuId,
2282
+ countryCode: country
2283
+ });
2254
2284
  }
2255
2285
  }
2256
2286
  };