@paykka/card-checkout-ui 0.5.17 → 0.7.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/card-checkout-ui.js +22 -0
- package/dist/card-checkout-ui.umd.cjs +19 -5
- package/dist/es/api/index.js +0 -2
- package/dist/es/api/modules/checkout/index.js +1 -15
- package/dist/es/api/modules/checkout/map.js +22 -4
- package/dist/es/api/modules/encrypted-card/index.js +54 -0
- package/dist/es/api/modules/get-browser-params.js +2 -2
- package/dist/es/api/modules/index.js +0 -2
- package/dist/es/components/AccountNameField/index.js +2 -3
- package/dist/es/components/AddressField/index.js +4 -7
- package/dist/es/components/AliPay/index.js +13 -12
- package/dist/es/components/ApplePay/index.js +75 -19
- package/dist/es/components/Card/index.js +335 -143
- package/dist/es/components/CardBrands/index.js +0 -2
- package/dist/es/components/CardExpireDateField/index.js +6 -6
- package/dist/es/components/CardHolderNameField/index.js +5 -5
- package/dist/es/components/CardIBANField/index.js +2 -3
- package/dist/es/components/CardNo/index.js +0 -2
- package/dist/es/components/CardNumberField/index.js +32 -20
- package/dist/es/components/CardSecurityCodeField/index.js +6 -6
- package/dist/es/components/CardSelector/index.js +1 -3
- package/dist/es/components/CombinedCardInfo/index.js +99 -0
- package/dist/es/components/EmailField/EmailField.js +2 -3
- package/dist/es/components/EncryptedCard/index.js +408 -0
- package/dist/es/components/GooglePay/index.js +108 -36
- package/dist/es/components/RecurringTip/index.js +0 -2
- package/dist/es/components/SecuredFieldsProvider/index.js +230 -1
- package/dist/es/components/SecuredIframe/index.js +192 -22
- package/dist/es/components/Sepa/index.js +36 -32
- package/dist/es/components/SubmitButton/index.js +0 -2
- package/dist/es/components/ThreeDS/index.js +94 -0
- package/dist/es/components/WechatPay/index.js +31 -30
- package/dist/es/components/index.js +4 -2
- package/dist/es/components/internal/Button/Button.js +0 -2
- package/dist/es/components/internal/Button/index.js +0 -2
- package/dist/es/components/internal/CheckBox/CheckBox.js +0 -2
- package/dist/es/components/internal/CheckBox/index.js +0 -2
- package/dist/es/components/internal/Form/FormItem.js +28 -24
- package/dist/es/components/internal/Form/index.js +1 -0
- package/dist/es/components/internal/Form/type.js +13 -1
- package/dist/es/components/internal/Info/Info.js +0 -2
- package/dist/es/components/internal/Info/index.js +0 -2
- package/dist/es/components/internal/Input/Input.js +11 -13
- package/dist/es/components/internal/Input/index.js +1 -0
- package/dist/es/components/internal/Input/type.js +11 -1
- package/dist/es/components/internal/LoadingCheck/LoadingCheck.js +0 -2
- package/dist/es/components/internal/LoadingCheck/index.js +0 -2
- package/dist/es/components/internal/Modal/Modal.js +40 -0
- package/dist/es/components/internal/Modal/modal2.js +1 -0
- package/dist/es/components/internal/Select/Select.js +2 -2
- package/dist/es/components/internal/Select/SelectMenu.js +0 -2
- package/dist/es/components/internal/Select/SelectMenuItem.js +0 -2
- package/dist/es/components/internal/icons/Icon3DSFail.js +3 -0
- package/dist/es/components/internal/icons/Icon3DSInfo.js +62 -0
- package/dist/es/components/internal/icons/Icon3DSSuccess.js +3 -0
- package/dist/es/config.js +12 -8
- package/dist/es/constant.js +13 -2
- package/dist/es/core/PayKKaCheckout.js +116 -0
- package/dist/es/core/Session.js +7 -6
- package/dist/es/core/environment.js +26 -0
- package/dist/es/core/error.js +21 -0
- package/dist/es/core/index.js +0 -2
- package/dist/es/core/query.js +1 -8
- package/dist/es/hooks/index.js +0 -2
- package/dist/es/hooks/useBreakpoints.js +57 -0
- package/dist/es/hooks/useI18n.js +0 -1
- package/dist/es/hooks/usePayState.js +20 -33
- package/dist/es/i18n/index.js +0 -2
- package/dist/es/i18n/locales/de-DE.js +11 -1
- package/dist/es/i18n/locales/en-GB.js +11 -1
- package/dist/es/i18n/locales/es-ES.js +11 -1
- package/dist/es/i18n/locales/fr-FR.js +11 -1
- package/dist/es/i18n/locales/index.js +8 -6
- package/dist/es/i18n/locales/ja-JP.js +11 -1
- package/dist/es/i18n/locales/ko-KR.js +11 -1
- package/dist/es/i18n/locales/pt-PT.js +11 -1
- package/dist/es/i18n/locales/ru-RU.js +11 -1
- package/dist/es/i18n/locales/zh-CN.js +11 -1
- package/dist/es/i18n/locales/zh-HK.js +11 -1
- package/dist/es/i18n/locales/zh-TW.js +11 -1
- package/dist/es/i18n/util.js +11 -8
- package/dist/es/index.js +15 -2
- package/dist/es/out/fraud-detection.js +99 -0
- package/dist/es/style.css +194 -4
- package/dist/es/types/{radar.js → fraud-detection.js} +1 -1
- package/dist/es/types/index.js +49 -1
- package/dist/es/types/message.js +28 -0
- package/dist/es/utils/card-brand/brands.js +21 -45
- package/dist/es/utils/card-brand/index.js +3 -2
- package/dist/es/utils/iframe.js +23 -0
- package/dist/es/utils/index.js +11 -1
- package/dist/es/utils/load.js +14 -0
- package/dist/es/utils/style.js +84 -0
- package/dist/style.css +1 -1
- package/dist/types/api/modules/checkout/map.d.ts +1 -0
- package/dist/types/api/modules/checkout/type.d.ts +14 -1
- package/dist/types/api/modules/encrypted-card/index.d.ts +6 -0
- package/dist/types/api/modules/encrypted-card/type.d.ts +31 -0
- package/dist/types/api/modules/get-browser-params.d.ts +3 -3
- package/dist/types/components/AddressField/type.d.ts +1 -0
- package/dist/types/components/AliPay/type.d.ts +4 -4
- package/dist/types/components/ApplePay/type.d.ts +19 -7
- package/dist/types/components/ApplePay/utils.d.ts +3 -0
- package/dist/types/components/Card/type.d.ts +64 -6
- package/dist/types/components/CardExpireDateField/type.d.ts +1 -0
- package/dist/types/components/CardHolderNameField/type.d.ts +1 -1
- package/dist/types/components/CardNumberField/type.d.ts +3 -0
- package/dist/types/components/CardSecurityCodeField/type.d.ts +1 -0
- package/dist/types/components/CombinedCardInfo/CombinedCardInfo.d.ts +5 -0
- package/dist/types/components/CombinedCardInfo/index.d.ts +2 -0
- package/dist/types/components/CombinedCardInfo/type.d.ts +16 -0
- package/dist/types/components/EncryptedCard/EncryptedCard.d.ts +4 -0
- package/dist/types/components/EncryptedCard/index.d.ts +4 -0
- package/dist/types/components/EncryptedCard/output.d.ts +9 -0
- package/dist/types/components/EncryptedCard/type.d.ts +85 -0
- package/dist/types/components/GooglePay/type.d.ts +20 -8
- package/dist/types/components/GooglePay/utils.d.ts +2 -0
- package/dist/types/components/SecuredFieldsProvider/index.d.ts +1 -0
- package/dist/types/components/SecuredFieldsProvider/type.d.ts +29 -100
- package/dist/types/components/SecuredFieldsProvider/utils/index.d.ts +1 -1
- package/dist/types/components/SecuredIframe/useSecuredInput.d.ts +7 -2
- package/dist/types/components/Sepa/type.d.ts +4 -4
- package/dist/types/components/ThreeDS/components/ThreeDSAuth/ThreeDSAuth.d.ts +3 -0
- package/dist/types/components/ThreeDS/components/ThreeDSAuth/index.d.ts +2 -0
- package/dist/types/components/ThreeDS/components/ThreeDSAuth/type.d.ts +17 -0
- package/dist/types/components/ThreeDS/components/ThreeDSIframe/ThreeDSIframe.d.ts +2 -0
- package/dist/types/components/ThreeDS/components/ThreeDSIframe/index.d.ts +1 -0
- package/dist/types/components/ThreeDS/components/ThreeDSIframe/output.d.ts +1 -0
- package/dist/types/components/ThreeDS/components/ThreeDSIframe/type.d.ts +5 -0
- package/dist/types/components/ThreeDS/components/ThreeDSStatus/ThreeDSStatus.d.ts +3 -0
- package/dist/types/components/ThreeDS/components/ThreeDSStatus/output.d.ts +1 -0
- package/dist/types/components/ThreeDS/components/ThreeDSStatus/type.d.ts +6 -0
- package/dist/types/components/ThreeDS/index.d.ts +1 -0
- package/dist/types/components/WechatPay/type.d.ts +4 -4
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/internal/Form/FormItem.d.ts +1 -1
- package/dist/types/components/internal/Form/type.d.ts +7 -0
- package/dist/types/components/internal/Input/Input.d.ts +1 -1
- package/dist/types/components/internal/Input/type.d.ts +7 -0
- package/dist/types/components/internal/Loading/Loading.d.ts +1 -0
- package/dist/types/components/internal/Loading/index.d.ts +1 -0
- package/dist/types/components/internal/Modal/Modal.d.ts +5 -0
- package/dist/types/components/internal/Modal/index.d.ts +0 -0
- package/dist/types/components/internal/Modal/type.d.ts +20 -0
- package/dist/types/components/internal/icons/Icon3DSFail.d.ts +2 -0
- package/dist/types/components/internal/icons/Icon3DSInfo.d.ts +2 -0
- package/dist/types/components/internal/icons/Icon3DSSuccess.d.ts +2 -0
- package/dist/types/components/internal/icons/index.d.ts +3 -0
- package/dist/types/config.d.ts +7 -3
- package/dist/types/constant.d.ts +7 -2
- package/dist/types/core/PayKKaCheckout.d.ts +28 -0
- package/dist/types/core/Session.d.ts +1 -1
- package/dist/types/core/context.d.ts +1 -0
- package/dist/types/core/environment.d.ts +4 -0
- package/dist/types/core/error.d.ts +16 -0
- package/dist/types/core/index.d.ts +2 -0
- package/dist/types/core/query.d.ts +2 -2
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/hooks/useBreakpoints.d.ts +15 -0
- package/dist/types/hooks/usePayState.d.ts +6 -25
- package/dist/types/i18n/locales/de-DE.d.ts +8 -0
- package/dist/types/i18n/locales/en-GB.d.ts +8 -0
- package/dist/types/i18n/locales/es-ES.d.ts +8 -0
- package/dist/types/i18n/locales/fr-FR.d.ts +8 -0
- package/dist/types/i18n/locales/index.d.ts +2 -2
- package/dist/types/i18n/locales/ja-JP.d.ts +8 -0
- package/dist/types/i18n/locales/ko-KR.d.ts +8 -0
- package/dist/types/i18n/locales/pt-PT.d.ts +8 -0
- package/dist/types/i18n/locales/ru-RU.d.ts +8 -0
- package/dist/types/i18n/locales/zh-CN.d.ts +8 -0
- package/dist/types/i18n/locales/zh-HK.d.ts +8 -0
- package/dist/types/i18n/locales/zh-TW.d.ts +8 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/out/fraud-detection.d.ts +9 -0
- package/dist/types/types/{radar.d.ts → fraud-detection.d.ts} +3 -2
- package/dist/types/types/index.d.ts +100 -1
- package/dist/types/types/message.d.ts +170 -0
- package/dist/types/utils/card-brand/brands.d.ts +4 -18
- package/dist/types/utils/card-brand/index.d.ts +10 -9
- package/dist/types/utils/format.d.ts +0 -1
- package/dist/types/utils/index.d.ts +4 -0
- package/dist/types/utils/load.d.ts +7 -0
- package/dist/types/utils/style.d.ts +29 -0
- package/package.json +63 -63
- package/dist/card-checkout-ui.iife.js +0 -8
- package/dist/es/components/SecuredFieldsProvider/SecuredFieldsProvider.js +0 -222
- package/dist/es/out/radar.js +0 -123
- package/dist/types/out/radar.d.ts +0 -14
- /package/dist/types/{components/SecuredFieldsProvider/utils → utils}/iframe.d.ts +0 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import { setApiUrl, setCDNUrl } from "../../config.js";
|
|
2
|
+
import { CoreContext } from "../../core/context.js";
|
|
3
|
+
import { create } from "../../core/create.js";
|
|
4
|
+
import "../../utils/card-brand/brands.js";
|
|
5
|
+
import { getBrowserInfo } from "../../utils/system-info/get-browser-info.js";
|
|
6
|
+
import { w, F, h, A, y, u } from "../../core.js";
|
|
7
|
+
import { useBEM } from "../../hooks/useBEM.js";
|
|
8
|
+
import { useI18n } from "../../hooks/useI18n.js";
|
|
9
|
+
import { defaultInputStyleConfig } from "../../types/index.js";
|
|
10
|
+
import { intersection } from "../../utils/index.js";
|
|
11
|
+
import { EFieldType, SecuredFieldsProvider } from "../SecuredFieldsProvider/index.js";
|
|
12
|
+
import { CardNumberField } from "../CardNumberField/index.js";
|
|
13
|
+
import { CardExpireDateField } from "../CardExpireDateField/index.js";
|
|
14
|
+
import { CardSecurityCodeField } from "../CardSecurityCodeField/index.js";
|
|
15
|
+
import { verifyClientKey } from "../../api/modules/encrypted-card/index.js";
|
|
16
|
+
import { formItemLabelClassName, formItemErrorMessageClassName } from "../internal/Form/type.js";
|
|
17
|
+
import "../internal/Form/context.js";
|
|
18
|
+
import "../internal/Form/FormItem.js";
|
|
19
|
+
import "../internal/Form/Form.js";
|
|
20
|
+
import { CombinedCardInfo } from "../CombinedCardInfo/index.js";
|
|
21
|
+
import "../internal/Input/Input.js";
|
|
22
|
+
import { inputWrapperClassName } from "../internal/Input/type.js";
|
|
23
|
+
import { separateInputStyle, genComponentStyle, loadStyle } from "../../utils/style.js";
|
|
24
|
+
import { createPromise } from "../../utils/create-promise.js";
|
|
25
|
+
const ENCRYPTED_CARD_WRAPPER_ID = "encryptedCardWrapper";
|
|
26
|
+
const ENCRYPTED_CARD_ITEM_ATTR = "data-eci";
|
|
27
|
+
var EEncryptedCardType = /* @__PURE__ */ ((EEncryptedCardType2) => {
|
|
28
|
+
EEncryptedCardType2["CARD"] = "card";
|
|
29
|
+
EEncryptedCardType2["CARD_NUMBER"] = "cardNumber";
|
|
30
|
+
EEncryptedCardType2["CVV"] = "securityCode";
|
|
31
|
+
EEncryptedCardType2["EXPIRE_DATE"] = "expiryDate";
|
|
32
|
+
return EEncryptedCardType2;
|
|
33
|
+
})(EEncryptedCardType || {});
|
|
34
|
+
const { bem } = useBEM("encrypted");
|
|
35
|
+
const cvvClassName = bem("cvv");
|
|
36
|
+
const cardNumberClassName = bem("card-number");
|
|
37
|
+
const expireDateClassName = bem("expire-date");
|
|
38
|
+
const combinedEncryptedFieldClassName = bem("combined-encrypted-field");
|
|
39
|
+
const encryptedCardStyleId = "encryptedCardStyle";
|
|
40
|
+
const EncryptedCard = w((props, ref) => {
|
|
41
|
+
const { brands, locale, clientKey, merchantId, sandbox, styles, showLabel = true } = props;
|
|
42
|
+
F(ref, () => ({
|
|
43
|
+
encrypt: () => {
|
|
44
|
+
var _a;
|
|
45
|
+
validatePromise.current = createPromise();
|
|
46
|
+
Object.keys(fieldValidStatusMap.current).forEach((key) => {
|
|
47
|
+
fieldValidStatusMap.current[key] = null;
|
|
48
|
+
});
|
|
49
|
+
(_a = SFPRef.current) == null ? void 0 : _a.validate();
|
|
50
|
+
validatePromise.current.then(() => {
|
|
51
|
+
var _a2;
|
|
52
|
+
console.log("校验通过");
|
|
53
|
+
(_a2 = SFPRef.current) == null ? void 0 : _a2.encryptCard({
|
|
54
|
+
merchantId,
|
|
55
|
+
clientKey
|
|
56
|
+
});
|
|
57
|
+
}).catch(() => {
|
|
58
|
+
console.log("校验失败");
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}));
|
|
62
|
+
const { i18n } = useI18n(locale || getBrowserInfo().language);
|
|
63
|
+
const [single, setSingle] = h(false);
|
|
64
|
+
const [showEncryptedCard, setShowEncryptedCard] = h(false);
|
|
65
|
+
const [isReady, setIsReady] = h(false);
|
|
66
|
+
const [supportedBrands, setSupportedBrands] = h([]);
|
|
67
|
+
const [targetElement, setTargetElement] = h(null);
|
|
68
|
+
const [inputStyle, setInputStyle] = h({});
|
|
69
|
+
const wrapperDomMap = A({
|
|
70
|
+
[EEncryptedCardType.CARD]: null,
|
|
71
|
+
[EEncryptedCardType.CARD_NUMBER]: null,
|
|
72
|
+
[EEncryptedCardType.CVV]: null,
|
|
73
|
+
[EEncryptedCardType.EXPIRE_DATE]: null
|
|
74
|
+
});
|
|
75
|
+
const SFPRef = A(null);
|
|
76
|
+
const combinedEncryptedFieldComp = A(null);
|
|
77
|
+
const cardNumberFieldComp = A(null);
|
|
78
|
+
const cardExpireDateFieldComp = A(null);
|
|
79
|
+
const cardSecurityCodeFieldComp = A(null);
|
|
80
|
+
const combinedEncryptedFieldRef = A(null);
|
|
81
|
+
const cardNumberFieldRef = A(null);
|
|
82
|
+
const cardExpireDateFieldRef = A(null);
|
|
83
|
+
const cardSecurityCodeFieldRef = A(null);
|
|
84
|
+
const fieldRefMap = {
|
|
85
|
+
[EFieldType.CARD_NUMBER]: cardNumberFieldRef,
|
|
86
|
+
[EFieldType.CVV]: cardSecurityCodeFieldRef,
|
|
87
|
+
[EFieldType.EXPIRE_DATE]: cardExpireDateFieldRef
|
|
88
|
+
};
|
|
89
|
+
const processStyles = () => {
|
|
90
|
+
if (!styles) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const { input, label, errorMessage, inputWrapper } = separateInputStyle(styles);
|
|
94
|
+
input && setInputStyle(input);
|
|
95
|
+
if (!document.querySelector(`style#${encryptedCardStyleId}`)) {
|
|
96
|
+
const parentId = ENCRYPTED_CARD_WRAPPER_ID;
|
|
97
|
+
const inputWrapperPrefix = `#${parentId} .${inputWrapperClassName}`;
|
|
98
|
+
const labelPrefix = `#${parentId} .${formItemLabelClassName}`;
|
|
99
|
+
const errorMessagePrefix = `#${parentId} .${formItemErrorMessageClassName}`;
|
|
100
|
+
const inputWrapperStyle = genComponentStyle(
|
|
101
|
+
Object.entries(inputWrapper || {}).map(([type, style2]) => {
|
|
102
|
+
return {
|
|
103
|
+
selector: type === "base" ? inputWrapperPrefix : `${inputWrapperPrefix}--${type}`,
|
|
104
|
+
style: style2
|
|
105
|
+
};
|
|
106
|
+
})
|
|
107
|
+
);
|
|
108
|
+
const labelStyle = genComponentStyle(
|
|
109
|
+
Object.entries(label || {}).map(([type, style2]) => {
|
|
110
|
+
return {
|
|
111
|
+
selector: type === "base" ? labelPrefix : `${labelPrefix}--${type}`,
|
|
112
|
+
style: style2
|
|
113
|
+
};
|
|
114
|
+
})
|
|
115
|
+
);
|
|
116
|
+
const errorMessageStyle = genComponentStyle([
|
|
117
|
+
{
|
|
118
|
+
selector: errorMessagePrefix,
|
|
119
|
+
style: errorMessage
|
|
120
|
+
}
|
|
121
|
+
]);
|
|
122
|
+
const style = `${inputWrapperStyle}${labelStyle}${errorMessageStyle}`;
|
|
123
|
+
console.log(style);
|
|
124
|
+
loadStyle(style, { id: encryptedCardStyleId });
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const classNameMap = {
|
|
128
|
+
[EFieldType.CARD_NUMBER]: cardNumberClassName,
|
|
129
|
+
[EFieldType.CVV]: cvvClassName,
|
|
130
|
+
[EFieldType.EXPIRE_DATE]: expireDateClassName
|
|
131
|
+
};
|
|
132
|
+
const updateFieldStyles = (fieldType, type) => {
|
|
133
|
+
var _a, _b;
|
|
134
|
+
const className = single ? combinedEncryptedFieldClassName : classNameMap[fieldType];
|
|
135
|
+
const parent = document.querySelector(`#${ENCRYPTED_CARD_WRAPPER_ID}`);
|
|
136
|
+
if (!parent) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const inputWrapper = (_a = parent.querySelector(`.${className}`)) == null ? void 0 : _a.querySelector(`.${inputWrapperClassName}`);
|
|
140
|
+
const label = (_b = parent.querySelector(`.${className}`)) == null ? void 0 : _b.querySelector(`.${formItemLabelClassName}`);
|
|
141
|
+
if (type === "focus") {
|
|
142
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.add(`${inputWrapperClassName}--focus`);
|
|
143
|
+
label == null ? void 0 : label.classList.add(`.${formItemLabelClassName}--focus`);
|
|
144
|
+
} else if (type === "blur") {
|
|
145
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.remove(`${inputWrapperClassName}--focus`);
|
|
146
|
+
label == null ? void 0 : label.classList.remove(`.${formItemLabelClassName}--focus`);
|
|
147
|
+
} else if (type === "valid") {
|
|
148
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.add(`${inputWrapperClassName}--success`);
|
|
149
|
+
label == null ? void 0 : label.classList.add(`.${formItemLabelClassName}--success`);
|
|
150
|
+
} else if (type === "invalid") {
|
|
151
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.add(`${inputWrapperClassName}--error`);
|
|
152
|
+
label == null ? void 0 : label.classList.add(`.${formItemLabelClassName}--error`);
|
|
153
|
+
} else {
|
|
154
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.remove(`${inputWrapperClassName}--success`);
|
|
155
|
+
inputWrapper == null ? void 0 : inputWrapper.classList.remove(`${inputWrapperClassName}--error`);
|
|
156
|
+
label == null ? void 0 : label.classList.remove(`.${formItemLabelClassName}--success`);
|
|
157
|
+
label == null ? void 0 : label.classList.remove(`.${formItemLabelClassName}--error`);
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
y(() => {
|
|
161
|
+
initEncryptedCard();
|
|
162
|
+
}, []);
|
|
163
|
+
const authorize = async () => {
|
|
164
|
+
if (!clientKey) {
|
|
165
|
+
throw new Error("clientKey is required");
|
|
166
|
+
}
|
|
167
|
+
return verifyClientKey(clientKey, merchantId);
|
|
168
|
+
};
|
|
169
|
+
const getBrands = (realBrands) => {
|
|
170
|
+
if (!(brands == null ? void 0 : brands.length)) {
|
|
171
|
+
return realBrands;
|
|
172
|
+
}
|
|
173
|
+
const bothBrands = intersection(brands, realBrands || []);
|
|
174
|
+
if (!bothBrands.length) {
|
|
175
|
+
throw new Error("No available card brands");
|
|
176
|
+
}
|
|
177
|
+
return bothBrands;
|
|
178
|
+
};
|
|
179
|
+
const initEncryptedCard = async () => {
|
|
180
|
+
var _a, _b;
|
|
181
|
+
if (sandbox) {
|
|
182
|
+
setApiUrl("https://checkout-sandbox.aq.paykka.com");
|
|
183
|
+
setCDNUrl("https://checkout-sandbox.aq.paykka.com/cp");
|
|
184
|
+
}
|
|
185
|
+
let authRes = await authorize();
|
|
186
|
+
if (authRes) {
|
|
187
|
+
const supportedBrands2 = getBrands(authRes.brands);
|
|
188
|
+
setSupportedBrands(supportedBrands2);
|
|
189
|
+
(_a = props.onReady) == null ? void 0 : _a.call(props, true, { brands: supportedBrands2 });
|
|
190
|
+
} else {
|
|
191
|
+
(_b = props.onReady) == null ? void 0 : _b.call(props, false);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const encryptedCardWrapper = document.getElementById(ENCRYPTED_CARD_WRAPPER_ID);
|
|
195
|
+
setTargetElement(encryptedCardWrapper);
|
|
196
|
+
if (!encryptedCardWrapper) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const getEncryptedCardItems = (attr) => {
|
|
200
|
+
return encryptedCardWrapper.querySelector(
|
|
201
|
+
`[${ENCRYPTED_CARD_ITEM_ATTR}="${attr}"]`
|
|
202
|
+
);
|
|
203
|
+
};
|
|
204
|
+
const cardElement = getEncryptedCardItems(EEncryptedCardType.CARD);
|
|
205
|
+
if (cardElement) {
|
|
206
|
+
setSingle(true);
|
|
207
|
+
setShowEncryptedCard(true);
|
|
208
|
+
wrapperDomMap.current[EEncryptedCardType.CARD] = cardElement;
|
|
209
|
+
} else {
|
|
210
|
+
const cardNumberElement = getEncryptedCardItems(EEncryptedCardType.CARD_NUMBER);
|
|
211
|
+
const cvvElement = getEncryptedCardItems(EEncryptedCardType.CVV);
|
|
212
|
+
const expireDateElement = getEncryptedCardItems(EEncryptedCardType.EXPIRE_DATE);
|
|
213
|
+
if (cardNumberElement && cvvElement && expireDateElement) {
|
|
214
|
+
setSingle(false);
|
|
215
|
+
setShowEncryptedCard(true);
|
|
216
|
+
wrapperDomMap.current[EEncryptedCardType.CARD_NUMBER] = cardNumberElement;
|
|
217
|
+
wrapperDomMap.current[EEncryptedCardType.CVV] = cvvElement;
|
|
218
|
+
wrapperDomMap.current[EEncryptedCardType.EXPIRE_DATE] = expireDateElement;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
processStyles();
|
|
222
|
+
};
|
|
223
|
+
y(() => {
|
|
224
|
+
showEncryptedCard && embedEncryptedCard();
|
|
225
|
+
}, [showEncryptedCard]);
|
|
226
|
+
const embedEncryptedCard = () => {
|
|
227
|
+
if (single) {
|
|
228
|
+
const cardWrapper = wrapperDomMap.current[EEncryptedCardType.CARD];
|
|
229
|
+
const combinedEncryptedField = create(CombinedCardInfo, {
|
|
230
|
+
supportedCardBrands: supportedBrands,
|
|
231
|
+
security: true,
|
|
232
|
+
className: combinedEncryptedFieldClassName
|
|
233
|
+
});
|
|
234
|
+
combinedEncryptedFieldComp.current = combinedEncryptedField;
|
|
235
|
+
combinedEncryptedFieldRef.current = combinedEncryptedField.ref;
|
|
236
|
+
combinedEncryptedField.mount(cardWrapper);
|
|
237
|
+
} else {
|
|
238
|
+
const cardNumberWrapper = wrapperDomMap.current[EEncryptedCardType.CARD_NUMBER];
|
|
239
|
+
const cardNumberField = create(CardNumberField, {
|
|
240
|
+
supportedCardBrands: supportedBrands,
|
|
241
|
+
security: true,
|
|
242
|
+
showLabel,
|
|
243
|
+
className: cardNumberClassName
|
|
244
|
+
});
|
|
245
|
+
cardNumberFieldComp.current = cardNumberField;
|
|
246
|
+
cardNumberFieldRef.current = cardNumberField.ref;
|
|
247
|
+
cardNumberField.mount(cardNumberWrapper);
|
|
248
|
+
const cvvWrapper = wrapperDomMap.current[EEncryptedCardType.CVV];
|
|
249
|
+
const cvvField = create(CardSecurityCodeField, {
|
|
250
|
+
security: true,
|
|
251
|
+
showLabel,
|
|
252
|
+
className: cvvClassName
|
|
253
|
+
});
|
|
254
|
+
cardSecurityCodeFieldComp.current = cvvField;
|
|
255
|
+
cardSecurityCodeFieldRef.current = cvvField.ref;
|
|
256
|
+
cvvField.mount(cvvWrapper);
|
|
257
|
+
const expireDateWrapper = wrapperDomMap.current[EEncryptedCardType.EXPIRE_DATE];
|
|
258
|
+
const expireDateField = create(CardExpireDateField, {
|
|
259
|
+
security: true,
|
|
260
|
+
showLabel,
|
|
261
|
+
className: expireDateClassName
|
|
262
|
+
});
|
|
263
|
+
cardExpireDateFieldComp.current = expireDateField;
|
|
264
|
+
cardExpireDateFieldRef.current = expireDateField.ref;
|
|
265
|
+
expireDateField.mount(expireDateWrapper);
|
|
266
|
+
}
|
|
267
|
+
setIsReady(true);
|
|
268
|
+
};
|
|
269
|
+
const onFieldsFocus = (data) => {
|
|
270
|
+
var _a, _b, _c, _d;
|
|
271
|
+
const fieldRef = single ? combinedEncryptedFieldRef : fieldRefMap[data.fieldType];
|
|
272
|
+
if (data.focus) {
|
|
273
|
+
(_a = fieldRef.current) == null ? void 0 : _a.focus();
|
|
274
|
+
(_b = props.onFocus) == null ? void 0 : _b.call(props, data.fieldType);
|
|
275
|
+
updateFieldStyles(data.fieldType, "focus");
|
|
276
|
+
} else {
|
|
277
|
+
(_c = fieldRef.current) == null ? void 0 : _c.blur();
|
|
278
|
+
(_d = props.onBlur) == null ? void 0 : _d.call(props, data.fieldType);
|
|
279
|
+
updateFieldStyles(data.fieldType, "blur");
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
const onBinValueChanged = (data) => {
|
|
283
|
+
var _a, _b;
|
|
284
|
+
const field = single ? combinedEncryptedFieldRef : cardNumberFieldRef;
|
|
285
|
+
(_a = field.current) == null ? void 0 : _a.binValueChanged(data.binValue);
|
|
286
|
+
(_b = props.onBinChanged) == null ? void 0 : _b.call(props, {
|
|
287
|
+
binValue: data.binValue,
|
|
288
|
+
brand: data.brand
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
const onAuthorized = (data) => {
|
|
292
|
+
var _a;
|
|
293
|
+
(_a = props.onReady) == null ? void 0 : _a.call(props, data.success);
|
|
294
|
+
};
|
|
295
|
+
const validatePromise = A(createPromise());
|
|
296
|
+
const validateOrder = [EFieldType.CARD_NUMBER, EFieldType.EXPIRE_DATE, EFieldType.CVV];
|
|
297
|
+
const fieldValidStatusMap = A({
|
|
298
|
+
[EFieldType.CARD_NUMBER]: null,
|
|
299
|
+
[EFieldType.EXPIRE_DATE]: null,
|
|
300
|
+
[EFieldType.CVV]: null
|
|
301
|
+
});
|
|
302
|
+
const onValidated = (data) => {
|
|
303
|
+
fieldValidStatusMap.current[data.fieldType].status = data.status;
|
|
304
|
+
const results = Object.values(fieldValidStatusMap.current);
|
|
305
|
+
if (results.includes(null)) {
|
|
306
|
+
return;
|
|
307
|
+
} else {
|
|
308
|
+
const validateResult = results.every((result) => result.status === "success");
|
|
309
|
+
if (validateResult) {
|
|
310
|
+
validatePromise.current.resolve(true);
|
|
311
|
+
} else {
|
|
312
|
+
validatePromise.current.reject(false);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
const onFieldValidStatusChanged = (data) => {
|
|
317
|
+
var _a, _b, _c, _d, _e;
|
|
318
|
+
const fieldRef = single ? combinedEncryptedFieldRef : fieldRefMap[data.fieldType];
|
|
319
|
+
const error = data.errorTip && i18n.get(data.errorTip);
|
|
320
|
+
(_a = props.onValidationChanged) == null ? void 0 : _a.call(props, {
|
|
321
|
+
fieldType: data.fieldType,
|
|
322
|
+
status: data.status
|
|
323
|
+
});
|
|
324
|
+
fieldValidStatusMap.current[data.fieldType] = {
|
|
325
|
+
status: data.status,
|
|
326
|
+
errorTip: error
|
|
327
|
+
};
|
|
328
|
+
if (single) {
|
|
329
|
+
for (const key of validateOrder) {
|
|
330
|
+
const currResult = fieldValidStatusMap.current[key];
|
|
331
|
+
if ((currResult == null ? void 0 : currResult.status) === "error") {
|
|
332
|
+
(_b = fieldRef.current) == null ? void 0 : _b.resetValidation(currResult.status, currResult.errorTip);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
const isSuccess = Object.values(fieldValidStatusMap.current).every(
|
|
337
|
+
(result) => (result == null ? void 0 : result.status) === "success"
|
|
338
|
+
);
|
|
339
|
+
if (isSuccess) {
|
|
340
|
+
(_c = fieldRef.current) == null ? void 0 : _c.resetValidation("success");
|
|
341
|
+
} else {
|
|
342
|
+
(_d = fieldRef.current) == null ? void 0 : _d.resetValidation("unValidate");
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
(_e = fieldRef.current) == null ? void 0 : _e.resetValidation(data.status, error);
|
|
346
|
+
const type = data.status === "success" ? "valid" : data.status === "error" ? "invalid" : "base";
|
|
347
|
+
updateFieldStyles(data.fieldType, type);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
const onFrameActivated = (data) => {
|
|
351
|
+
var _a;
|
|
352
|
+
(_a = props.onActivated) == null ? void 0 : _a.call(props, data.fieldType);
|
|
353
|
+
};
|
|
354
|
+
const onCardEncrypted = (data) => {
|
|
355
|
+
var _a;
|
|
356
|
+
(_a = props.onCardEncrypted) == null ? void 0 : _a.call(props, data.encryptedInfo);
|
|
357
|
+
};
|
|
358
|
+
const onCardEncryptionFailed = () => {
|
|
359
|
+
var _a;
|
|
360
|
+
(_a = props.onCardEncryptionFailed) == null ? void 0 : _a.call(props);
|
|
361
|
+
};
|
|
362
|
+
const onBrand = (data) => {
|
|
363
|
+
var _a, _b;
|
|
364
|
+
const field = single ? combinedEncryptedFieldRef : cardNumberFieldRef;
|
|
365
|
+
(_a = field.current) == null ? void 0 : _a.brandChanged(data.brand);
|
|
366
|
+
(_b = props.onBrand) == null ? void 0 : _b.call(props, data.brand);
|
|
367
|
+
};
|
|
368
|
+
return /* @__PURE__ */ u(CoreContext.Provider, { value: { i18n }, children: isReady && i18n.ready.value && /* @__PURE__ */ u(
|
|
369
|
+
SecuredFieldsProvider,
|
|
370
|
+
{
|
|
371
|
+
ref: SFPRef,
|
|
372
|
+
targetElement,
|
|
373
|
+
i18n,
|
|
374
|
+
style: inputStyle || defaultInputStyleConfig,
|
|
375
|
+
supportedCardBrands: supportedBrands,
|
|
376
|
+
onFocus: onFieldsFocus,
|
|
377
|
+
onBinValue: onBinValueChanged,
|
|
378
|
+
onBrand,
|
|
379
|
+
onAuthorized,
|
|
380
|
+
onValidStatusChanged: onFieldValidStatusChanged,
|
|
381
|
+
onActivated: onFrameActivated,
|
|
382
|
+
onCardEncrypted,
|
|
383
|
+
onCardEncryptionFailed,
|
|
384
|
+
onValidated
|
|
385
|
+
}
|
|
386
|
+
) });
|
|
387
|
+
});
|
|
388
|
+
class PayKKaEncryptedCard {
|
|
389
|
+
constructor() {
|
|
390
|
+
}
|
|
391
|
+
static init(props) {
|
|
392
|
+
const container = document.querySelector("body");
|
|
393
|
+
const encryptedCard = create(EncryptedCard, props);
|
|
394
|
+
encryptedCard.mount(container);
|
|
395
|
+
return encryptedCard.ref;
|
|
396
|
+
}
|
|
397
|
+
static setEnv(env) {
|
|
398
|
+
setApiUrl(env.apiUrl);
|
|
399
|
+
setCDNUrl(env.cdnUrl);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
export {
|
|
403
|
+
EEncryptedCardType,
|
|
404
|
+
ENCRYPTED_CARD_ITEM_ATTR,
|
|
405
|
+
ENCRYPTED_CARD_WRAPPER_ID,
|
|
406
|
+
EncryptedCard,
|
|
407
|
+
PayKKaEncryptedCard
|
|
408
|
+
};
|