@paykka/card-checkout-ui 0.6.0 → 0.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.
Files changed (177) hide show
  1. package/dist/card-checkout-ui.js +19 -19
  2. package/dist/card-checkout-ui.umd.cjs +19 -19
  3. package/dist/es/api/index.js +0 -2
  4. package/dist/es/api/modules/checkout/index.js +1 -15
  5. package/dist/es/api/modules/checkout/map.js +31 -3
  6. package/dist/es/api/modules/index.js +0 -2
  7. package/dist/es/components/AccountNameField/index.js +0 -3
  8. package/dist/es/components/AddressField/index.js +2 -7
  9. package/dist/es/components/AliPay/index.js +45 -34
  10. package/dist/es/components/ApplePay/index.js +19 -13
  11. package/dist/es/components/Card/index.js +334 -155
  12. package/dist/es/components/CardBrands/index.js +0 -2
  13. package/dist/es/components/CardExpireDateField/index.js +1 -4
  14. package/dist/es/components/CardHolderNameField/index.js +3 -5
  15. package/dist/es/components/CardIBANField/index.js +0 -3
  16. package/dist/es/components/CardNo/index.js +0 -2
  17. package/dist/es/components/CardNumberField/index.js +1 -4
  18. package/dist/es/components/CardSecurityCodeField/index.js +1 -4
  19. package/dist/es/components/CardSelector/index.js +0 -3
  20. package/dist/es/components/CombinedCardInfo/index.js +99 -0
  21. package/dist/es/components/DropIn/index.js +210 -0
  22. package/dist/es/components/EmailField/EmailField.js +0 -3
  23. package/dist/es/components/EncryptedCard/index.js +35 -75
  24. package/dist/es/components/GooglePay/index.js +69 -28
  25. package/dist/es/components/RecurringTip/index.js +0 -2
  26. package/dist/es/components/SecuredFieldsProvider/index.js +230 -1
  27. package/dist/es/components/SecuredIframe/index.js +3 -1
  28. package/dist/es/components/Sepa/index.js +26 -30
  29. package/dist/es/components/SubmitButton/index.js +0 -2
  30. package/dist/es/components/ThreeDS/index.js +94 -0
  31. package/dist/es/components/WechatPay/index.js +48 -38
  32. package/dist/es/components/index.js +2 -3
  33. package/dist/es/components/internal/Button/Button.js +0 -2
  34. package/dist/es/components/internal/Button/index.js +0 -2
  35. package/dist/es/components/internal/CheckBox/CheckBox.js +0 -2
  36. package/dist/es/components/internal/CheckBox/index.js +0 -2
  37. package/dist/es/components/internal/Form/type.js +0 -2
  38. package/dist/es/components/internal/Info/Info.js +0 -2
  39. package/dist/es/components/internal/Info/index.js +0 -2
  40. package/dist/es/components/internal/Input/Input.js +2 -2
  41. package/dist/es/components/internal/Input/type.js +0 -2
  42. package/dist/es/components/internal/LoadingCheck/LoadingCheck.js +0 -2
  43. package/dist/es/components/internal/LoadingCheck/index.js +0 -2
  44. package/dist/es/components/internal/Modal/Modal.js +40 -0
  45. package/dist/es/components/internal/Modal/modal2.js +1 -0
  46. package/dist/es/components/internal/Select/Select.js +0 -2
  47. package/dist/es/components/internal/Select/SelectMenu.js +0 -2
  48. package/dist/es/components/internal/Select/SelectMenuItem.js +0 -2
  49. package/dist/es/components/internal/icons/Icon3DSFail.js +3 -0
  50. package/dist/es/components/internal/icons/Icon3DSInfo.js +62 -0
  51. package/dist/es/components/internal/icons/Icon3DSSuccess.js +3 -0
  52. package/dist/es/components/internal/icons/IconCard.js +42 -0
  53. package/dist/es/config.js +0 -2
  54. package/dist/es/constant.js +13 -2
  55. package/dist/es/core/PayKKaCheckout.js +106 -42
  56. package/dist/es/core/Session.js +7 -6
  57. package/dist/es/core/environment.js +26 -0
  58. package/dist/es/core/error.js +21 -0
  59. package/dist/es/core/index.js +0 -2
  60. package/dist/es/core/query.js +0 -2
  61. package/dist/es/core.js +34 -34
  62. package/dist/es/hooks/index.js +0 -2
  63. package/dist/es/hooks/useBreakpoints.js +57 -0
  64. package/dist/es/hooks/useI18n.js +1 -2
  65. package/dist/es/hooks/usePayState.js +20 -24
  66. package/dist/es/i18n/index.js +0 -2
  67. package/dist/es/i18n/locales/de-DE.js +14 -1
  68. package/dist/es/i18n/locales/en-GB.js +14 -1
  69. package/dist/es/i18n/locales/es-ES.js +14 -1
  70. package/dist/es/i18n/locales/fr-FR.js +14 -1
  71. package/dist/es/i18n/locales/index.js +8 -6
  72. package/dist/es/i18n/locales/ja-JP.js +14 -1
  73. package/dist/es/i18n/locales/ko-KR.js +14 -1
  74. package/dist/es/i18n/locales/pt-PT.js +14 -1
  75. package/dist/es/i18n/locales/ru-RU.js +14 -1
  76. package/dist/es/i18n/locales/zh-CN.js +14 -1
  77. package/dist/es/i18n/locales/zh-HK.js +14 -1
  78. package/dist/es/i18n/locales/zh-TW.js +14 -1
  79. package/dist/es/i18n/util.js +22 -8
  80. package/dist/es/index.js +8 -2
  81. package/dist/es/style.css +289 -11
  82. package/dist/es/types/message.js +28 -0
  83. package/dist/es/utils/card-brand/brands.js +12 -10
  84. package/dist/es/utils/card-brand/index.js +3 -2
  85. package/dist/es/utils/iframe.js +23 -0
  86. package/dist/es/utils/index.js +0 -1
  87. package/dist/es/utils/style.js +47 -0
  88. package/dist/style.css +1 -1
  89. package/dist/types/api/modules/checkout/map.d.ts +2 -1
  90. package/dist/types/api/modules/checkout/type.d.ts +24 -2
  91. package/dist/types/api/modules/get-browser-params.d.ts +1 -1
  92. package/dist/types/components/AddressField/type.d.ts +1 -0
  93. package/dist/types/components/AliPay/AliPay.d.ts +2 -1
  94. package/dist/types/components/AliPay/type.d.ts +2 -1
  95. package/dist/types/components/ApplePay/ApplePay.d.ts +2 -1
  96. package/dist/types/components/ApplePay/type.d.ts +9 -5
  97. package/dist/types/components/Card/Card.d.ts +2 -1
  98. package/dist/types/components/Card/type.d.ts +55 -9
  99. package/dist/types/components/CardHolderNameField/type.d.ts +1 -1
  100. package/dist/types/components/CombinedCardInfo/CombinedCardInfo.d.ts +5 -0
  101. package/dist/types/components/CombinedCardInfo/index.d.ts +2 -0
  102. package/dist/types/components/{CombinedEncryptedField → CombinedCardInfo}/type.d.ts +3 -2
  103. package/dist/types/components/DropIn/DropIn.d.ts +6 -0
  104. package/dist/types/components/DropIn/components/PaymentTabs/PaymentTabs.d.ts +3 -0
  105. package/dist/types/components/DropIn/components/PaymentTabs/index.d.ts +2 -0
  106. package/dist/types/components/DropIn/components/PaymentTabs/type.d.ts +11 -0
  107. package/dist/types/components/DropIn/index.d.ts +2 -0
  108. package/dist/types/components/DropIn/type.d.ts +49 -0
  109. package/dist/types/components/GooglePay/GooglePay.d.ts +2 -1
  110. package/dist/types/components/GooglePay/type.d.ts +20 -8
  111. package/dist/types/components/SecuredFieldsProvider/index.d.ts +1 -0
  112. package/dist/types/components/SecuredFieldsProvider/type.d.ts +1 -153
  113. package/dist/types/components/SecuredFieldsProvider/utils/index.d.ts +1 -1
  114. package/dist/types/components/SecuredIframe/useSecuredInput.d.ts +2 -1
  115. package/dist/types/components/Sepa/Sepa.d.ts +2 -1
  116. package/dist/types/components/Sepa/type.d.ts +2 -1
  117. package/dist/types/components/ThreeDS/components/ThreeDSAuth/ThreeDSAuth.d.ts +3 -0
  118. package/dist/types/components/ThreeDS/components/ThreeDSAuth/index.d.ts +2 -0
  119. package/dist/types/components/ThreeDS/components/ThreeDSAuth/type.d.ts +17 -0
  120. package/dist/types/components/ThreeDS/components/ThreeDSIframe/ThreeDSIframe.d.ts +2 -0
  121. package/dist/types/components/ThreeDS/components/ThreeDSIframe/index.d.ts +1 -0
  122. package/dist/types/components/ThreeDS/components/ThreeDSIframe/output.d.ts +1 -0
  123. package/dist/types/components/ThreeDS/components/ThreeDSIframe/type.d.ts +5 -0
  124. package/dist/types/components/ThreeDS/components/ThreeDSStatus/ThreeDSStatus.d.ts +3 -0
  125. package/dist/types/components/ThreeDS/components/ThreeDSStatus/output.d.ts +1 -0
  126. package/dist/types/components/ThreeDS/components/ThreeDSStatus/type.d.ts +6 -0
  127. package/dist/types/components/ThreeDS/index.d.ts +1 -0
  128. package/dist/types/components/WechatPay/WechatPay.d.ts +2 -1
  129. package/dist/types/components/WechatPay/type.d.ts +2 -1
  130. package/dist/types/components/index.d.ts +2 -1
  131. package/dist/types/components/internal/Input/type.d.ts +1 -0
  132. package/dist/types/components/internal/Loading/Loading.d.ts +1 -0
  133. package/dist/types/components/internal/Loading/index.d.ts +1 -0
  134. package/dist/types/components/internal/Modal/Modal.d.ts +5 -0
  135. package/dist/types/components/internal/Modal/index.d.ts +2 -0
  136. package/dist/types/components/internal/Modal/type.d.ts +20 -0
  137. package/dist/types/components/internal/icons/Icon3DSFail.d.ts +2 -0
  138. package/dist/types/components/internal/icons/Icon3DSInfo.d.ts +2 -0
  139. package/dist/types/components/internal/icons/Icon3DSSuccess.d.ts +2 -0
  140. package/dist/types/components/internal/icons/IconCard.d.ts +2 -0
  141. package/dist/types/components/internal/icons/index.d.ts +4 -0
  142. package/dist/types/constant.d.ts +17 -2
  143. package/dist/types/core/PayKKaCheckout.d.ts +23 -6
  144. package/dist/types/core/Session.d.ts +1 -1
  145. package/dist/types/core/context.d.ts +1 -0
  146. package/dist/types/core/environment.d.ts +4 -0
  147. package/dist/types/core/error.d.ts +16 -0
  148. package/dist/types/core/index.d.ts +1 -0
  149. package/dist/types/hooks/index.d.ts +1 -0
  150. package/dist/types/hooks/useBreakpoints.d.ts +15 -0
  151. package/dist/types/hooks/usePayState.d.ts +3 -6
  152. package/dist/types/i18n/locales/de-DE.d.ts +10 -0
  153. package/dist/types/i18n/locales/en-GB.d.ts +10 -0
  154. package/dist/types/i18n/locales/es-ES.d.ts +10 -0
  155. package/dist/types/i18n/locales/fr-FR.d.ts +10 -0
  156. package/dist/types/i18n/locales/index.d.ts +2 -2
  157. package/dist/types/i18n/locales/ja-JP.d.ts +10 -0
  158. package/dist/types/i18n/locales/ko-KR.d.ts +10 -0
  159. package/dist/types/i18n/locales/pt-PT.d.ts +10 -0
  160. package/dist/types/i18n/locales/ru-RU.d.ts +10 -0
  161. package/dist/types/i18n/locales/zh-CN.d.ts +10 -0
  162. package/dist/types/i18n/locales/zh-HK.d.ts +10 -0
  163. package/dist/types/i18n/locales/zh-TW.d.ts +10 -0
  164. package/dist/types/i18n/util.d.ts +5 -0
  165. package/dist/types/index.d.ts +1 -1
  166. package/dist/types/types/index.d.ts +59 -8
  167. package/dist/types/types/message.d.ts +170 -0
  168. package/dist/types/utils/card-brand/brands.d.ts +1 -8
  169. package/dist/types/utils/card-brand/index.d.ts +2 -2
  170. package/dist/types/utils/index.d.ts +1 -0
  171. package/dist/types/utils/style.d.ts +12 -0
  172. package/package.json +2 -2
  173. package/dist/es/components/CombinedEncryptedField/index.js +0 -75
  174. package/dist/es/components/SecuredFieldsProvider/SecuredFieldsProvider.js +0 -268
  175. package/dist/types/components/CombinedEncryptedField/CombinedEncryptedField.d.ts +0 -4
  176. package/dist/types/components/CombinedEncryptedField/index.d.ts +0 -2
  177. /package/dist/types/{components/SecuredFieldsProvider/utils → utils}/iframe.d.ts +0 -0
