@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.
- package/dist/index.js +95 -79
- package/dist/src/apple-pay-button.js +94 -79
- package/dist/src/apple-pay-button.stories.js +94 -79
- package/dist/src/apple-pay-logo.js +1 -1
- package/dist/src/apple-pay-modal.js +35 -22
- package/dist/src/apple-pay-modal.stories.js +94 -79
- package/dist/src/clients/payment-checkout/apple-session.js +24 -7
- package/dist/src/clients/payment-checkout/detects.js +1 -5
- package/dist/src/clients/payment-checkout/messages.d.ts +13 -14
- package/dist/src/clients/payment-checkout/messages.js +0 -4
- package/dist/src/clients/payment-checkout/payment-handler.d.ts +0 -8
- package/dist/src/clients/payment-checkout/payment-handler.js +45 -28
- package/dist/src/clients/payment-checkout/types.d.ts +1 -1
- package/dist/src/constants.d.ts +2 -1
- package/dist/src/constants.js +1 -0
- package/dist/src/index.js +95 -79
- package/dist/src/utils/expressCheckoutRedirect.d.ts +29 -7
- package/dist/src/utils/expressCheckoutRedirect.js +23 -7
- package/package.json +1 -1
|
@@ -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="
|
|
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:
|
|
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="
|
|
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{
|
|
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{
|
|
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{
|
|
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
|
|
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{
|
|
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}{
|
|
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{
|
|
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{
|
|
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{
|
|
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{
|
|
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}{
|
|
773
|
+
return `Your subscription does not renew automatically${ctx.taxFootnote}${LI_SEPARATOR}`;
|
|
760
774
|
}
|
|
761
|
-
return `Your subscription does not renew automatically{
|
|
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(
|
|
798
|
+
const renewalTextLists = termsText.split(LI_SEPARATOR);
|
|
785
799
|
const lastPart = renewalTextLists.pop() || "";
|
|
786
|
-
const renewalTextParagraphs = lastPart.split(
|
|
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:
|
|
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
|
|
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
|
|
1222
|
-
var
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
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("
|
|
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("
|
|
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
|
-
|
|
1350
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
1573
|
+
country,
|
|
1559
1574
|
...options
|
|
1560
1575
|
});
|
|
1561
1576
|
}
|
|
1562
1577
|
var ERROR_HANDLERS = {
|
|
1563
|
-
|
|
1564
|
-
|
|
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
|
-
|
|
1569
|
-
|
|
1570
|
-
),
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
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,
|
|
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
|
-
|
|
1610
|
-
|
|
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
|
|
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((
|
|
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
|
|
2231
|
-
console.error(ERROR_INITIATE, error);
|
|
2246
|
+
} catch {
|
|
2232
2247
|
}
|
|
2233
2248
|
}
|
|
2234
2249
|
};
|