@economist/web-apple-pay 1.7.6 → 1.7.8

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.
@@ -71,7 +71,7 @@ function ensureApplePayLogoSymbol() {
71
71
  return;
72
72
  }
73
73
  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="white"/></symbol></defs></svg>`;
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
75
  document.body.prepend(tmp.firstElementChild);
76
76
  }
77
77
 
@@ -109,16 +109,32 @@ var apple_pay_modal_template_default = `<style>
109
109
  position: absolute;
110
110
  top: 1.5rem;
111
111
  right: 1.3125rem;
112
- background: none;
112
+ background: transparent;
113
113
  border: none;
114
114
  cursor: pointer;
115
115
  padding: 0;
116
+ width: 1.5rem;
117
+ height: 1.5rem;
116
118
  display: flex;
117
119
  align-items: center;
118
120
  justify-content: center;
121
+ color: var(--mb-colour-greyscale-london-20, #1a1a1a);
122
+ transition:
123
+ background-color ease-in-out 0.2s,
124
+ color ease-in-out 0.2s;
125
+ }
126
+
127
+ .apm__close:hover {
128
+ color: var(--mb-colour-base-chicago-30, #333333);
129
+ }
130
+
131
+ .apm__close:active {
132
+ background-color: var(--mb-colour-base-chicago-90, #e6e6e6);
133
+ color: var(--mb-colour-base-chicago-30, #333333);
119
134
  }
120
135
 
121
136
  .apm__close:focus {
137
+ background-color: var(--mb-colour-base-chicago-90, #e6e6e6);
122
138
  outline: solid 0.125rem var(--focus-border-color, #121212);
123
139
  border-radius: 0.25rem;
124
140
  }
@@ -301,10 +317,6 @@ var apple_pay_modal_template_default = `<style>
301
317
  cursor: pointer;
302
318
  color: #fff;
303
319
  text-align: center;
304
- font-family: var(
305
- --mb-typeface-sans,
306
- var(--wall-type-system-sans, system-ui, sans-serif)
307
- );
308
320
  font-size: 1.25rem;
309
321
  font-style: normal;
310
322
  font-weight: 500;
@@ -421,7 +433,7 @@ var apple_pay_modal_template_default = `<style>
421
433
  fill-rule="evenodd"
422
434
  clip-rule="evenodd"
423
435
  d="M18.75 6.60964L17.3904 5.25L12 10.6404L6.60964 5.25L5.25 6.60964L10.6404 12L5.25 17.3904L6.60964 18.75L12 13.3596L17.3904 18.75L18.75 17.3904L13.3596 12L18.75 6.60964Z"
424
- fill="#333333"
436
+ fill="currentColor"
425
437
  />
426
438
  </g>
427
439
  <defs>
@@ -679,6 +691,8 @@ function renewalPeriodText(unit, duration) {
679
691
  return "";
680
692
  }
681
693
  }
694
+ var LI_SEPARATOR = "\0LI_SEP\0";
695
+ var P_SEPARATOR = "\0P_SEP\0";
682
696
  function buildTermsContext(offer, country) {
683
697
  const isUS = country === "US";
684
698
  const isCA = country === "CA";
@@ -715,19 +729,19 @@ function freeTrialTerms(offer, ctx) {
715
729
  const trialDuration = offer.subscription_options?.trial_period?.duration ?? 1;
716
730
  const trialDateStr = `on ${getRenewalDateText(trialUnit, trialDuration)}${ctx.verificationText}`;
717
731
  if (ctx.isUS) {
718
- return `Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${trialDateStr} when your free trial ends, until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}`;
732
+ return `Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${trialDateStr} when your free trial ends, until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}`;
719
733
  }
720
- return `Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${trialDateStr} when your free trial ends, until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
734
+ return `Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${trialDateStr} when your free trial ends, until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
721
735
  }
722
736
  function nytTerms(ctx) {
723
737
  const nytAccessText = "Your complimentary access to The New York Times is for one year only and does not auto-renew. We will send your instructions on how to redeem access to The New York Times by email.";
724
738
  if (ctx.isUS) {
725
- return `Your subscription to <em>The Economist</em> auto-renews ${ctx.periodText} until cancelled{{liSeparator}}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.renewalDateStr}{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}{{pSeparator}}${nytAccessText}`;
739
+ return `Your subscription to <em>The Economist</em> auto-renews ${ctx.periodText} until cancelled${LI_SEPARATOR}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.renewalDateStr}${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}${P_SEPARATOR}${nytAccessText}`;
726
740
  }
727
741
  if (ctx.isCA) {
728
- return `Your subscription to <em>The Economist</em> auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled.{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}{{pSeparator}}${nytAccessText}`;
742
+ return `Your subscription to <em>The Economist</em> auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled.${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}${P_SEPARATOR}${nytAccessText}`;
729
743
  }
730
- return `Your subscription to <em>The Economist</em> auto-renews at ${ctx.renewalPriceText} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime} ${nytAccessText}`;
744
+ return `Your subscription to <em>The Economist</em> auto-renews at ${ctx.renewalPriceText} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime} ${nytAccessText}`;
731
745
  }
732
746
  function minTermContractTerms(offer, ctx) {
733
747
  const duePrice = formatPrice(offer.price.purchase, offer.price.currency_code);
@@ -737,28 +751,28 @@ function minTermContractTerms(offer, ctx) {
737
751
  const contractLength = mtDuration && mtUnit ? `${mtDuration} ${mtUnit}` : "";
738
752
  const initialContractText = contractLength ? `your initial ${contractLength} contract` : "your initial contract";
739
753
  const mtRenewalDateText = mtUnit && mtDuration ? getRenewalDateText(mtUnit, Number(mtDuration)) : ctx.renewalDateText;
740
- return `You\u2019ll be charged ${duePrice} a month for the duration of ${initialContractText}{{liSeparator}}Your subscription auto-renews annually at ${ctx.renewalPriceText} a month on ${mtRenewalDateText} until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}`;
754
+ return `You\u2019ll be charged ${duePrice} a month for the duration of ${initialContractText}${LI_SEPARATOR}Your subscription auto-renews annually at ${ctx.renewalPriceText} a month on ${mtRenewalDateText} until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}`;
741
755
  }
742
756
  function paidTrialTerms(offer, ctx) {
743
757
  const trialUnit = offer.subscription_options?.trial_period?.unit ?? ctx.unit;
744
758
  const trialDuration = offer.subscription_options?.trial_period?.duration ?? ctx.duration;
745
759
  const trialDateText = getRenewalDateText(trialUnit, trialDuration);
746
760
  if (ctx.isUS) {
747
- return `Your subscription auto-renews ${ctx.periodText} until cancelled{{liSeparator}}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} on ${trialDateText} when your paid trial ends{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.usCancelNote}${ctx.taxFootnote}`;
761
+ return `Your subscription auto-renews ${ctx.periodText} until cancelled${LI_SEPARATOR}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} on ${trialDateText} when your paid trial ends${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.usCancelNote}${ctx.taxFootnote}`;
748
762
  }
749
- return `Your subscription auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} on ${trialDateText} when your paid trial ends, until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
763
+ return `Your subscription auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} on ${trialDateText} when your paid trial ends, until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
750
764
  }
751
765
  function autoRenewalTerms(ctx) {
752
766
  if (ctx.isUS) {
753
- return `Your subscription auto-renews ${ctx.periodText} until cancelled{{liSeparator}}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.renewalDateStr}{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}`;
767
+ return `Your subscription auto-renews ${ctx.periodText} until cancelled${LI_SEPARATOR}Your subscription renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.renewalDateStr}${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal until cancelled. ${ctx.usCancelNote}${ctx.taxFootnote}`;
754
768
  }
755
- return `Your subscription auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled{{liSeparator}}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
769
+ return `Your subscription auto-renews at ${ctx.renewalPriceText}${ctx.taxSuffix} ${ctx.periodText} ${ctx.renewalDateStr} until cancelled${LI_SEPARATOR}You\u2019ll be charged the rate in effect at each renewal. ${ctx.cancelAnytime}${ctx.taxFootnote}`;
756
770
  }
757
771
  function noAutoRenewalTerms(ctx) {
758
772
  if (ctx.isUS || ctx.isCA) {
759
- return `Your subscription does not renew automatically${ctx.taxFootnote}{{liSeparator}}`;
773
+ return `Your subscription does not renew automatically${ctx.taxFootnote}${LI_SEPARATOR}`;
760
774
  }
761
- return `Your subscription does not renew automatically{{liSeparator}}`;
775
+ return `Your subscription does not renew automatically${LI_SEPARATOR}`;
762
776
  }
763
777
  function generateApplePayModalTerms(offer, country) {
764
778
  const ctx = buildTermsContext(offer, country);
@@ -781,9 +795,9 @@ function generateApplePayModalTerms(offer, country) {
781
795
  return noAutoRenewalTerms(ctx);
782
796
  }
783
797
  function renderTermsHtml(termsText) {
784
- const renewalTextLists = termsText.split("{{liSeparator}}");
798
+ const renewalTextLists = termsText.split(LI_SEPARATOR);
785
799
  const lastPart = renewalTextLists.pop() || "";
786
- const renewalTextParagraphs = lastPart.split("{{pSeparator}}");
800
+ const renewalTextParagraphs = lastPart.split(P_SEPARATOR);
787
801
  const ulHtml = `<ul class="apm__terms-bullets">${renewalTextLists.map((value) => `<li>${value}</li>`).join("")}</ul>`;
788
802
  const paragraphHtml = renewalTextParagraphs.filter(Boolean).map((value) => `<p class="apm__terms-legal">${value}</p>`).join("");
789
803
  return ulHtml + paragraphHtml;
@@ -937,7 +951,6 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
937
951
  cta.removeAttribute("aria-busy");
938
952
  }
939
953
  }).catch(() => {
940
- console.error("[web-apple-pay] apple-pay-modal: failed to pre-fetch reCAPTCHA tokens; CTA remains disabled");
941
954
  if (cta) {
942
955
  cta.removeAttribute("aria-busy");
943
956
  }
@@ -1026,8 +1039,8 @@ var apple_pay_button_template_default = `<style>
1026
1039
  min-width: 0;
1027
1040
  height: 100%;
1028
1041
  min-height: var(--apple-pay-height, 2.75rem);
1029
- background-color: #000;
1030
- color: #fff;
1042
+ background-color: var(--apple-pay-background-color, #000);
1043
+ color: var(--apple-pay-foreground-color, #fff);
1031
1044
  border: none;
1032
1045
  border-radius: var(--apple-pay-border-radius, 1.375rem);
1033
1046
  cursor: pointer;
@@ -1039,6 +1052,7 @@ var apple_pay_button_template_default = `<style>
1039
1052
  teg-apple-pay-button .apple-pay-btn svg {
1040
1053
  flex-shrink: 0;
1041
1054
  display: block;
1055
+ color: currentColor;
1042
1056
  }
1043
1057
 
1044
1058
  teg-apple-pay-button .apple-pay-btn.wap-loading {
@@ -1053,8 +1067,8 @@ var apple_pay_button_template_default = `<style>
1053
1067
  left: 50%;
1054
1068
  width: 1.25rem;
1055
1069
  height: 1.25rem;
1056
- border: 2px solid rgba(255, 255, 255, 0.25);
1057
- border-top-color: #fff;
1070
+ border: 2px solid var(--apple-pay-spinner-track-color, rgba(255, 255, 255, 0.25));
1071
+ border-top-color: var(--apple-pay-spinner-head-color, currentColor);
1058
1072
  border-radius: 50%;
1059
1073
  animation: wap-button-spinner 0.8s linear infinite;
1060
1074
  }
@@ -1122,15 +1136,11 @@ var isApplePayAvailable = async () => {
1122
1136
  }
1123
1137
  const merchantId = getApplePayConfig()?.merchantId;
1124
1138
  if (!merchantId) {
1125
- console.warn(
1126
- "[web-apple-pay] Missing merchantId. Call configureApplePay({ merchantId, ... }) before rendering Apple Pay components."
1127
- );
1128
1139
  return false;
1129
1140
  }
1130
1141
  const hasActiveCard = await applePaySession.canMakePaymentsWithActiveCard(merchantId);
1131
1142
  return hasActiveCard;
1132
- } catch (error) {
1133
- console.error("Error checking Apple Pay active card status:", error);
1143
+ } catch {
1134
1144
  return false;
1135
1145
  }
1136
1146
  };
@@ -1218,13 +1228,25 @@ var getExpressCheckoutSession = () => {
1218
1228
  };
1219
1229
 
1220
1230
  // src/utils/expressCheckoutRedirect.ts
1221
- var captureOriginUrl = () => window.location.href;
1222
- var buildQueryString = () => {
1223
- const countryCode = new URLSearchParams(window.location.search).get(
1224
- "country"
1225
- );
1226
- return countryCode ? `&country=${encodeURIComponent(countryCode)}` : "";
1231
+ var CHECKOUT_REDIRECT_KEY = "checkout-redirect";
1232
+ var ALLOWED_REDIRECT_HOSTNAME = "economist.com";
1233
+ function isAllowedRedirectUrl(url) {
1234
+ if (url.startsWith("/")) return !url.startsWith("//");
1235
+ try {
1236
+ const { hostname } = new URL(url);
1237
+ return hostname === ALLOWED_REDIRECT_HOSTNAME || hostname.endsWith(`.${ALLOWED_REDIRECT_HOSTNAME}`);
1238
+ } catch {
1239
+ return false;
1240
+ }
1241
+ }
1242
+ var writeCheckoutRedirect = (originUrl) => {
1243
+ if (!isAllowedRedirectUrl(originUrl)) return;
1244
+ try {
1245
+ localStorage.setItem(CHECKOUT_REDIRECT_KEY, originUrl);
1246
+ } catch {
1247
+ }
1227
1248
  };
1249
+ var captureOriginUrl = () => window.location.href;
1228
1250
  var decodeSku = (sku) => {
1229
1251
  try {
1230
1252
  return atob(sku.substring(sku.indexOf("-") + 1));
@@ -1235,14 +1257,11 @@ var decodeSku = (sku) => {
1235
1257
  var redirectToCheckoutComplete = (params) => {
1236
1258
  const url = new URL("/checkout/complete", window.location.origin);
1237
1259
  url.searchParams.set("basketId", params.basketId);
1238
- if (params.queryString) {
1239
- const qs = params.queryString.startsWith("?") ? params.queryString.slice(1) : params.queryString;
1240
- new URLSearchParams(qs).forEach((v, k) => url.searchParams.set(k, v));
1241
- }
1242
1260
  url.searchParams.set("lmo_offer", params.skuId);
1243
1261
  url.searchParams.set("status", params.status);
1244
1262
  url.searchParams.set("redirectToCheckout", "true");
1245
- url.searchParams.set("returnUrl", params.returnUrl);
1263
+ if (params.email) url.searchParams.set("email", params.email);
1264
+ if (params.country) url.searchParams.set("country", params.country);
1246
1265
  return url.pathname + url.search;
1247
1266
  };
1248
1267
  var redirectToCheckoutFallback = (params) => {
@@ -1253,7 +1272,7 @@ var redirectToCheckoutFallback = (params) => {
1253
1272
  url.searchParams.set("inlineError", params.inlineError);
1254
1273
  if (params.email) url.searchParams.set("email", params.email);
1255
1274
  if (params.emailError) url.searchParams.set("emailError", params.emailError);
1256
- url.searchParams.set("returnUrl", params.returnUrl);
1275
+ if (params.country) url.searchParams.set("country", params.country);
1257
1276
  return url.pathname + url.search;
1258
1277
  };
1259
1278
 
@@ -1337,17 +1356,16 @@ var MSG_EMAIL_WRONG_FORMAT = "That email doesn\u2019t look right. Please enter a
1337
1356
  var MSG_EMAIL_TOO_LONG = "This field must be 80 characters or less.";
1338
1357
  var MSG_UNSUPPORTED_BILLING_COUNTRY = "Billing country does not match offer price zone";
1339
1358
  var MSG_PAYMENT_GENERIC_ERROR = "Something went wrong. Please check your payment and billing details and try again or contact us.";
1340
- var MSG_RECAPTCHA_VALIDATION_FAILED = "Security check failed. Please try again.";
1341
- var MSG_EMAIL_COLLISION = "This email address is already linked to an account. Please log in, or try a different email address.";
1342
1359
  var MSG_CONTACT_VALIDATION_INTERNAL = "Could not validate Apple Pay contact";
1343
1360
 
1344
1361
  // src/clients/payment-checkout/apple-session.ts
1345
1362
  function redirectToFallbackCheckout(config) {
1363
+ writeCheckoutRedirect(config.returnUrl);
1346
1364
  trackFallbackCheckout(config.skuId);
1347
1365
  window.location.href = redirectToCheckoutFallback({
1348
1366
  skuId: config.skuId,
1349
- returnUrl: config.returnUrl,
1350
- inlineError: MSG_PAYMENT_GENERIC_ERROR
1367
+ inlineError: MSG_PAYMENT_GENERIC_ERROR,
1368
+ country: config.countryCode
1351
1369
  });
1352
1370
  }
1353
1371
  async function handleMerchantValidation(event, session, config) {
@@ -1369,8 +1387,7 @@ async function handleMerchantValidation(event, session, config) {
1369
1387
  return;
1370
1388
  }
1371
1389
  session.completeMerchantValidation(response.merchantSession);
1372
- } catch (err) {
1373
- console.error("[web-apple-pay] onvalidatemerchant: error during validation", err);
1390
+ } catch {
1374
1391
  session.abort();
1375
1392
  redirectToFallbackCheckout(config);
1376
1393
  }
@@ -1403,8 +1420,7 @@ function startApplePaySession(config) {
1403
1420
  };
1404
1421
  trackWalletPaymentSheetOpen(config.skuId);
1405
1422
  session.begin();
1406
- } catch (err) {
1407
- console.error("[web-apple-pay] startApplePaySession: failed to create session", err);
1423
+ } catch {
1408
1424
  redirectToFallbackCheckout(config);
1409
1425
  }
1410
1426
  }
@@ -1526,8 +1542,6 @@ var shippingContactDetails = (shippingContact) => {
1526
1542
  };
1527
1543
 
1528
1544
  // src/clients/payment-checkout/payment-handler.ts
1529
- var MSG_ELIGIBILITY = "Something went wrong, please try again";
1530
- var MSG_REGISTRATION = "We couldn't create your account. Please enter your email or try a different login method.";
1531
1545
  var failApplePaySession = (session, errors = []) => {
1532
1546
  session.completePayment({
1533
1547
  status: ApplePaySession.STATUS_FAILURE,
@@ -1551,37 +1565,42 @@ function validateContacts(event, sessionData, supportedBillingCountries) {
1551
1565
  }
1552
1566
  return void 0;
1553
1567
  }
1554
- function redirectFallback(skuId, returnUrl, options) {
1568
+ function redirectFallback(skuId, returnUrl, country, options) {
1569
+ writeCheckoutRedirect(returnUrl);
1555
1570
  trackFallbackCheckout(skuId);
1556
1571
  window.location.href = redirectToCheckoutFallback({
1557
1572
  skuId,
1558
- returnUrl,
1573
+ country,
1559
1574
  ...options
1560
1575
  });
1561
1576
  }
1562
1577
  var ERROR_HANDLERS = {
1563
- EMAIL_COLLISION: ({ skuId, returnUrl, validatedEmail }) => redirectFallback(skuId, returnUrl, {
1564
- emailError: MSG_EMAIL_COLLISION,
1578
+ // emailError flows as an inline field error on the email input.
1579
+ // email pre-populates the input so the user doesn't have to retype it.
1580
+ EMAIL_COLLISION: ({ skuId, returnUrl, country, validatedEmail, walletError }) => redirectFallback(skuId, returnUrl, country, {
1581
+ emailError: walletError.message,
1565
1582
  email: validatedEmail
1566
1583
  }),
1567
- PAYMENT_DECLINED: ({ skuId, returnUrl }) => (
1568
- // Matches sma-checkout catch-all: always redirect with generic inlineError.
1569
- redirectFallback(skuId, returnUrl, { inlineError: MSG_PAYMENT_GENERIC_ERROR })
1570
- ),
1571
- ELIGIBILITY_REJECTED: ({ skuId, returnUrl }) => redirectFallback(skuId, returnUrl, { inlineError: MSG_ELIGIBILITY }),
1572
- REGISTRATION_FAILED: ({ skuId, returnUrl }) => redirectFallback(skuId, returnUrl, { inlineError: MSG_REGISTRATION }),
1573
- VALIDATION_ERROR: ({ skuId, returnUrl }) => redirectFallback(skuId, returnUrl, { inlineError: MSG_RECAPTCHA_VALIDATION_FAILED })
1584
+ PAYMENT_DECLINED: ({ skuId, returnUrl, country, walletError }) => redirectFallback(skuId, returnUrl, country, { inlineError: walletError.message }),
1585
+ ELIGIBILITY_REJECTED: ({ skuId, returnUrl, country, walletError }) => redirectFallback(skuId, returnUrl, country, { inlineError: walletError.message }),
1586
+ REGISTRATION_FAILED: ({ skuId, returnUrl, country, walletError }) => redirectFallback(skuId, returnUrl, country, { inlineError: walletError.message }),
1587
+ ACCOUNT_CREATION_FAILED: ({ skuId, returnUrl, country, validatedEmail, walletError }) => redirectFallback(skuId, returnUrl, country, {
1588
+ emailError: walletError.message,
1589
+ email: validatedEmail
1590
+ }),
1591
+ VALIDATION_ERROR: ({ skuId, returnUrl, country, walletError }) => redirectFallback(skuId, returnUrl, country, { inlineError: walletError.message }),
1592
+ RECAPTCHA_FAILED: ({ skuId, returnUrl, country, walletError }) => redirectFallback(skuId, returnUrl, country, { inlineError: walletError.message })
1574
1593
  };
1575
1594
  function handleStructuredError(ctx) {
1576
1595
  const handler = ERROR_HANDLERS[ctx.walletError.errorType];
1577
1596
  if (handler) {
1578
1597
  handler(ctx);
1579
1598
  } else {
1580
- redirectFallback(ctx.skuId, ctx.returnUrl, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
1599
+ redirectFallback(ctx.skuId, ctx.returnUrl, ctx.country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
1581
1600
  }
1582
1601
  }
1583
1602
  async function handlePaymentAuthorized(event, session, sessionData, config) {
1584
- const { skuId, returnUrl, queryString } = config;
1603
+ const { skuId, returnUrl, country } = config;
1585
1604
  let validatedEmail;
1586
1605
  try {
1587
1606
  validatedEmail = validateContacts(
@@ -1601,28 +1620,29 @@ async function handlePaymentAuthorized(event, session, sessionData, config) {
1601
1620
  });
1602
1621
  trackWalletPaymentSuccess(skuId, result.basketId);
1603
1622
  session.completePayment({ status: ApplePaySession.STATUS_SUCCESS });
1623
+ const successEmail = sessionData.loggedIn ? sessionData.emailAddress : validatedEmail;
1604
1624
  const userStatus = sessionData.loggedIn ? "lex" : "nex";
1625
+ writeCheckoutRedirect(returnUrl);
1605
1626
  window.location.href = redirectToCheckoutComplete({
1606
1627
  basketId: result.basketId,
1607
1628
  status: userStatus,
1608
1629
  skuId: decodeSku(skuId),
1609
- returnUrl,
1610
- queryString
1630
+ email: successEmail,
1631
+ country
1611
1632
  });
1612
1633
  } catch (err) {
1613
1634
  if (err instanceof ContactValidationError) {
1614
1635
  failApplePaySession(session, err.errors);
1615
1636
  return;
1616
1637
  }
1617
- console.error("[web-apple-pay] onpaymentauthorized error", { skuId, err });
1618
1638
  const walletError = parseWalletApiError(err);
1619
1639
  trackWalletPaymentFailure(skuId, walletError?.errorType ?? "UNKNOWN");
1620
1640
  failApplePaySession(session);
1621
1641
  if (!walletError) {
1622
- redirectFallback(skuId, returnUrl, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
1642
+ redirectFallback(skuId, returnUrl, country, { inlineError: MSG_PAYMENT_GENERIC_ERROR });
1623
1643
  return;
1624
1644
  }
1625
- handleStructuredError({ skuId, returnUrl, validatedEmail, walletError });
1645
+ handleStructuredError({ skuId, returnUrl, country, validatedEmail, walletError });
1626
1646
  }
1627
1647
  }
1628
1648
 
@@ -1892,7 +1912,6 @@ var FEATURE_APPLE_PAY_EXPRESS_CHECKOUT = "FEATURE_APPLE_PAY_EXPRESS_CHECKOUT";
1892
1912
  var TOTAL_LABEL = "The Economist";
1893
1913
  var DEFAULT_CURRENCY = "USD";
1894
1914
  var DEFAULT_TOTAL = "0.00";
1895
- var ERROR_INITIATE = "Failed to initiate Apple Pay session:";
1896
1915
  var SEL_CONTAINER = ".apple-pay-container";
1897
1916
  var SEL_BUTTON = ".apple-pay-btn";
1898
1917
  var APPLE_PAY_EXCLUDED_VARIANTS = [
@@ -2024,8 +2043,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2024
2043
  this.#computeBillingCountries();
2025
2044
  if (await this.#fetchAndCacheOptions()) return;
2026
2045
  this.#finishLoading();
2027
- } catch (err) {
2028
- console.error("[web-apple-pay] #run: unexpected error, hiding button", err);
2046
+ } catch {
2029
2047
  this.style.display = "none";
2030
2048
  this.querySelector(SEL_CONTAINER)?.remove();
2031
2049
  } finally {
@@ -2164,8 +2182,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2164
2182
  */
2165
2183
  #scheduleRecaptchaTokens() {
2166
2184
  const attempt = getPurchaseRecaptchaTokens();
2167
- attempt.catch((err) => {
2168
- console.error("[web-apple-pay] reCAPTCHA token pre-fetch failed; will retry on modal open", err);
2185
+ attempt.catch(() => {
2169
2186
  if (this.#recaptchaTokensPromise === attempt) {
2170
2187
  this.#recaptchaTokensPromise = null;
2171
2188
  }
@@ -2208,7 +2225,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2208
2225
  country,
2209
2226
  currency: offer.price?.currency_code ?? DEFAULT_CURRENCY,
2210
2227
  returnUrl: this.#returnUrl,
2211
- queryString: buildQueryString(),
2212
2228
  supportedBillingCountries: this.#supportedBillingCountries,
2213
2229
  recaptchaTokens
2214
2230
  })
@@ -2227,8 +2243,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
2227
2243
  recaptchaTokens
2228
2244
  )
2229
2245
  );
2230
- } catch (error) {
2231
- console.error(ERROR_INITIATE, error);
2246
+ } catch {
2232
2247
  }
2233
2248
  }
2234
2249
  };