@@ -1,30 +1,78 @@
1
1
  import type { HTMLAttributes } from 'preact/compat';
2
2
  import type { LocaleKeyType } from '../i18n';
3
+ import type { PayKKaCheckout, PayKKaError, Session } from '../core';
3
4
  import type { FraudDetectionEnv } from './fraud-detection';
5
+ import type { FormValidateError } from '../components/internal/Form';
4
6
  export * from './fraud-detection';
7
+ export * from './message';
5
8
  export type CustomAttributes<T extends EventTarget, K extends keyof HTMLAttributes<T> = 'style' | 'className'> = Pick<HTMLAttributes<T>, K>;
6
9
  /** 收银台初始化参数 */
7
10
  export interface PayKKaInitConfiguration {
8
11
  sessionId: string;
12
+ /** 环境配置,必传! */
13
+ env: PayKKaEnvType;
9
14
  /** 嵌入式收银台必传,需要商户进行配置 */
10
15
  clientKey?: string;
11
16
  /** 国际化语言 */
12
17
  locale?: LocaleKeyType;
13
18
  /** 是否隐藏支付按钮 */
14
19
  hidePaymentButton?: boolean;
15
- /** 欺诈检测环境配置 */
16
- fraudDetectionEnv?: FraudDetectionEnv;
20
+ /** 定义 3DS 所需配置 */
21
+ threeDSFrame?: ThreeDSFrameConfig;
17
22
  /** 收银台已经获取到可用支付方式时调用 */
18
23
  onPaymentMethodsReady?: (methods: string[]) => void;
19
- /** 收银台过期时触发,可被组件参数中的 onExpired 回调覆盖 */
20
24
  /** 收银台创建时报错触发 */
21
- onInitError?: (error: any) => void;
25
+ onInitError?: (error: PayKKaError) => void;
22
26
  /**
23
- * sandbox 模式下所需参数
27
+ * 全局回调,可以统一处理支付状态
28
+ * 创建组件时传同名回调可覆盖
24
29
  */
25
- /** 是否采用 sandbox 环境,用于进行测试 */
26
- sandbox?: boolean;
30
+ /** 提交表单时触发 */
31
+ onSubmit?: (formValidateError?: Recordable<FormValidateError[]>) => void;
32
+ /** 支付成功后触发 */
33
+ onSuccess?: (data: PaymentSuccessData) => void;
34
+ /** 支付失败时触发 */
35
+ onError?: (error: PayKKaError) => void;
36
+ /** 支付超时时触发 */
37
+ onTimeout?: () => void;
38
+ /** 收银台已过期时触发 */
39
+ onExpired?: () => void;
40
+ /**
41
+ * 内部参数
42
+ */
43
+ /** 环境配置,优先级大于 env 参数 */
44
+ _envConfig?: PayKKaEnvConfig;
45
+ }
46
+ /** 收银台创建组件时自动传入的内部属性 */
47
+ export type CoreProps = {
48
+ session: Session;
49
+ /** 收银台实例 */
50
+ core: PayKKaCheckout;
51
+ /** 定义 3DS 所需配置 */
52
+ threeDSFrame?: ThreeDSFrameConfig;
53
+ /** 组件是否通过 DropIn 创建 */
54
+ isDropIn?: boolean;
55
+ };
56
+ export interface ThreeDSFrameConfig {
57
+ /** 3DS 页面宽度 */
58
+ modalWidth?: number | string;
59
+ /** 3DS 页面高度 */
60
+ modalHeight?: number | string;
27
61
  }
