@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 +128 -98
- package/dist/src/apple-pay-button.js +128 -98
- package/dist/src/apple-pay-button.stories.js +128 -98
- package/dist/src/apple-pay-logo.js +2 -1
- package/dist/src/apple-pay-modal.d.ts +9 -14
- package/dist/src/apple-pay-modal.js +38 -45
- package/dist/src/apple-pay-modal.stories.js +128 -98
- package/dist/src/clients/payment-checkout/apple-session.d.ts +1 -0
- package/dist/src/clients/payment-checkout/apple-session.js +11 -6
- package/dist/src/index.js +128 -98
- package/dist/src/utils/recaptcha.d.ts +9 -3
- package/dist/src/utils/recaptcha.js +6 -5
- package/package.json +1 -1
|
@@ -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
|
|
|
@@ -578,10 +579,9 @@ var loadRecaptchaScript = (siteKey) => {
|
|
|
578
579
|
);
|
|
579
580
|
if (existingScript) {
|
|
580
581
|
existingScript.addEventListener("load", () => resolve());
|
|
581
|
-
existingScript.addEventListener(
|
|
582
|
-
"
|
|
583
|
-
|
|
584
|
-
);
|
|
582
|
+
existingScript.addEventListener("error", () => {
|
|
583
|
+
reject(new Error("Failed to load existing reCAPTCHA script"));
|
|
584
|
+
});
|
|
585
585
|
return;
|
|
586
586
|
}
|
|
587
587
|
const script = document.createElement("script");
|
|
@@ -589,7 +589,9 @@ var loadRecaptchaScript = (siteKey) => {
|
|
|
589
589
|
script.async = true;
|
|
590
590
|
script.defer = true;
|
|
591
591
|
script.onload = () => resolve();
|
|
592
|
-
script.onerror = () =>
|
|
592
|
+
script.onerror = () => {
|
|
593
|
+
reject(new Error("Failed to load reCAPTCHA script"));
|
|
594
|
+
};
|
|
593
595
|
document.head.appendChild(script);
|
|
594
596
|
});
|
|
595
597
|
};
|
|
@@ -838,17 +840,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
838
840
|
#country = "";
|
|
839
841
|
#triggerElement = null;
|
|
840
842
|
#keyHandler = null;
|
|
841
|
-
#
|
|
842
|
-
#recaptchaTokensPromise = null;
|
|
843
|
+
#isClosed = false;
|
|
843
844
|
/**
|
|
844
|
-
*
|
|
845
|
-
*
|
|
846
|
-
*
|
|
847
|
-
*
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
* until the token pre-fetch resolves, so this callback is never reached
|
|
851
|
-
* without valid tokens.
|
|
845
|
+
* Callback invoked synchronously from the CTA click handler.
|
|
846
|
+
* Receives a Promise of reCAPTCHA tokens — the promise is already in-flight
|
|
847
|
+
* by the time this is called. The caller (ApplePayButton) must call
|
|
848
|
+
* new ApplePaySession() synchronously inside this callback to stay within
|
|
849
|
+
* Safari's user-gesture window. The token promise resolves before
|
|
850
|
+
* onPaymentAuthorized fires (user still needs to authenticate on the sheet).
|
|
852
851
|
*/
|
|
853
852
|
onConfirm = null;
|
|
854
853
|
set offer(value) {
|
|
@@ -945,28 +944,32 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
945
944
|
}
|
|
946
945
|
});
|
|
947
946
|
}
|
|
948
|
-
|
|
949
|
-
if (cta)
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
947
|
+
cta?.addEventListener("click", () => {
|
|
948
|
+
if (cta.disabled) return;
|
|
949
|
+
if (isUS && checkbox && !checkbox.checked) {
|
|
950
|
+
errorElement?.classList.add("apm__error--visible");
|
|
951
|
+
checkboxLabel?.classList.add("apm__checkbox-label--error");
|
|
952
|
+
return;
|
|
953
953
|
}
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
954
|
+
errorElement?.classList.remove("apm__error--visible");
|
|
955
|
+
this.querySelector('[role="alert"]:not(#apple-pay-modal-error)')?.remove();
|
|
956
|
+
cta.disabled = true;
|
|
957
|
+
cta.setAttribute("aria-busy", "true");
|
|
958
|
+
const recaptchaTokensPromise = getPurchaseRecaptchaTokens();
|
|
959
|
+
if (!this.#isClosed && this.onConfirm) {
|
|
960
|
+
this.onConfirm(recaptchaTokensPromise);
|
|
961
|
+
this.close();
|
|
962
|
+
}
|
|
963
|
+
recaptchaTokensPromise.catch(() => {
|
|
964
|
+
if (this.#isClosed) return;
|
|
965
|
+
cta.disabled = false;
|
|
966
|
+
cta.removeAttribute("aria-busy");
|
|
965
967
|
const existingError = this.querySelector("#apple-pay-modal-error");
|
|
966
968
|
if (existingError) {
|
|
967
969
|
const icon = existingError.querySelector("svg");
|
|
968
970
|
existingError.textContent = MSG_RECAPTCHA_LOAD_ERROR;
|
|
969
971
|
if (icon) existingError.prepend(icon);
|
|
972
|
+
existingError.setAttribute("role", "alert");
|
|
970
973
|
existingError.classList.add("apm__error--visible");
|
|
971
974
|
} else {
|
|
972
975
|
const errorNotice = document.createElement("div");
|
|
@@ -976,25 +979,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
976
979
|
cta?.insertAdjacentElement("beforebegin", errorNotice);
|
|
977
980
|
}
|
|
978
981
|
});
|
|
979
|
-
}
|
|
980
|
-
cta?.addEventListener("click", () => {
|
|
981
|
-
if (isUS && checkbox && !checkbox.checked) {
|
|
982
|
-
errorElement?.classList.add("apm__error--visible");
|
|
983
|
-
checkboxLabel?.classList.add("apm__checkbox-label--error");
|
|
984
|
-
return;
|
|
985
|
-
}
|
|
986
|
-
if (this.#recaptchaTokens) {
|
|
987
|
-
this.onConfirm?.(this.#recaptchaTokens);
|
|
988
|
-
this.close();
|
|
989
|
-
}
|
|
990
982
|
});
|
|
991
983
|
this.querySelector("#apple-pay-modal-close")?.addEventListener(
|
|
992
984
|
"click",
|
|
993
985
|
() => this.close()
|
|
994
986
|
);
|
|
995
987
|
}
|
|
996
|
-
open(
|
|
997
|
-
this.#
|
|
988
|
+
open() {
|
|
989
|
+
this.#isClosed = false;
|
|
998
990
|
this.#triggerElement = document.activeElement;
|
|
999
991
|
document.body.appendChild(this);
|
|
1000
992
|
this.#keyHandler = (event) => {
|
|
@@ -1009,6 +1001,7 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
1009
1001
|
this.querySelector("#apple-pay-modal")?.focus();
|
|
1010
1002
|
}
|
|
1011
1003
|
close() {
|
|
1004
|
+
this.#isClosed = true;
|
|
1012
1005
|
if (this.#keyHandler) {
|
|
1013
1006
|
document.removeEventListener("keydown", this.#keyHandler, {
|
|
1014
1007
|
capture: true
|
|
@@ -1022,8 +1015,27 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
1022
1015
|
|
|
1023
1016
|
// src/templates/apple-pay-button.template.html
|
|
1024
1017
|
var apple_pay_button_template_default = `<style>
|
|
1025
|
-
/*
|
|
1018
|
+
/*
|
|
1019
|
+
* Entry CTA only: \u201CSubscribe with [apple logo] Apple Pay\u201D.
|
|
1020
|
+
* Uses OS SF Pro via local() (no Marber). Modal styling is unchanged.
|
|
1021
|
+
*/
|
|
1022
|
+
@font-face {
|
|
1023
|
+
font-family: 'WAP Apple Pay Text';
|
|
1024
|
+
src:
|
|
1025
|
+
local('SF Pro Text Light'),
|
|
1026
|
+
local('SFProText-Light'),
|
|
1027
|
+
local('SF Pro Text'),
|
|
1028
|
+
local('SFProText-Regular'),
|
|
1029
|
+
local('-apple-system'),
|
|
1030
|
+
local('BlinkMacSystemFont'),
|
|
1031
|
+
local('Helvetica Neue');
|
|
1032
|
+
font-weight: 300;
|
|
1033
|
+
font-style: normal;
|
|
1034
|
+
font-display: swap;
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1026
1037
|
teg-apple-pay-button {
|
|
1038
|
+
--wap-apple-pay-scale: 1.375; /* default height 44px / 32 */
|
|
1027
1039
|
display: block;
|
|
1028
1040
|
margin: var(--apple-pay-margin, 0);
|
|
1029
1041
|
width: 100%;
|
|
@@ -1039,27 +1051,43 @@ var apple_pay_button_template_default = `<style>
|
|
|
1039
1051
|
}
|
|
1040
1052
|
|
|
1041
1053
|
teg-apple-pay-button .apple-pay-btn {
|
|
1042
|
-
display: flex;
|
|
1054
|
+
display: inline-flex;
|
|
1043
1055
|
align-items: center;
|
|
1044
1056
|
justify-content: center;
|
|
1045
|
-
gap: 0.375rem;
|
|
1046
1057
|
width: 100%;
|
|
1047
1058
|
min-width: 0;
|
|
1048
1059
|
height: 100%;
|
|
1049
1060
|
min-height: var(--apple-pay-height, 2.75rem);
|
|
1061
|
+
padding: 0 calc(8px * var(--wap-apple-pay-scale));
|
|
1062
|
+
box-sizing: border-box;
|
|
1050
1063
|
background-color: var(--apple-pay-background-color, #000);
|
|
1051
1064
|
color: var(--apple-pay-foreground-color, #fff);
|
|
1052
1065
|
border: none;
|
|
1053
|
-
border-radius: var(--apple-pay-border-radius,
|
|
1066
|
+
border-radius: var(--apple-pay-border-radius, 5px);
|
|
1054
1067
|
cursor: pointer;
|
|
1055
|
-
font-family:
|
|
1056
|
-
|
|
1057
|
-
font-
|
|
1068
|
+
font-family: 'WAP Apple Pay Text', -apple-system, BlinkMacSystemFont,
|
|
1069
|
+
'SF Pro Text', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
|
1070
|
+
font-size: calc(12px * var(--wap-apple-pay-scale));
|
|
1071
|
+
font-weight: 300;
|
|
1072
|
+
font-style: normal;
|
|
1073
|
+
line-height: 1;
|
|
1074
|
+
letter-spacing: -0.01em;
|
|
1075
|
+
-webkit-font-smoothing: antialiased;
|
|
1076
|
+
-moz-osx-font-smoothing: grayscale;
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
teg-apple-pay-button .apple-pay-btn__label {
|
|
1080
|
+
display: inline-flex;
|
|
1081
|
+
align-items: center;
|
|
1082
|
+
gap: calc(4px * var(--wap-apple-pay-scale));
|
|
1083
|
+
white-space: nowrap;
|
|
1058
1084
|
}
|
|
1059
1085
|
|
|
1060
|
-
teg-apple-pay-button .apple-pay-
|
|
1086
|
+
teg-apple-pay-button .apple-pay-btn__apple-logo {
|
|
1061
1087
|
flex-shrink: 0;
|
|
1062
1088
|
display: block;
|
|
1089
|
+
width: calc(12px * var(--wap-apple-pay-scale));
|
|
1090
|
+
height: calc(14px * var(--wap-apple-pay-scale));
|
|
1063
1091
|
color: currentColor;
|
|
1064
1092
|
}
|
|
1065
1093
|
|
|
@@ -1068,6 +1096,10 @@ var apple_pay_button_template_default = `<style>
|
|
|
1068
1096
|
cursor: default;
|
|
1069
1097
|
}
|
|
1070
1098
|
|
|
1099
|
+
teg-apple-pay-button .apple-pay-btn.wap-loading .apple-pay-btn__label {
|
|
1100
|
+
visibility: hidden;
|
|
1101
|
+
}
|
|
1102
|
+
|
|
1071
1103
|
teg-apple-pay-button .apple-pay-btn.wap-loading::before {
|
|
1072
1104
|
content: '';
|
|
1073
1105
|
position: absolute;
|
|
@@ -1081,11 +1113,6 @@ var apple_pay_button_template_default = `<style>
|
|
|
1081
1113
|
animation: wap-button-spinner 0.8s linear infinite;
|
|
1082
1114
|
}
|
|
1083
1115
|
|
|
1084
|
-
teg-apple-pay-button .apple-pay-btn__logo {
|
|
1085
|
-
display: inline-flex;
|
|
1086
|
-
align-items: center;
|
|
1087
|
-
}
|
|
1088
|
-
|
|
1089
1116
|
teg-apple-pay-button .apple-pay-btn__loading {
|
|
1090
1117
|
display: none;
|
|
1091
1118
|
}
|
|
@@ -1100,17 +1127,26 @@ var apple_pay_button_template_default = `<style>
|
|
|
1100
1127
|
}
|
|
1101
1128
|
</style>
|
|
1102
1129
|
|
|
1103
|
-
<div class="apple-pay-container" aria-label="
|
|
1130
|
+
<div class="apple-pay-container" aria-label="Subscribe with Apple Pay">
|
|
1104
1131
|
<button
|
|
1105
1132
|
class="apple-pay-btn"
|
|
1106
1133
|
type="button"
|
|
1107
|
-
aria-label="
|
|
1134
|
+
aria-label="Subscribe with Apple Pay"
|
|
1108
1135
|
data-analytics="paywall:apple-pay-checkout"
|
|
1109
1136
|
>
|
|
1110
|
-
<span class="apple-pay-
|
|
1111
|
-
|
|
1112
|
-
|
|
1137
|
+
<span class="apple-pay-btn__label">
|
|
1138
|
+
Subscribe with
|
|
1139
|
+
<svg
|
|
1140
|
+
class="apple-pay-btn__apple-logo"
|
|
1141
|
+
width="17"
|
|
1142
|
+
height="19"
|
|
1143
|
+
viewBox="0 0 15 18"
|
|
1144
|
+
aria-hidden="true"
|
|
1145
|
+
role="img"
|
|
1146
|
+
>
|
|
1147
|
+
<use href="#apple-logo" />
|
|
1113
1148
|
</svg>
|
|
1149
|
+
Apple Pay
|
|
1114
1150
|
</span>
|
|
1115
1151
|
<span class="apple-pay-btn__loading" aria-hidden="true">Loading...</span>
|
|
1116
1152
|
</button>
|
|
@@ -1421,7 +1457,10 @@ function startApplePaySession(config) {
|
|
|
1421
1457
|
};
|
|
1422
1458
|
session.onpaymentauthorized = (event) => {
|
|
1423
1459
|
trackWalletPaymentAuthorised(config.skuId);
|
|
1424
|
-
config.onPaymentAuthorized(event, session)
|
|
1460
|
+
config.onPaymentAuthorized(event, session).catch(() => {
|
|
1461
|
+
session.completePayment({ status: ApplePaySession.STATUS_FAILURE });
|
|
1462
|
+
redirectToFallbackCheckout(config);
|
|
1463
|
+
});
|
|
1425
1464
|
};
|
|
1426
1465
|
session.oncancel = () => {
|
|
1427
1466
|
config.onCancel?.();
|
|
@@ -1972,7 +2011,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
1972
2011
|
#returnUrl = "";
|
|
1973
2012
|
#supportedBillingCountries = [];
|
|
1974
2013
|
#entryPoint = "";
|
|
1975
|
-
#recaptchaTokensPromise = null;
|
|
1976
2014
|
// ─── Public API ─────────────────────────────────────────────────────────────
|
|
1977
2015
|
get offer() {
|
|
1978
2016
|
return this.#offer;
|
|
@@ -2037,7 +2075,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2037
2075
|
this.#paymentOptions = null;
|
|
2038
2076
|
this.#returnUrl = "";
|
|
2039
2077
|
this.#supportedBillingCountries = [];
|
|
2040
|
-
this.#recaptchaTokensPromise = null;
|
|
2041
2078
|
this.querySelector(SEL_CONTAINER)?.remove();
|
|
2042
2079
|
}
|
|
2043
2080
|
// ─── Render pipeline ────────────────────────────────────────────────────────
|
|
@@ -2140,7 +2177,6 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2140
2177
|
if (button) {
|
|
2141
2178
|
button.classList.remove("wap-loading");
|
|
2142
2179
|
this.#updateDisabledState();
|
|
2143
|
-
this.#scheduleRecaptchaTokens();
|
|
2144
2180
|
trackExpressWalletImpression(this.#offer.sku_id, {
|
|
2145
2181
|
entryPoint: this.#entryPoint,
|
|
2146
2182
|
country: this.#country
|
|
@@ -2177,27 +2213,10 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2177
2213
|
}
|
|
2178
2214
|
const skuId = this.#offer.sku_id;
|
|
2179
2215
|
const country = this.#country;
|
|
2180
|
-
modal.onConfirm = (
|
|
2181
|
-
this.#initiateApplePay(skuId, country,
|
|
2182
|
-
this.#scheduleRecaptchaTokens();
|
|
2216
|
+
modal.onConfirm = (recaptchaTokensPromise) => {
|
|
2217
|
+
this.#initiateApplePay(skuId, country, recaptchaTokensPromise);
|
|
2183
2218
|
};
|
|
2184
|
-
modal.open(
|
|
2185
|
-
}
|
|
2186
|
-
/**
|
|
2187
|
-
* Starts a fresh reCAPTCHA token pre-fetch and stores its promise.
|
|
2188
|
-
* If the fetch rejects, the field is cleared so the next `modal.open()` call
|
|
2189
|
-
* falls back to a new attempt via the modal's own null-fallback path — preventing
|
|
2190
|
-
* a single transient failure from permanently disabling the CTA on all retries.
|
|
2191
|
-
* The identity guard prevents a late rejection from clobbering a newer attempt.
|
|
2192
|
-
*/
|
|
2193
|
-
#scheduleRecaptchaTokens() {
|
|
2194
|
-
const attempt = getPurchaseRecaptchaTokens();
|
|
2195
|
-
attempt.catch(() => {
|
|
2196
|
-
if (this.#recaptchaTokensPromise === attempt) {
|
|
2197
|
-
this.#recaptchaTokensPromise = null;
|
|
2198
|
-
}
|
|
2199
|
-
});
|
|
2200
|
-
this.#recaptchaTokensPromise = attempt;
|
|
2219
|
+
modal.open();
|
|
2201
2220
|
}
|
|
2202
2221
|
async #fetchSession() {
|
|
2203
2222
|
try {
|
|
@@ -2218,7 +2237,7 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2218
2237
|
return null;
|
|
2219
2238
|
}
|
|
2220
2239
|
}
|
|
2221
|
-
#buildSessionParams(skuId, country, sessionData, paymentOptions,
|
|
2240
|
+
#buildSessionParams(skuId, country, sessionData, paymentOptions, recaptchaTokensPromise) {
|
|
2222
2241
|
const offer = this.#offer;
|
|
2223
2242
|
const totalAmount = offer.price?.purchase ? `${offer.price.purchase}` : DEFAULT_TOTAL;
|
|
2224
2243
|
return {
|
|
@@ -2230,30 +2249,41 @@ var ApplePayButton = class _ApplePayButton extends HTMLElement {
|
|
|
2230
2249
|
skuId,
|
|
2231
2250
|
returnUrl: this.#returnUrl,
|
|
2232
2251
|
userLoggedIn: sessionData.loggedIn,
|
|
2233
|
-
onPaymentAuthorized: (event, session) =>
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2252
|
+
onPaymentAuthorized: async (event, session) => {
|
|
2253
|
+
const recaptchaTokens = await recaptchaTokensPromise;
|
|
2254
|
+
return handlePaymentAuthorized(event, session, sessionData, {
|
|
2255
|
+
skuId,
|
|
2256
|
+
country,
|
|
2257
|
+
currency: offer.price?.currency_code ?? DEFAULT_CURRENCY,
|
|
2258
|
+
returnUrl: this.#returnUrl,
|
|
2259
|
+
supportedBillingCountries: this.#supportedBillingCountries,
|
|
2260
|
+
recaptchaTokens
|
|
2261
|
+
});
|
|
2262
|
+
}
|
|
2241
2263
|
};
|
|
2242
2264
|
}
|
|
2243
|
-
#initiateApplePay(skuId, country,
|
|
2265
|
+
#initiateApplePay(skuId, country, recaptchaTokensPromise) {
|
|
2244
2266
|
try {
|
|
2245
2267
|
const sessionData = this.#sessionData ?? _ApplePayButton.#ANONYMOUS_SESSION;
|
|
2246
2268
|
const paymentOptions = this.#paymentOptions;
|
|
2269
|
+
if (!paymentOptions) {
|
|
2270
|
+
return;
|
|
2271
|
+
}
|
|
2247
2272
|
startApplePaySession(
|
|
2248
2273
|
this.#buildSessionParams(
|
|
2249
2274
|
skuId,
|
|
2250
2275
|
country,
|
|
2251
2276
|
sessionData,
|
|
2252
2277
|
paymentOptions,
|
|
2253
|
-
|
|
2278
|
+
recaptchaTokensPromise
|
|
2254
2279
|
)
|
|
2255
2280
|
);
|
|
2256
2281
|
} catch {
|
|
2282
|
+
redirectToFallbackCheckout({
|
|
2283
|
+
returnUrl: this.#returnUrl,
|
|
2284
|
+
skuId,
|
|
2285
|
+
countryCode: country
|
|
2286
|
+
});
|
|
2257
2287
|
}
|
|
2258
2288
|
}
|
|
2259
2289
|
};
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
// src/apple-pay-logo.ts
|
|
2
2
|
var LOGO_DEFS_ID = "apple-pay-logo-defs";
|
|
3
3
|
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";
|
|
4
|
+
var APPLE_LOGO_PATH = LOGO_PATH.slice(0, LOGO_PATH.indexOf("M17.6885"));
|
|
4
5
|
function ensureApplePayLogoSymbol() {
|
|
5
6
|
if (document.getElementById(LOGO_DEFS_ID)) {
|
|
6
7
|
return;
|
|
7
8
|
}
|
|
8
9
|
const tmp = document.createElement("div");
|
|
9
|
-
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>`;
|
|
10
|
+
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>`;
|
|
10
11
|
document.body.prepend(tmp.firstElementChild);
|
|
11
12
|
}
|
|
12
13
|
export {
|
|
@@ -1,27 +1,22 @@
|
|
|
1
1
|
import type { Offer } from './types/offer.types';
|
|
2
|
-
import {
|
|
3
|
-
/** Resolved reCAPTCHA token set, mirroring the recaptcha utility return type. */
|
|
4
|
-
type RecaptchaTokens = Awaited<ReturnType<typeof getPurchaseRecaptchaTokens>>;
|
|
2
|
+
import { type RecaptchaTokens } from './utils/recaptcha';
|
|
5
3
|
export declare class ApplePayModal extends HTMLElement {
|
|
6
4
|
#private;
|
|
7
5
|
static readonly tag = "teg-apple-pay-modal";
|
|
8
6
|
static define(): void;
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* until the token pre-fetch resolves, so this callback is never reached
|
|
17
|
-
* without valid tokens.
|
|
8
|
+
* Callback invoked synchronously from the CTA click handler.
|
|
9
|
+
* Receives a Promise of reCAPTCHA tokens — the promise is already in-flight
|
|
10
|
+
* by the time this is called. The caller (ApplePayButton) must call
|
|
11
|
+
* new ApplePaySession() synchronously inside this callback to stay within
|
|
12
|
+
* Safari's user-gesture window. The token promise resolves before
|
|
13
|
+
* onPaymentAuthorized fires (user still needs to authenticate on the sheet).
|
|
18
14
|
*/
|
|
19
|
-
onConfirm: ((
|
|
15
|
+
onConfirm: ((recaptchaTokensPromise: Promise<RecaptchaTokens>) => void) | null;
|
|
20
16
|
set offer(value: Offer | null);
|
|
21
17
|
get country(): string;
|
|
22
18
|
set country(value: string);
|
|
23
19
|
connectedCallback(): void;
|
|
24
|
-
open(
|
|
20
|
+
open(): void;
|
|
25
21
|
close(): void;
|
|
26
22
|
}
|
|
27
|
-
export {};
|
|
@@ -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
|
|
|
@@ -570,10 +571,9 @@ var loadRecaptchaScript = (siteKey) => {
|
|
|
570
571
|
);
|
|
571
572
|
if (existingScript) {
|
|
572
573
|
existingScript.addEventListener("load", () => resolve());
|
|
573
|
-
existingScript.addEventListener(
|
|
574
|
-
"
|
|
575
|
-
|
|
576
|
-
);
|
|
574
|
+
existingScript.addEventListener("error", () => {
|
|
575
|
+
reject(new Error("Failed to load existing reCAPTCHA script"));
|
|
576
|
+
});
|
|
577
577
|
return;
|
|
578
578
|
}
|
|
579
579
|
const script = document.createElement("script");
|
|
@@ -581,7 +581,9 @@ var loadRecaptchaScript = (siteKey) => {
|
|
|
581
581
|
script.async = true;
|
|
582
582
|
script.defer = true;
|
|
583
583
|
script.onload = () => resolve();
|
|
584
|
-
script.onerror = () =>
|
|
584
|
+
script.onerror = () => {
|
|
585
|
+
reject(new Error("Failed to load reCAPTCHA script"));
|
|
586
|
+
};
|
|
585
587
|
document.head.appendChild(script);
|
|
586
588
|
});
|
|
587
589
|
};
|
|
@@ -830,17 +832,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
830
832
|
#country = "";
|
|
831
833
|
#triggerElement = null;
|
|
832
834
|
#keyHandler = null;
|
|
833
|
-
#
|
|
834
|
-
#recaptchaTokensPromise = null;
|
|
835
|
+
#isClosed = false;
|
|
835
836
|
/**
|
|
836
|
-
*
|
|
837
|
-
*
|
|
838
|
-
*
|
|
839
|
-
*
|
|
840
|
-
*
|
|
841
|
-
*
|
|
842
|
-
* until the token pre-fetch resolves, so this callback is never reached
|
|
843
|
-
* without valid tokens.
|
|
837
|
+
* Callback invoked synchronously from the CTA click handler.
|
|
838
|
+
* Receives a Promise of reCAPTCHA tokens — the promise is already in-flight
|
|
839
|
+
* by the time this is called. The caller (ApplePayButton) must call
|
|
840
|
+
* new ApplePaySession() synchronously inside this callback to stay within
|
|
841
|
+
* Safari's user-gesture window. The token promise resolves before
|
|
842
|
+
* onPaymentAuthorized fires (user still needs to authenticate on the sheet).
|
|
844
843
|
*/
|
|
845
844
|
onConfirm = null;
|
|
846
845
|
set offer(value) {
|
|
@@ -937,28 +936,32 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
937
936
|
}
|
|
938
937
|
});
|
|
939
938
|
}
|
|
940
|
-
|
|
941
|
-
if (cta)
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
939
|
+
cta?.addEventListener("click", () => {
|
|
940
|
+
if (cta.disabled) return;
|
|
941
|
+
if (isUS && checkbox && !checkbox.checked) {
|
|
942
|
+
errorElement?.classList.add("apm__error--visible");
|
|
943
|
+
checkboxLabel?.classList.add("apm__checkbox-label--error");
|
|
944
|
+
return;
|
|
945
945
|
}
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
946
|
+
errorElement?.classList.remove("apm__error--visible");
|
|
947
|
+
this.querySelector('[role="alert"]:not(#apple-pay-modal-error)')?.remove();
|
|
948
|
+
cta.disabled = true;
|
|
949
|
+
cta.setAttribute("aria-busy", "true");
|
|
950
|
+
const recaptchaTokensPromise = getPurchaseRecaptchaTokens();
|
|
951
|
+
if (!this.#isClosed && this.onConfirm) {
|
|
952
|
+
this.onConfirm(recaptchaTokensPromise);
|
|
953
|
+
this.close();
|
|
954
|
+
}
|
|
955
|
+
recaptchaTokensPromise.catch(() => {
|
|
956
|
+
if (this.#isClosed) return;
|
|
957
|
+
cta.disabled = false;
|
|
958
|
+
cta.removeAttribute("aria-busy");
|
|
957
959
|
const existingError = this.querySelector("#apple-pay-modal-error");
|
|
958
960
|
if (existingError) {
|
|
959
961
|
const icon = existingError.querySelector("svg");
|
|
960
962
|
existingError.textContent = MSG_RECAPTCHA_LOAD_ERROR;
|
|
961
963
|
if (icon) existingError.prepend(icon);
|
|
964
|
+
existingError.setAttribute("role", "alert");
|
|
962
965
|
existingError.classList.add("apm__error--visible");
|
|
963
966
|
} else {
|
|
964
967
|
const errorNotice = document.createElement("div");
|
|
@@ -968,25 +971,14 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
968
971
|
cta?.insertAdjacentElement("beforebegin", errorNotice);
|
|
969
972
|
}
|
|
970
973
|
});
|
|
971
|
-
}
|
|
972
|
-
cta?.addEventListener("click", () => {
|
|
973
|
-
if (isUS && checkbox && !checkbox.checked) {
|
|
974
|
-
errorElement?.classList.add("apm__error--visible");
|
|
975
|
-
checkboxLabel?.classList.add("apm__checkbox-label--error");
|
|
976
|
-
return;
|
|
977
|
-
}
|
|
978
|
-
if (this.#recaptchaTokens) {
|
|
979
|
-
this.onConfirm?.(this.#recaptchaTokens);
|
|
980
|
-
this.close();
|
|
981
|
-
}
|
|
982
974
|
});
|
|
983
975
|
this.querySelector("#apple-pay-modal-close")?.addEventListener(
|
|
984
976
|
"click",
|
|
985
977
|
() => this.close()
|
|
986
978
|
);
|
|
987
979
|
}
|
|
988
|
-
open(
|
|
989
|
-
this.#
|
|
980
|
+
open() {
|
|
981
|
+
this.#isClosed = false;
|
|
990
982
|
this.#triggerElement = document.activeElement;
|
|
991
983
|
document.body.appendChild(this);
|
|
992
984
|
this.#keyHandler = (event) => {
|
|
@@ -1001,6 +993,7 @@ var ApplePayModal = class _ApplePayModal extends HTMLElement {
|
|
|
1001
993
|
this.querySelector("#apple-pay-modal")?.focus();
|
|
1002
994
|
}
|
|
1003
995
|
close() {
|
|
996
|
+
this.#isClosed = true;
|
|
1004
997
|
if (this.#keyHandler) {
|
|
1005
998
|
document.removeEventListener("keydown", this.#keyHandler, {
|
|
1006
999
|
capture: true
|