62
+ export declare enum EPayKKaEnv {
63
+ /** 沙箱环境 */
64
+ SANDBOX = "sandbox",
65
+ /** 欧洲生产环境 */
66
+ EU = "eu",
67
+ /** 香港生产环境 */
68
+ HK = "hk"
69
+ }
70
+ export interface PayKKaEnvConfig {
71
+ api?: string;
72
+ cdn?: string;
73
+ fraudDetection?: FraudDetectionEnv;
74
+ }
75
+ export type PayKKaEnvType = `${EPayKKaEnv}`;
28
76
  export type PaymentSuccessData = {
29
77
  returnUrl?: string;
30
78
  };
@@ -36,7 +84,7 @@ export declare enum CardBrandCode {
36
84
  DISCOVER = "DISCOVER",
37
85
  DINERS_CLUB = "DINERS_CLUB"
38
86
  }
39
- export type CardBrand = keyof typeof CardBrandCode;
87
+ export type CardBrand = `${CardBrandCode}`;
40
88
  export interface ElementStylesConfig {
41
89
  /** input 元素的样式 */
42
90
  input?: InputStylesConfig;
@@ -45,6 +93,9 @@ export interface ElementStylesConfig {
45
93
  /** 错误提示文案的样式 */
46
94
  errorMessage?: Partial<CSSStyleDeclaration>;
47
95
  }
96
+ export interface FullElementStylesConfig extends ElementStylesConfig {
97
+ inputWrapper?: StylesConfig;
98
+ }
48
99
  export interface StylesConfig {
49
100
  /** 默认样式 */
50
101
  base?: Partial<CSSStyleDeclaration>;
@@ -0,0 +1,170 @@
1
+ import type { CardBrand, InputStylesConfig } from '.';
2
+ import type { PayRes } from '../api';
3
+ import type { EncryptCardRes } from '../api/modules/encrypted-card/type';
4
+ import type { EFieldType, FieldIframeConfig } from '../components/SecuredFieldsProvider';
5
+ import type { FormValidationStatus } from '../components/internal/Form';
6
+ import type { LocaleKeyType } from '../i18n';
7
+ export declare enum MessageAction {
8
+ /** 通知 iframe 初始化 input */
9
+ INIT = "init",
10
+ /** 表单 iframe DOM 已加载 */
11
+ ACTIVATED = "Activated",
12
+ /** 隐藏的 iframe 已经加载 */
13
+ HIDDEN_IFRAME_READY = "hiddenIframeReady",
14
+ /** 是否聚焦 */
15
+ FOCUS = "focus",
16
+ /** 卡 bin 信息改变 */
17
+ BIN_VALUE = "binValue",
18
+ /** 检测到卡品牌 */
19
+ BRAND = "brand",
20
+ /** 传递验证通过信息(附带值) */
21
+ VALID_WITH_VALUE = "validWithValue",
22
+ /** 通知隐藏 iframe 进行支付 */
23
+ PAYMENT = "payment",
24
+ /** 通知表单组件支付响应信息 */
25
+ AFTER_PAYMENT = "afterPayment",
26
+ /** 通知表单组件支付错误信息 */
27
+ PAYMENT_ERROR = "paymentError",
28
+ /** 通知表单组件支付超时 */
29
+ PAYMENT_TIMEOUT = "paymentTimeout",
30
+ /** 通知表单项验证信息 */
31
+ VALID_STATUS_CHANGED = "validStatusChanged",
32
+ /** 通知表单项校验 */
33
+ VALIDATE = "validate",
34
+ /** 通知表单项校验结果 */
35
+ VALIDATED = "validated",
36
+ /** 通知表单项配置 */
37
+ SET_CONFIG = "setConfig",
38
+ /**
39
+ * encrypted card
40
+ */
41
+ /** 通知 clientKey 已校验 */
42
+ AUTHORIZED = "authorized",
43
+ /** 通知隐藏 iframe 加密卡信息 */
44
+ ENCRYPT_CARD = "encryptCard",
45
+ /** 通知加密后的卡信息 */
46
+ CARD_ENCRYPTED = "cardEncrypted",
47
+ /** 通知卡信息加密错误 */
48
+ CARD_ENCRYPTION_FAILED = "cardEncryptionFailed",
49
+ /**
50
+ * 3DS
51
+ */
52
+ /** 通知组件查询 3DS 结果 */
53
+ CHECK_THREE_DS = "checkThreeDS",
54
+ /** 通知组件 3DS 结果页加载 */
55
+ THREE_DS_STATUS_INIT = "threeDSStatusInit",
56
+ /** 向 3DS 状态页传递配置 */
57
+ THREE_DS_STATUS_CONFIG = "threeDSStatusConfig"
58
+ }
59
+ export type Message<T extends MessageAction> = {
60
+ action: T;
61
+ } & MessageMapping[T];
62
+ type MessageMapping = {
63
+ [MessageAction.INIT]: InitMessage;
64
+ [MessageAction.FOCUS]: FocusMessage;
65
+ [MessageAction.BIN_VALUE]: BinValueMessage;
66
+ [MessageAction.VALID_WITH_VALUE]: ValidWithValueMessage;
67
+ [MessageAction.PAYMENT]: PaymentMessage;
68
+ [MessageAction.AFTER_PAYMENT]: AfterPaymentMessage;
69
+ [MessageAction.PAYMENT_ERROR]: PaymentErrorMessage;
70
+ [MessageAction.PAYMENT_TIMEOUT]: PaymentTimeoutMessage;
71
+ [MessageAction.VALID_STATUS_CHANGED]: ValidStatusChangedMessage;
72
+ [MessageAction.ENCRYPT_CARD]: EncryptCardMessage;
73
+ [MessageAction.CARD_ENCRYPTED]: CardEncryptedMessage;
74
+ [MessageAction.CARD_ENCRYPTION_FAILED]: CardEncryptionFailedMessage;
75
+ [MessageAction.AUTHORIZED]: AuthorizedMessage;
76
+ [MessageAction.BRAND]: BrandMessage;
77
+ [MessageAction.ACTIVATED]: ActivatedMessage;
78
+ [MessageAction.HIDDEN_IFRAME_READY]: {};
79
+ [MessageAction.VALIDATE]: {};
80
+ [MessageAction.VALIDATED]: ValidatedMessage;
81
+ [MessageAction.SET_CONFIG]: SetConfigMessage;
82
+ [MessageAction.CHECK_THREE_DS]: CheckThreeDSMessage;
83
+ [MessageAction.THREE_DS_STATUS_INIT]: {};
84
+ [MessageAction.THREE_DS_STATUS_CONFIG]: ThreeDSStatusConfigMessage;
85
+ };
86
+ export interface InitMessage {
87
+ config?: FieldIframeConfig;
88
+ /** 是否隐藏,如不隐藏则为表单iframe */
89
+ hidden: boolean;
90
+ apiUrl?: string;
91
+ cdnUrl?: string;
92
+ }
93
+ export interface FocusMessage {
94
+ focus: boolean;
95
+ fieldType: EFieldType;
96
+ }
97
+ export interface InvalidMessage {
98
+ errorTip: string;
99
+ fieldType: EFieldType;
100
+ }
101
+ export interface ValidMessage {
102
+ fieldType: EFieldType;
103
+ }
104
+ export interface BinValueMessage {
105
+ binValue: string;
106
+ fieldType: EFieldType;
107
+ brand?: CardBrand;
108
+ }
109
+ export interface ValidWithValueMessage {
110
+ value: string;
111
+ fieldType: EFieldType;
112
+ }
113
+ export interface PaymentMessage {
114
+ formData: any;
115
+ locale: string;
116
+ }
117
+ export interface AfterPaymentMessage {
118
+ response: PayRes;
119
+ }
120
+ export interface PaymentErrorMessage {
121
+ error: {
122
+ message: string;
123
+ code: string;
124
+ };
125
+ }
126
+ export interface ValidStatusChangedMessage {
127
+ status: FormValidationStatus;
128
+ errorTip?: string;
129
+ fieldType: EFieldType;
130
+ }
131
+ export interface PaymentTimeoutMessage {
132
+ message?: string;
133
+ }
134
+ export interface CardEncryptedMessage {
135
+ encryptedInfo: EncryptCardRes;
136
+ }
137
+ export interface CardEncryptionFailedMessage {
138
+ error: {
139
+ message: string;
140
+ code: string;
141
+ };
142
+ }
143
+ export interface AuthorizedMessage {
144
+ success: boolean;
145
+ }
146
+ export interface BrandMessage {
147
+ brand?: CardBrand;
148
+ fieldType: EFieldType;
149
+ }
150
+ export interface EncryptCardMessage {
151
+ merchantId: string;
152
+ clientKey: string;
153
+ }
154
+ export interface ActivatedMessage {
155
+ fieldType: EFieldType;
156
+ }
157
+ export interface ValidatedMessage {
158
+ status: FormValidationStatus;
159
+ fieldType: EFieldType;
160
+ }
161
+ export interface SetConfigMessage {
162
+ style?: InputStylesConfig;
163
+ }
164
+ export interface CheckThreeDSMessage {
165
+ status: string;
166
+ }
167
+ export interface ThreeDSStatusConfigMessage {
168
+ locale?: LocaleKeyType;
169
+ }
170
+ export {};
@@ -9,13 +9,6 @@ export interface CardBrandConfig {
9
9
  order: number;
10
10
  }
11
11
  export declare const cardBrands: CardBrandConfig[];
12
- export declare const cardBrandIconMap: {
13
- VISA: typeof IconVisa;
14
- MASTER_CARD: typeof IconMasterCard;
15
- JCB: typeof IconJcb;
16
- AMEX: typeof IconAmex;
17
- DISCOVER: typeof IconDiscover;
18
- DINERS_CLUB: typeof IconDinnersClub;
19
- };
12
+ export declare const getCardBrandIconMap: (code: CardBrandCode) => typeof IconVisa | typeof IconMasterCard | typeof IconJcb | typeof IconAmex | typeof IconDiscover | typeof IconDinnersClub;
20
13
  export type CardBrands = (typeof cardBrands)[number]['code'];
21
14
  export declare const cardBrandsLengthList: number[];
@@ -1,5 +1,5 @@
1
- import { cardBrands, cardBrandsLengthList, cardBrandCodes, cardBrandIconMap, type CardBrandConfig } from './brands';
2
- export { cardBrands, cardBrandsLengthList, cardBrandCodes, cardBrandIconMap };
1
+ import { cardBrands, cardBrandsLengthList, cardBrandCodes, type CardBrandConfig } from './brands';
2
+ export { cardBrands, cardBrandsLengthList, cardBrandCodes };
3
3
  export declare function getSupportedCardBrands(supportedCardBrands?: string[]): CardBrandConfig[];
4
4
  export declare function findCardBrand(number: string, brands?: CardBrandConfig[]): CardBrandConfig | undefined;
5
5
  export declare function findCardBrandInfo(number: string, brands?: CardBrandConfig[]): {
@@ -8,6 +8,7 @@ export * from './format';
8
8
  export * from './is';
9
9
  export * from './obj';
10
10
  export * from './style';
11
+ export * from './iframe';
11
12
  export declare function getIf<T>(value: T, condition: boolean): T | undefined;
12
13
  /**
13
14
  * 将一个数值限制在指定的范围内
@@ -1,3 +1,4 @@
1
+ import { type ElementStylesConfig, type FullElementStylesConfig } from '../types';
1
2
  /**
2
3
  * 将对象转换为 CSS 样式字符串
3
4
  * @param style 样式对象
@@ -15,3 +16,14 @@ export declare const generateClassNameMap: (selector?: string) => {
15
16
  export declare const loadStyle: (styleStr: string, extraOptions?: Partial<HTMLScriptElement>) => void;
16
17
  /** 创建 placeholder 样式 */
17
18
  export declare const createPlaceholderStyle: (selector: string, style?: Recordable) => string;
19
+ /** 将可以直接应用到 iframe 中的 input 样式剥离出来 */
20
+ export declare const separateInputStyle: (styles: ElementStylesConfig) => FullElementStylesConfig;
21
+ /**
22
+ * 生成组件样式字符串
23
+ * @param style 样式对象
24
+ * @param selector 选择器,可以是父元素也可以是当前元素
25
+ */
26
+ export declare const genComponentStyle: (list?: Array<{
27
+ selector: string;
28
+ style?: Recordable;
29
+ }>) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paykka/card-checkout-ui",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "main": "dist/paykka-card-checkout-ui.umd.js",
6
6
  "module": "dist/es/index.js",
@@ -23,7 +23,7 @@
23
23
  "build:inner": "tsx ./build/runInner.ts",
24
24
  "build:outer": "tsx ./build/runOuter.ts",
25
25
  "build:type": "tsc -p ./tsconfig.build.json",
26
- "copy-dist-to-cdn": "tsx ./copyDist2CDN.ts",
26
+ "copy-dist-to-cdn": "tsx ./build/copyDist2CDN.ts",
27
27
  "changeset": "changeset",
28
28
  "changeset:pre": "changeset pre enter beta",
29
29
  "changeset:pre-exit": "changeset pre exit",
@@ -1,75 +0,0 @@
1
- import { w, A, F, h, u, b } from "../../core.js";
2
- import "../internal/Form/type.js";
3
- import "../internal/Form/context.js";
4
- import { FormItem } from "../internal/Form/FormItem.js";
5
- import "../internal/Form/Form.js";
6
- import { Input } from "../internal/Input/Input.js";
7
- import "../internal/Input/type.js";
8
- import { EFieldType } from "../SecuredFieldsProvider/SecuredFieldsProvider.js";
9
- import { getSupportedCardBrands, finCardBrandInfoByCode, findCardBrandInfo } from "../../utils/card-brand/index.js";
10
- import "../../utils/system-info/get-browser-info.js";
11
- import { trimAll } from "../../utils/format.js";
12
- import { IconCardNo } from "../internal/icons/IconCardNo.js";
13
- const CombinedEncryptedField = w((props, ref) => {
14
- const { supportedCardBrands = [], className } = props;
15
- const inputRef = A(null);
16
- const formItemRef = A(null);
17
- F(ref, () => ({
18
- input: inputRef.current,
19
- focus: () => {
20
- var _a;
21
- (_a = inputRef.current) == null ? void 0 : _a.focus();
22
- },
23
- blur: () => {
24
- var _a;
25
- (_a = inputRef.current) == null ? void 0 : _a.blur();
26
- },
27
- resetValidation: (status, errorTip) => {
28
- var _a;
29
- (_a = formItemRef.current) == null ? void 0 : _a.resetValidation(status, [{ message: errorTip }]);
30
- },
31
- binValueChanged: (binValue2) => {
32
- setBinValue(binValue2);
33
- },
34
- brandChanged: (brand) => {
35
- if (brand) {
36
- const brandInfo = finCardBrandInfoByCode(brand);
37
- setBrandIcon(() => brandInfo == null ? void 0 : brandInfo.icon);
38
- } else {
39
- setBrandIcon(void 0);
40
- }
41
- },
42
- getCardBrand: () => findCardBrandInfo(trimAll(binValue), brands) || {}
43
- }));
44
- const [binValue, setBinValue] = h("");
45
- const brands = getSupportedCardBrands(supportedCardBrands);
46
- const [brandIcon, setBrandIcon] = h(void 0);
47
- const LeftIcon = () => {
48
- const Icon = brandIcon ?? IconCardNo;
49
- return /* @__PURE__ */ u(Icon, { size: 32 });
50
- };
51
- return /* @__PURE__ */ u(
52
- FormItem,
53
- {
54
- showLabel: false,
55
- ref: formItemRef,
56
- className,
57
- children: /* @__PURE__ */ u(
58
- Input,
59
- {
60
- ref: inputRef,
61
- leftIcon: LeftIcon(),
62
- rightIcon: /* @__PURE__ */ u(b, {}),
63
- children: /* @__PURE__ */ u("div", { style: "width:100%;height:100%;display:flex", children: [
64
- /* @__PURE__ */ u("div", { style: "flex:1", "data-sf": EFieldType.CARD_NUMBER }),
65
- /* @__PURE__ */ u("div", { style: "width:100px", "data-sf": EFieldType.EXPIRE_DATE }),
66
- /* @__PURE__ */ u("div", { style: "width:60px", "data-sf": EFieldType.CVV })
67
- ] })
68
- }
69
- )
70
- }
71
- );
72
- });
73
- export {
74
- CombinedEncryptedField
75
- };
@@ -1,268 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
- import { w, A, F, y, q, u } from "../../core.js";
8
- import { SessionMode } from "../../constant.js";
9
- import { cdnUrl, cdnOrigin, apiUrl } from "../../config.js";
10
- import { safeParse } from "../../utils/index.js";
11
- var EFieldType = /* @__PURE__ */ ((EFieldType2) => {
12
- EFieldType2["CARD_NUMBER"] = "CARD_NUMBER";
13
- EFieldType2["CVV"] = "CVV";
14
- EFieldType2["EXPIRE_DATE"] = "EXPIRE_DATE";
15
- return EFieldType2;
16
- })(EFieldType || {});
17
- var MessageAction = /* @__PURE__ */ ((MessageAction2) => {
18
- MessageAction2["INIT"] = "init";
19
- MessageAction2["ACTIVATED"] = "Activated";
20
- MessageAction2["HIDDEN_IFRAME_READY"] = "hiddenIframeReady";
21
- MessageAction2["FOCUS"] = "focus";
22
- MessageAction2["BIN_VALUE"] = "binValue";
23
- MessageAction2["BRAND"] = "brand";
24
- MessageAction2["VALID_WITH_VALUE"] = "validWithValue";
25
- MessageAction2["PAYMENT"] = "payment";
26
- MessageAction2["AFTER_PAYMENT"] = "afterPayment";
27
- MessageAction2["PAYMENT_ERROR"] = "paymentError";
28
- MessageAction2["PAYMENT_TIMEOUT"] = "paymentTimeout";
29
- MessageAction2["VALID_STATUS_CHANGED"] = "validStatusChanged";
30
- MessageAction2["VALIDATE"] = "validate";
31
- MessageAction2["VALIDATED"] = "validated";
32
- MessageAction2["SET_CONFIG"] = "setConfig";
33
- MessageAction2["AUTHORIZED"] = "authorized";
34
- MessageAction2["ENCRYPT_CARD"] = "encryptCard";
35
- MessageAction2["CARD_ENCRYPTED"] = "cardEncrypted";
36
- MessageAction2["CARD_ENCRYPTION_FAILED"] = "cardEncryptionFailed";
37
- return MessageAction2;
38
- })(MessageAction || {});
39
- const SECURED_FILED_ATTR = "data-sf";
40
- const SECURED_IFRAME_CLASS_NAME = "secured-iframe";
41
- const HIDDEN_IFRAME_NAME = "hidden-pay-iframe";
42
- const getFieldElements = (rootNode) => {
43
- return rootNode ? Array.prototype.slice.call(rootNode.querySelectorAll(`[${SECURED_FILED_ATTR}]`)) : [];
44
- };
45
- const createIframe = (src) => {
46
- const iframeEl = document.createElement("iframe");
47
- iframeEl.setAttribute("src", src);
48
- iframeEl.classList.add(SECURED_IFRAME_CLASS_NAME);
49
- iframeEl.setAttribute("allowtransparency", "true");
50
- iframeEl.setAttribute("referrerpolicy", "origin");
51
- Object.defineProperty(iframeEl, "src", { configurable: false, writable: false });
52
- const noIframeElContent = document.createTextNode("<p>Your browser does not support iframes.</p>");
53
- iframeEl.appendChild(noIframeElContent);
54
- return iframeEl;
55
- };
56
- const postMessageToIframe = (data, iframe, targetOrigin = "*") => {
57
- if (!iframe) {
58
- return;
59
- }
60
- const dataStr = JSON.stringify(data);
61
- iframe.postMessage(dataStr, { targetOrigin });
62
- };
63
- class SecuredField {
64
- constructor(config) {
65
- __publicField(this, "iframe");
66
- __publicField(this, "iframeWindow");
67
- __publicField(this, "hiddenIframe");
68
- __publicField(this, "config");
69
- this.config = config;
70
- this.init();
71
- }
72
- /** 初始化表单区域iframe */
73
- init() {
74
- const { iframeSrc, iframeClassName, fieldNode } = this.config;
75
- const iframeEl = createIframe(iframeSrc);
76
- iframeEl.width = "100%";
77
- iframeEl.height = "100%";
78
- iframeEl.style.border = "none";
79
- fieldNode.appendChild(iframeEl);
80
- const iframe = fieldNode.querySelector(`.${iframeClassName}`);
81
- if (!iframe) {
82
- return;
83
- }
84
- this.iframe = iframe;
85
- iframe.addEventListener("load", () => this.onFieldIframeLoad());
86
- }
87
- /** 表单区域iframe加载回调 */
88
- onFieldIframeLoad() {
89
- this.iframeWindow = this.iframe.contentWindow;
90
- const { fieldType, placeholder, style, hiddenIframeName, supportedCardBrands } = this.config;
91
- const data = {
92
- action: MessageAction.INIT,
93
- config: {
94
- fieldType,
95
- placeholder,
96
- style,
97
- hiddenIframeName,
98
- supportedCardBrands
99
- },
100
- hidden: false,
101
- cdnUrl
102
- };
103
- postMessageToIframe(data, this.iframeWindow, cdnOrigin);
104
- }
105
- }
106
- const SecuredFieldsProvider = w((props, ref) => {
107
- const { sessionMode, i18n, targetElement } = props;
108
- const rootNodeRef = A(null);
109
- const hiddenIframe = A(null);
110
- const payment = (formData) => {
111
- const data = {
112
- action: MessageAction.PAYMENT,
113
- formData,
114
- locale: props.i18n.locale
115
- };
116
- postMessageToIframe(data, hiddenIframe.current.contentWindow, cdnOrigin);
117
- };
118
- F(ref, () => ({
119
- payment,
120
- reload: () => {
121
- if (sessionMode !== SessionMode.EMBEDDED) {
122
- return;
123
- }
124
- window.removeEventListener("message", onReceiveMessage);
125
- if (hiddenIframe.current) {
126
- document.body.removeChild(hiddenIframe.current);
127
- }
128
- init();
129
- },
130
- encryptCard: (encryptedInfo) => {
131
- const data = {
132
- action: MessageAction.ENCRYPT_CARD,
133
- ...encryptedInfo
134
- };
135
- postMessageToIframe(data, hiddenIframe.current.contentWindow, cdnOrigin);
136
- },
137
- validate: () => {
138
- Object.values(securedFieldMap.current).forEach((field) => {
139
- const data = {
140
- action: MessageAction.VALIDATE
141
- };
142
- postMessageToIframe(data, field.iframe.contentWindow, cdnOrigin);
143
- });
144
- },
145
- setConfig: (config) => {
146
- props.style = config.style;
147
- }
148
- }));
149
- if (!frames && sessionMode !== SessionMode.EMBEDDED) {
150
- return props.children;
151
- }
152
- let fieldNodes = [];
153
- const securedFieldMap = A({});
154
- const securedFieldPlaceholderMap = {
155
- [EFieldType.CARD_NUMBER]: i18n.get("card.cardNumber.placeholder"),
156
- [EFieldType.CVV]: i18n.get("card.cardSecurityCode.placeholder"),
157
- [EFieldType.EXPIRE_DATE]: i18n.get("card.cardExpireDate.placeholder")
158
- };
159
- y(() => {
160
- init();
161
- }, []);
162
- const init = async () => {
163
- fieldNodes = getFieldElements(targetElement || rootNodeRef.current);
164
- if (!fieldNodes.length) {
165
- return;
166
- }
167
- await initHiddenIframe();
168
- initAllFieldIframe();
169
- window.addEventListener("message", onReceiveMessage);
170
- };
171
- const initHiddenIframe = async () => {
172
- const iframeEl = createIframe(`${cdnUrl}/secured-iframe.html`);
173
- iframeEl.name = `${HIDDEN_IFRAME_NAME}-${Date.now()}`;
174
- iframeEl.width = "0";
175
- iframeEl.height = "0";
176
- iframeEl.style.border = "none";
177
- hiddenIframe.current = iframeEl;
178
- const data = {
179
- action: MessageAction.INIT,
180
- hidden: true,
181
- apiUrl,
182
- cdnUrl
183
- };
184
- iframeEl.addEventListener("load", () => {
185
- postMessageToIframe(data, hiddenIframe.current.contentWindow, cdnOrigin);
186
- });
187
- window.document.body.appendChild(iframeEl);
188
- };
189
- const initAllFieldIframe = () => {
190
- fieldNodes.forEach((fieldNode) => {
191
- const fieldType = fieldNode.getAttribute(SECURED_FILED_ATTR);
192
- securedFieldMap.current[fieldType] = new SecuredField({
193
- fieldNode,
194
- hiddenIframe: hiddenIframe.current,
195
- hiddenIframeName: hiddenIframe.current.name,
196
- rootNode: rootNodeRef.current,
197
- iframeSrc: `${cdnUrl}/secured-iframe.html`,
198
- iframeClassName: SECURED_IFRAME_CLASS_NAME,
199
- fieldType,
200
- placeholder: securedFieldPlaceholderMap[fieldType],
201
- style: props.style,
202
- supportedCardBrands: props.supportedCardBrands,
203
- onFocus: props.onFocus,
204
- onBinValue: props.onBinValue,
205
- onAfterPayment: props.onAfterPayment,
206
- onPaymentError: props.onPaymentError,
207
- onPaymentTimeout: props.onPaymentTimeout,
208
- onValidStatusChanged: props.onValidStatusChanged
209
- });
210
- });
211
- };
212
- const onReceiveMessage = q((event) => {
213
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
214
- const { data, origin } = event;
215
- if (origin !== cdnOrigin) {
216
- return;
217
- }
218
- const feedbackData = safeParse(data);
219
- if (!Reflect.has(feedbackData, "action")) {
220
- return;
221
- }
222
- switch (feedbackData.action) {
223
- case MessageAction.FOCUS:
224
- (_a = props.onFocus) == null ? void 0 : _a.call(props, feedbackData);
225
- break;
226
- case MessageAction.BIN_VALUE:
227
- (_b = props.onBinValue) == null ? void 0 : _b.call(props, feedbackData);
228
- break;
229
- case MessageAction.BRAND:
230
- (_c = props.onBrand) == null ? void 0 : _c.call(props, feedbackData);
231
- break;
232
- case MessageAction.AFTER_PAYMENT:
233
- (_d = props.onAfterPayment) == null ? void 0 : _d.call(props, feedbackData);
234
- break;
235
- case MessageAction.PAYMENT_ERROR:
236
- (_e = props.onPaymentError) == null ? void 0 : _e.call(props, feedbackData);
237
- break;
238
- case MessageAction.PAYMENT_TIMEOUT:
239
- (_f = props.onPaymentTimeout) == null ? void 0 : _f.call(props, feedbackData);
240
- break;
241
- case MessageAction.VALID_STATUS_CHANGED:
242
- (_g = props.onValidStatusChanged) == null ? void 0 : _g.call(props, feedbackData);
243
- break;
244
- case MessageAction.AUTHORIZED:
245
- (_h = props.onAuthorized) == null ? void 0 : _h.call(props, feedbackData);
246
- break;
247
- case MessageAction.ACTIVATED:
248
- (_i = props.onActivated) == null ? void 0 : _i.call(props, feedbackData);
249
- break;
250
- case MessageAction.CARD_ENCRYPTED:
251
- (_j = props.onCardEncrypted) == null ? void 0 : _j.call(props, feedbackData);
252
- break;
253
- case MessageAction.CARD_ENCRYPTION_FAILED:
254
- (_k = props.onCardEncryptionFailed) == null ? void 0 : _k.call(props, feedbackData);
255
- break;
256
- case MessageAction.VALIDATED:
257
- (_l = props.onValidated) == null ? void 0 : _l.call(props, feedbackData);
258
- break;
259
- }
260
- }, []);
261
- return /* @__PURE__ */ u("div", { ref: rootNodeRef, children: !targetElement && props.children });
262
- });
263
- export {
264
- EFieldType,
265
- MessageAction,
266
- SecuredFieldsProvider,
267
- postMessageToIframe
268
- };