@paykka/card-checkout-ui 0.13.1 → 0.13.5

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 (158) hide show
  1. package/dist/card-checkout-ui.js +21 -21
  2. package/dist/card-checkout-ui.umd.cjs +21 -21
  3. package/dist/es/_commonjsHelpers.js +82 -1
  4. package/dist/es/api/modules/get-browser-params.js +4 -1
  5. package/dist/es/api/modules/opay-wallet/index.js +16 -0
  6. package/dist/es/api/modules/paga-wallet/index.js +16 -0
  7. package/dist/es/api/modules/pic-pay/index.js +16 -0
  8. package/dist/es/api/modules/pix/index.js +16 -0
  9. package/dist/es/api/modules/vietqr/index.js +4 -0
  10. package/dist/es/components/AliPay/index.js +29 -35
  11. package/dist/es/components/Boost/index.js +34 -40
  12. package/dist/es/components/Card/index.js +35 -39
  13. package/dist/es/components/DropIn/index.js +42 -2
  14. package/dist/es/components/EncryptedCard/index.js +5 -1
  15. package/dist/es/components/GooglePay/index.js +1 -0
  16. package/dist/es/components/GrabPay/index.js +34 -40
  17. package/dist/es/components/GuideCard/index.js +6 -1
  18. package/dist/es/components/LinePay/index.js +34 -40
  19. package/dist/es/components/MayBankQRPay/index.js +35 -41
  20. package/dist/es/components/NinePay/index.js +34 -40
  21. package/dist/es/components/SecuredFieldsProvider/index.js +23 -7
  22. package/dist/es/components/SecuredIframe/index.js +36 -59
  23. package/dist/es/components/Sepa/index.js +17 -21
  24. package/dist/es/components/ShopeePay/index.js +34 -40
  25. package/dist/es/components/TNGWallet/index.js +34 -40
  26. package/dist/es/components/ThreeDS/index.js +32 -7
  27. package/dist/es/components/WechatPay/index.js +19 -24
  28. package/dist/es/components/business/QRCodeModal/QRCodeModal.js +6 -6
  29. package/dist/es/components/index.js +5 -0
  30. package/dist/es/components/internal/Form/FormItem.js +1 -1
  31. package/dist/es/components/internal/Form/util.js +1 -1
  32. package/dist/es/components/internal/Select/SelectMenu.js +2 -2
  33. package/dist/es/components/internal/icons/IconError.js +7 -4
  34. package/dist/es/components/internal/icons/IconOpayWallet.js +71 -0
  35. package/dist/es/components/internal/icons/IconPagaWallet.js +141 -0
  36. package/dist/es/components/internal/icons/IconPaymaya.js +42 -86
  37. package/dist/es/components/internal/icons/IconPicPay.js +49 -0
  38. package/dist/es/components/internal/icons/IconPix.js +75 -0
  39. package/dist/es/components/internal/icons/IconVietqr.js +45 -0
  40. package/dist/es/components/internal/icons/IconVietqrComplete.js +49 -0
  41. package/dist/es/components/wallets/GCash/GCash.js +20 -25
  42. package/dist/es/components/wallets/OpayWallet/OpayWallet.js +346 -0
  43. package/dist/es/components/wallets/OpayWallet/index.js +1 -0
  44. package/dist/es/components/wallets/OpayWallet/opay-wallet.js +1 -0
  45. package/dist/es/components/wallets/OpayWallet/type.js +1 -0
  46. package/dist/es/components/wallets/PagaWallet/PagaWallet.js +346 -0
  47. package/dist/es/components/wallets/PagaWallet/index.js +1 -0
  48. package/dist/es/components/wallets/PagaWallet/paga-wallet.js +1 -0
  49. package/dist/es/components/wallets/PagaWallet/type.js +1 -0
  50. package/dist/es/components/wallets/Paymaya/Paymaya.js +34 -40
  51. package/dist/es/components/wallets/PicPay/PicPay.js +346 -0
  52. package/dist/es/components/wallets/PicPay/index.js +1 -0
  53. package/dist/es/components/wallets/PicPay/pic-pay.js +1 -0
  54. package/dist/es/components/wallets/PicPay/type.js +1 -0
  55. package/dist/es/components/wallets/Pix/Pix.js +346 -0
  56. package/dist/es/components/wallets/Pix/index.js +1 -0
  57. package/dist/es/components/wallets/Pix/pix2.js +1 -0
  58. package/dist/es/components/wallets/Pix/type.js +1 -0
  59. package/dist/es/components/wallets/Vietqr/Vietqr.js +380 -0
  60. package/dist/es/components/wallets/Vietqr/index.js +1 -0
  61. package/dist/es/components/wallets/Vietqr/type.js +1 -0
  62. package/dist/es/components/wallets/Vietqr/vietqr2.js +1 -0
  63. package/dist/es/components/wallets/Zalopay/Zalopay.js +17 -21
  64. package/dist/es/components/wallets/index.js +8 -0
  65. package/dist/es/constant.js +32 -2
  66. package/dist/es/core/checkout.js +24 -1
  67. package/dist/es/core/create.js +1 -1
  68. package/dist/es/core/session.js +2 -23
  69. package/dist/es/core/theme.js +65 -0
  70. package/dist/es/core.js +34 -34
  71. package/dist/es/i18n/locales/de-DE.js +8 -2
  72. package/dist/es/i18n/locales/en-GB.js +8 -2
  73. package/dist/es/i18n/locales/es-ES.js +8 -2
  74. package/dist/es/i18n/locales/fr-FR.js +8 -2
  75. package/dist/es/i18n/locales/ja-JP.js +8 -2
  76. package/dist/es/i18n/locales/ko-KR.js +8 -2
  77. package/dist/es/i18n/locales/nl-NL.js +8 -2
  78. package/dist/es/i18n/locales/pt-PT.js +8 -2
  79. package/dist/es/i18n/locales/ru-RU.js +8 -2
  80. package/dist/es/i18n/locales/zh-CN.js +10 -4
  81. package/dist/es/i18n/locales/zh-HK.js +10 -4
  82. package/dist/es/i18n/locales/zh-TW.js +10 -4
  83. package/dist/es/index.js +17 -5
  84. package/dist/es/style.css +1 -1
  85. package/dist/es/utils/format.js +0 -5
  86. package/dist/es/utils/object.js +31 -1
  87. package/dist/es/utils/string.js +10 -0
  88. package/dist/es/utils/system-info/is-ua-webview.js +14 -12
  89. package/dist/es/utils/theme.js +7 -0
  90. package/dist/style.css +1 -1
  91. package/dist/types/api/modules/get-browser-params.d.ts +1 -0
  92. package/dist/types/api/modules/index.d.ts +5 -0
  93. package/dist/types/api/modules/opay-wallet/index.d.ts +4 -0
  94. package/dist/types/api/modules/paga-wallet/index.d.ts +4 -0
  95. package/dist/types/api/modules/pic-pay/index.d.ts +4 -0
  96. package/dist/types/api/modules/pix/index.d.ts +4 -0
  97. package/dist/types/api/modules/vietqr/index.d.ts +4 -0
  98. package/dist/types/components/DropIn/type.d.ts +3 -2
  99. package/dist/types/components/SecuredFieldsProvider/type.d.ts +5 -0
  100. package/dist/types/components/SecuredIframe/HiddenIframe.d.ts +3 -1
  101. package/dist/types/components/ThreeDS/components/ThreeDSAuth/type.d.ts +2 -0
  102. package/dist/types/components/business/QRCodeModal/type.d.ts +2 -0
  103. package/dist/types/components/index.d.ts +1 -3
  104. package/dist/types/components/internal/Loading/Loading.d.ts +1 -0
  105. package/dist/types/components/internal/Select/SelectMenu.d.ts +1 -1
  106. package/dist/types/components/internal/icons/IconOpayWallet.d.ts +2 -0
  107. package/dist/types/components/internal/icons/IconPagaWallet.d.ts +2 -0
  108. package/dist/types/components/internal/icons/IconPicPay.d.ts +2 -0
  109. package/dist/types/components/internal/icons/IconPix.d.ts +2 -0
  110. package/dist/types/components/internal/icons/IconVietqr.d.ts +2 -0
  111. package/dist/types/components/internal/icons/IconVietqrComplete.d.ts +2 -0
  112. package/dist/types/components/internal/icons/index.d.ts +6 -0
  113. package/dist/types/components/wallets/OpayWallet/OpayWallet.d.ts +10 -0
  114. package/dist/types/components/wallets/OpayWallet/index.d.ts +2 -0
  115. package/dist/types/components/wallets/OpayWallet/type.d.ts +40 -0
  116. package/dist/types/components/wallets/PagaWallet/PagaWallet.d.ts +10 -0
  117. package/dist/types/components/wallets/PagaWallet/index.d.ts +2 -0
  118. package/dist/types/components/wallets/PagaWallet/type.d.ts +40 -0
  119. package/dist/types/components/wallets/PicPay/PicPay.d.ts +10 -0
  120. package/dist/types/components/wallets/PicPay/index.d.ts +2 -0
  121. package/dist/types/components/wallets/PicPay/type.d.ts +40 -0
  122. package/dist/types/components/wallets/Pix/Pix.d.ts +10 -0
  123. package/dist/types/components/wallets/Pix/index.d.ts +2 -0
  124. package/dist/types/components/wallets/Pix/type.d.ts +40 -0
  125. package/dist/types/components/wallets/Vietqr/Vietqr.d.ts +10 -0
  126. package/dist/types/components/wallets/Vietqr/index.d.ts +2 -0
  127. package/dist/types/components/wallets/Vietqr/type.d.ts +39 -0
  128. package/dist/types/components/wallets/index.d.ts +8 -0
  129. package/dist/types/components/wallets/type.d.ts +9 -0
  130. package/dist/types/constant.d.ts +11 -1
  131. package/dist/types/core/checkout.d.ts +4 -0
  132. package/dist/types/core/index.d.ts +1 -0
  133. package/dist/types/core/session.d.ts +1 -11
  134. package/dist/types/core/theme.d.ts +7 -0
  135. package/dist/types/i18n/locales/de-DE.d.ts +6 -0
  136. package/dist/types/i18n/locales/en-GB.d.ts +6 -0
  137. package/dist/types/i18n/locales/es-ES.d.ts +6 -0
  138. package/dist/types/i18n/locales/fr-FR.d.ts +6 -0
  139. package/dist/types/i18n/locales/ja-JP.d.ts +6 -0
  140. package/dist/types/i18n/locales/ko-KR.d.ts +6 -0
  141. package/dist/types/i18n/locales/nl-NL.d.ts +6 -0
  142. package/dist/types/i18n/locales/pt-PT.d.ts +6 -0
  143. package/dist/types/i18n/locales/ru-RU.d.ts +6 -0
  144. package/dist/types/i18n/locales/zh-CN.d.ts +6 -0
  145. package/dist/types/i18n/locales/zh-HK.d.ts +6 -0
  146. package/dist/types/i18n/locales/zh-TW.d.ts +6 -0
  147. package/dist/types/types/message.d.ts +29 -25
  148. package/dist/types/utils/index.d.ts +3 -2
  149. package/dist/types/utils/object.d.ts +7 -0
  150. package/dist/types/utils/string.d.ts +1 -0
  151. package/dist/types/utils/style.d.ts +1 -1
  152. package/dist/types/utils/system-info/is-ua-webview.d.ts +1 -1
  153. package/dist/types/utils/theme.d.ts +4 -0
  154. package/package.json +67 -67
  155. package/dist/es/utils/deep-freeze.js +0 -13
  156. package/dist/es/utils/obj.js +0 -22
  157. package/dist/types/utils/deep-freeze.d.ts +0 -1
  158. package/dist/types/utils/obj.d.ts +0 -6
@@ -0,0 +1,346 @@
1
+ import { w, F, A, h, y, q, u, b } from "../../../core.js";
2
+ import { useBEM } from "../../../hooks/useBEM.js";
3
+ import { CoreContext } from "../../../core/context.js";
4
+ import "../../../utils/card-brand/brands.js";
5
+ import "../../../utils/system-info/get-browser-info.js";
6
+ import { normalizedClass, formatAmount } from "../../../utils/format.js";
7
+ import { redirectToPayment } from "../../../utils/redirect.js";
8
+ import { formatPaymentResult } from "../../../utils/payment.js";
9
+ import { isTimeoutError } from "../../../api/http.js";
10
+ import { getBrowserParams } from "../../../api/modules/get-browser-params.js";
11
+ import { PaymentCategory, COMMON_CLASS_NAME, PaymentMethod, SessionMode } from "../../../constant.js";
12
+ import { getPicPayInfo, picPay } from "../../../api/modules/pic-pay/index.js";
13
+ import { PayKKaError } from "../../../core/error.js";
14
+ import { usePayState } from "../../../hooks/usePayState.js";
15
+ import { useRetry } from "../../../hooks/useRetry.js";
16
+ import { createEmailCore, EmailField } from "../../EmailField/EmailField.js";
17
+ import { SubmitButton } from "../../SubmitButton/index.js";
18
+ import { GuideCard } from "../../GuideCard/index.js";
19
+ import { AddressField } from "../../AddressField/index.js";
20
+ import { Info } from "../../internal/Info/Info.js";
21
+ import "../../internal/Form/type.js";
22
+ import "../../internal/Form/context.js";
23
+ import "../../internal/Form/FormItem.js";
24
+ import { Form } from "../../internal/Form/Form.js";
25
+ import "./pic-pay.js";
26
+ const { bem } = useBEM("pic-pay");
27
+ const fieldClassNames = bem("field");
28
+ const PicPay = w((props, ref) => {
29
+ const {
30
+ session,
31
+ showEmail = false,
32
+ showAddress = false,
33
+ core,
34
+ redirectMode = "auto",
35
+ autoQuery = true,
36
+ showGuideCard = true,
37
+ hidePaymentButton = false
38
+ } = props;
39
+ F(ref, () => ({
40
+ stopRetry: () => {
41
+ setSubmitButtonStatus("unSubmit");
42
+ stopReFetchPayInfo();
43
+ },
44
+ startRetry: (timeout) => {
45
+ setSubmitButtonStatus("loading");
46
+ startReFetchPayInfo({ timeout });
47
+ },
48
+ updateAddress: () => {
49
+ var _a;
50
+ if (!(fieldStatus == null ? void 0 : fieldStatus.address.show))
51
+ return;
52
+ const newForm = Object.assign(form, { address: addressCore.getAddressState() });
53
+ setForm(newForm);
54
+ (_a = addressFieldRef.current) == null ? void 0 : _a.update(addressCore.getAddressState());
55
+ validateForm();
56
+ },
57
+ updateEmail: () => {
58
+ var _a;
59
+ if (!(fieldStatus == null ? void 0 : fieldStatus.email.show))
60
+ return;
61
+ const newForm = Object.assign(form, { email: emailState.email });
62
+ setForm(newForm);
63
+ (_a = emailFieldRef.current) == null ? void 0 : _a.update(emailState.email);
64
+ validateForm();
65
+ },
66
+ payment: () => {
67
+ hidePaymentButton && onSubmit();
68
+ }
69
+ }));
70
+ const addressCore = core.getAddressCore();
71
+ const emailState = createEmailCore();
72
+ const addressFieldRef = A(null);
73
+ const emailFieldRef = A(null);
74
+ const [isCheckoutEnabled, setIsCheckoutEnabled] = h(false);
75
+ const { setErrorMsg, i18n, errorMsg, sessionReady } = usePayState(session, props.core);
76
+ const [submitButtonStatus, setSubmitButtonStatus] = h("unSubmit");
77
+ const formRef = A(null);
78
+ const [form, setForm] = h({
79
+ email: "",
80
+ address: {
81
+ country: void 0,
82
+ province: void 0,
83
+ city: void 0,
84
+ area: void 0,
85
+ postCode: void 0,
86
+ address1: void 0,
87
+ address2: void 0
88
+ }
89
+ });
90
+ const [validated, setValidated] = h(false);
91
+ const [fieldStatus, setFieldStatus] = h();
92
+ const initFieldStatus = () => {
93
+ const { field, sessionMode } = session.checkout;
94
+ const { email, address } = field;
95
+ if (sessionMode === SessionMode.COMPONENT) {
96
+ if (email.disabled) {
97
+ email.show = showEmail;
98
+ }
99
+ if (showAddress && !(address == null ? void 0 : address.show)) {
100
+ address.show = true;
101
+ }
102
+ }
103
+ setFieldStatus({ ...field });
104
+ };
105
+ const processOnSuccess = (res) => {
106
+ var _a, _b;
107
+ setSubmitButtonStatus("success");
108
+ (_b = props.onSuccess) == null ? void 0 : _b.call(props, formatPaymentResult({
109
+ ...res,
110
+ returnUrl: (_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.returnUrl
111
+ }));
112
+ };
113
+ y(() => {
114
+ if (!sessionReady) {
115
+ return;
116
+ }
117
+ const { bill = {}, supportMethods = [], country } = (session == null ? void 0 : session.checkout) || {};
118
+ if (!supportMethods.includes(PaymentMethod.PIC_PAY)) {
119
+ return;
120
+ }
121
+ initFieldStatus();
122
+ setIsCheckoutEnabled(true);
123
+ country && addressCore.setCountry(country);
124
+ form.email = bill.email ?? "";
125
+ form.address.country = country;
126
+ if (autoQuery && core.processingPaymentMethod === PaymentMethod.PIC_PAY) {
127
+ setSubmitButtonStatus("loading");
128
+ startReFetchPayInfo();
129
+ }
130
+ }, [sessionReady]);
131
+ const processOnError = (error) => {
132
+ var _a;
133
+ (_a = props.onError) == null ? void 0 : _a.call(props, error);
134
+ core.resetEnablePaymentMethod();
135
+ };
136
+ const onTimeout = q(
137
+ (message) => {
138
+ var _a;
139
+ setErrorMsg(message || i18n.get("common.payTimeout"));
140
+ setSubmitButtonStatus("unSubmit");
141
+ (_a = props.onTimeout) == null ? void 0 : _a.call(props);
142
+ core.resetEnablePaymentMethod();
143
+ },
144
+ [i18n, props.onTimeout]
145
+ );
146
+ const { start: startReFetchPayInfo, stop: stopReFetchPayInfo } = useRetry(
147
+ (timeout) => pay(true, timeout),
148
+ { onTimeout: () => onTimeout(i18n.get("common.queryTimeout")) }
149
+ );
150
+ const getPaymentParams = async () => {
151
+ return {
152
+ sessionId: session.sessionId,
153
+ clientKey: session.clientKey,
154
+ payment: {
155
+ paymentMethod: PaymentMethod.PIC_PAY
156
+ },
157
+ bill: {
158
+ email: form.email,
159
+ addressLine1: form.address.address1,
160
+ addressLine2: form.address.address2,
161
+ postalCode: form.address.postCode,
162
+ country: form.address.country,
163
+ district: form.address.area,
164
+ state: form.address.province ? addressCore.getLabel(form.address.province, addressCore.getProvinceOption()) ?? form.address.province : void 0,
165
+ city: form.address.city ? addressCore.getLabel(form.address.city, addressCore.getCityOptions()) ?? form.address.city : void 0
166
+ },
167
+ browser: await getBrowserParams()
168
+ };
169
+ };
170
+ const pay = async (search = false, timeout) => {
171
+ var _a, _b, _c, _d, _e, _f, _g;
172
+ try {
173
+ const requestOptions = { locale: i18n.locale, timeout };
174
+ let res = null;
175
+ if (search) {
176
+ const extraParams = (_b = (_a = core.config)._getExtraParams) == null ? void 0 : _b.call(_a, "query", PaymentMethod.PIC_PAY);
177
+ res = await getPicPayInfo(
178
+ {
179
+ sessionId: session.sessionId,
180
+ clientKey: session.clientKey,
181
+ paymentMethod: PaymentMethod.PIC_PAY
182
+ },
183
+ extraParams,
184
+ requestOptions
185
+ );
186
+ } else {
187
+ const extraParams = (_d = (_c = core.config)._getExtraParams) == null ? void 0 : _d.call(_c, "payment", PaymentMethod.PIC_PAY);
188
+ res = await picPay(await getPaymentParams(), extraParams, requestOptions);
189
+ }
190
+ !search && ((_e = props.onSubmitResponse) == null ? void 0 : _e.call(props, res));
191
+ const { status, orderStatus, errorMessage, errorCode, payInfo, sessionId } = res;
192
+ sessionId && (session.sessionId = sessionId);
193
+ if (status === "PROCESSING") {
194
+ if (!orderStatus) {
195
+ setSubmitButtonStatus("unSubmit");
196
+ return { end: true };
197
+ } else if (orderStatus === "SUCCESS") {
198
+ processOnSuccess(res);
199
+ return { end: true };
200
+ } else if (orderStatus === "FAILURE") {
201
+ errorMessage && setErrorMsg(errorMessage);
202
+ setSubmitButtonStatus("unSubmit");
203
+ processOnError(new PayKKaError("API_ERROR", errorMessage, { code: errorCode }));
204
+ return { end: true };
205
+ } else if (orderStatus === "PROCESSING") {
206
+ if (!search) {
207
+ if (redirectMode === "auto" && payInfo) {
208
+ redirectToPayment(payInfo);
209
+ return { end: true };
210
+ } else {
211
+ startReFetchPayInfo();
212
+ }
213
+ }
214
+ return { end: false };
215
+ } else if (orderStatus === "CANCELED") {
216
+ setSubmitButtonStatus("unSubmit");
217
+ (_f = props.onTimeout) == null ? void 0 : _f.call(props);
218
+ core.resetEnablePaymentMethod();
219
+ return { end: true };
220
+ }
221
+ } else if (status === "SUCCESS") {
222
+ processOnSuccess(res);
223
+ return { end: true };
224
+ } else if (status === "EXPIRED") {
225
+ setSubmitButtonStatus("unSubmit");
226
+ (_g = props.onExpired) == null ? void 0 : _g.call(props);
227
+ return { end: true };
228
+ }
229
+ setSubmitButtonStatus("unSubmit");
230
+ return { end: true };
231
+ } catch (error) {
232
+ if (isTimeoutError(error)) {
233
+ if (search) {
234
+ return { end: false };
235
+ } else {
236
+ onTimeout();
237
+ return { end: true };
238
+ }
239
+ } else {
240
+ const message = error.i18nKey ? i18n.get(error.i18nKey) : error.message;
241
+ message && setErrorMsg(message);
242
+ processOnError(new PayKKaError("API_ERROR", message, { code: error.code, cause: error }));
243
+ setSubmitButtonStatus("unSubmit");
244
+ return { end: true };
245
+ }
246
+ }
247
+ };
248
+ const validateForm = () => {
249
+ var _a;
250
+ (_a = formRef.current) == null ? void 0 : _a.validate(void 0, false).then(() => {
251
+ setValidated(true);
252
+ }).catch(() => {
253
+ setValidated(false);
254
+ });
255
+ };
256
+ y(() => {
257
+ validateForm();
258
+ }, [form]);
259
+ const onSubmit = async () => {
260
+ var _a;
261
+ setErrorMsg("");
262
+ (_a = formRef.current) == null ? void 0 : _a.validate(async (errors) => {
263
+ var _a2;
264
+ (fieldStatus == null ? void 0 : fieldStatus.address.show) && addressCore.setValidateAllFields(true);
265
+ (_a2 = props.onSubmit) == null ? void 0 : _a2.call(props, errors);
266
+ if (errors) {
267
+ setSubmitButtonStatus("unSubmit");
268
+ return;
269
+ }
270
+ setErrorMsg("");
271
+ setSubmitButtonStatus("loading");
272
+ await pay();
273
+ });
274
+ };
275
+ const setFormRef = (dom) => {
276
+ formRef.current = dom;
277
+ dom && validateForm();
278
+ };
279
+ const Button = () => {
280
+ var _a;
281
+ const transAmount = (_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.transAmount;
282
+ const amountText = (transAmount == null ? void 0 : transAmount.amount) ? formatAmount(transAmount).jointSymbol() : "";
283
+ const text = i18n.get("common.pay") + (amountText ? ` ${amountText}` : "");
284
+ return /* @__PURE__ */ u(
285
+ SubmitButton,
286
+ {
287
+ className: bem("button"),
288
+ status: submitButtonStatus,
289
+ text,
290
+ loadingText: i18n.get("common.payProcessing"),
291
+ successText: i18n.get("common.paySuccess"),
292
+ onClick: onSubmit,
293
+ verified: validated
294
+ }
295
+ );
296
+ };
297
+ const Email = () => {
298
+ return /* @__PURE__ */ u(b, { children: (fieldStatus == null ? void 0 : fieldStatus.email.show) && /* @__PURE__ */ u("div", { className: fieldClassNames, children: /* @__PURE__ */ u(
299
+ EmailField,
300
+ {
301
+ ref: emailFieldRef,
302
+ value: form.email,
303
+ disabled: fieldStatus == null ? void 0 : fieldStatus.email.disabled
304
+ }
305
+ ) }) });
306
+ };
307
+ const ErrorMessage = () => {
308
+ return /* @__PURE__ */ u(b, { children: !!errorMsg && /* @__PURE__ */ u(Info, { content: errorMsg }) });
309
+ };
310
+ const Address = () => {
311
+ var _a, _b;
312
+ return /* @__PURE__ */ u(b, { children: (fieldStatus == null ? void 0 : fieldStatus.address.show) && /* @__PURE__ */ u("div", { className: fieldClassNames, children: /* @__PURE__ */ u(
313
+ AddressField,
314
+ {
315
+ ref: addressFieldRef,
316
+ value: form.address,
317
+ country: ((_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.country) || ((_b = session == null ? void 0 : session.checkout) == null ? void 0 : _b.bill.country),
318
+ onAddressChange: (value) => setForm(Object.assign(form, { address: value }))
319
+ }
320
+ ) }) });
321
+ };
322
+ return /* @__PURE__ */ u(
323
+ CoreContext.Provider,
324
+ {
325
+ value: {
326
+ i18n,
327
+ session,
328
+ core
329
+ },
330
+ children: isCheckoutEnabled && i18n.ready.value && /* @__PURE__ */ u("div", { className: core.theme.className, children: [
331
+ showGuideCard && /* @__PURE__ */ u(GuideCard, { type: PaymentCategory.PIC_PAY }),
332
+ /* @__PURE__ */ u(Form, { form, ref: setFormRef, onFormChange: (form2) => setForm(form2), children: /* @__PURE__ */ u("div", { className: normalizedClass(COMMON_CLASS_NAME, bem()), children: [
333
+ Email(),
334
+ Address(),
335
+ /* @__PURE__ */ u("div", { className: bem("footer-wrapper"), children: [
336
+ ErrorMessage(),
337
+ !hidePaymentButton && Button()
338
+ ] })
339
+ ] }) })
340
+ ] })
341
+ }
342
+ );
343
+ });
344
+ export {
345
+ PicPay
346
+ };
@@ -0,0 +1 @@
1
+ import "./PicPay.js";
@@ -0,0 +1,346 @@
1
+ import { w, F, A, h, y, q, u, b } from "../../../core.js";
2
+ import { useBEM } from "../../../hooks/useBEM.js";
3
+ import { CoreContext } from "../../../core/context.js";
4
+ import "../../../utils/card-brand/brands.js";
5
+ import "../../../utils/system-info/get-browser-info.js";
6
+ import { normalizedClass, formatAmount } from "../../../utils/format.js";
7
+ import { redirectToPayment } from "../../../utils/redirect.js";
8
+ import { formatPaymentResult } from "../../../utils/payment.js";
9
+ import { isTimeoutError } from "../../../api/http.js";
10
+ import { getBrowserParams } from "../../../api/modules/get-browser-params.js";
11
+ import { PaymentCategory, COMMON_CLASS_NAME, PaymentMethod, SessionMode } from "../../../constant.js";
12
+ import { getPixPayInfo, pixPay } from "../../../api/modules/pix/index.js";
13
+ import { PayKKaError } from "../../../core/error.js";
14
+ import { usePayState } from "../../../hooks/usePayState.js";
15
+ import { useRetry } from "../../../hooks/useRetry.js";
16
+ import { createEmailCore, EmailField } from "../../EmailField/EmailField.js";
17
+ import { SubmitButton } from "../../SubmitButton/index.js";
18
+ import { GuideCard } from "../../GuideCard/index.js";
19
+ import { AddressField } from "../../AddressField/index.js";
20
+ import { Info } from "../../internal/Info/Info.js";
21
+ import "../../internal/Form/type.js";
22
+ import "../../internal/Form/context.js";
23
+ import "../../internal/Form/FormItem.js";
24
+ import { Form } from "../../internal/Form/Form.js";
25
+ import "./pix2.js";
26
+ const { bem } = useBEM("pix");
27
+ const fieldClassNames = bem("field");
28
+ const Pix = w((props, ref) => {
29
+ const {
30
+ session,
31
+ showEmail = false,
32
+ showAddress = false,
33
+ core,
34
+ redirectMode = "auto",
35
+ autoQuery = true,
36
+ showGuideCard = true,
37
+ hidePaymentButton = false
38
+ } = props;
39
+ F(ref, () => ({
40
+ stopRetry: () => {
41
+ setSubmitButtonStatus("unSubmit");
42
+ stopReFetchPayInfo();
43
+ },
44
+ startRetry: (timeout) => {
45
+ setSubmitButtonStatus("loading");
46
+ startReFetchPayInfo({ timeout });
47
+ },
48
+ updateAddress: () => {
49
+ var _a;
50
+ if (!(fieldStatus == null ? void 0 : fieldStatus.address.show))
51
+ return;
52
+ const newForm = Object.assign(form, { address: addressCore.getAddressState() });
53
+ setForm(newForm);
54
+ (_a = addressFieldRef.current) == null ? void 0 : _a.update(addressCore.getAddressState());
55
+ validateForm();
56
+ },
57
+ updateEmail: () => {
58
+ var _a;
59
+ if (!(fieldStatus == null ? void 0 : fieldStatus.email.show))
60
+ return;
61
+ const newForm = Object.assign(form, { email: emailState.email });
62
+ setForm(newForm);
63
+ (_a = emailFieldRef.current) == null ? void 0 : _a.update(emailState.email);
64
+ validateForm();
65
+ },
66
+ payment: () => {
67
+ hidePaymentButton && onSubmit();
68
+ }
69
+ }));
70
+ const addressCore = core.getAddressCore();
71
+ const emailState = createEmailCore();
72
+ const addressFieldRef = A(null);
73
+ const emailFieldRef = A(null);
74
+ const [isCheckoutEnabled, setIsCheckoutEnabled] = h(false);
75
+ const { setErrorMsg, i18n, errorMsg, sessionReady } = usePayState(session, props.core);
76
+ const [submitButtonStatus, setSubmitButtonStatus] = h("unSubmit");
77
+ const formRef = A(null);
78
+ const [form, setForm] = h({
79
+ email: "",
80
+ address: {
81
+ country: void 0,
82
+ province: void 0,
83
+ city: void 0,
84
+ area: void 0,
85
+ postCode: void 0,
86
+ address1: void 0,
87
+ address2: void 0
88
+ }
89
+ });
90
+ const [validated, setValidated] = h(false);
91
+ const [fieldStatus, setFieldStatus] = h();
92
+ const initFieldStatus = () => {
93
+ const { field, sessionMode } = session.checkout;
94
+ const { email, address } = field;
95
+ if (sessionMode === SessionMode.COMPONENT) {
96
+ if (email.disabled) {
97
+ email.show = showEmail;
98
+ }
99
+ if (showAddress && !(address == null ? void 0 : address.show)) {
100
+ address.show = true;
101
+ }
102
+ }
103
+ setFieldStatus({ ...field });
104
+ };
105
+ const processOnSuccess = (res) => {
106
+ var _a, _b;
107
+ setSubmitButtonStatus("success");
108
+ (_b = props.onSuccess) == null ? void 0 : _b.call(props, formatPaymentResult({
109
+ ...res,
110
+ returnUrl: (_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.returnUrl
111
+ }));
112
+ };
113
+ y(() => {
114
+ if (!sessionReady) {
115
+ return;
116
+ }
117
+ const { bill = {}, supportMethods = [], country } = (session == null ? void 0 : session.checkout) || {};
118
+ if (!supportMethods.includes(PaymentMethod.PIX)) {
119
+ return;
120
+ }
121
+ initFieldStatus();
122
+ setIsCheckoutEnabled(true);
123
+ country && addressCore.setCountry(country);
124
+ form.email = bill.email ?? "";
125
+ form.address.country = country;
126
+ if (autoQuery && core.processingPaymentMethod === PaymentMethod.PIX) {
127
+ setSubmitButtonStatus("loading");
128
+ startReFetchPayInfo();
129
+ }
130
+ }, [sessionReady]);
131
+ const processOnError = (error) => {
132
+ var _a;
133
+ (_a = props.onError) == null ? void 0 : _a.call(props, error);
134
+ core.resetEnablePaymentMethod();
135
+ };
136
+ const onTimeout = q(
137
+ (message) => {
138
+ var _a;
139
+ setErrorMsg(message || i18n.get("common.payTimeout"));
140
+ setSubmitButtonStatus("unSubmit");
141
+ (_a = props.onTimeout) == null ? void 0 : _a.call(props);
142
+ core.resetEnablePaymentMethod();
143
+ },
144
+ [i18n, props.onTimeout]
145
+ );
146
+ const { start: startReFetchPayInfo, stop: stopReFetchPayInfo } = useRetry(
147
+ (timeout) => pay(true, timeout),
148
+ { onTimeout: () => onTimeout(i18n.get("common.queryTimeout")) }
149
+ );
150
+ const getPaymentParams = async () => {
151
+ return {
152
+ sessionId: session.sessionId,
153
+ clientKey: session.clientKey,
154
+ payment: {
155
+ paymentMethod: PaymentMethod.PIX
156
+ },
157
+ bill: {
158
+ email: form.email,
159
+ addressLine1: form.address.address1,
160
+ addressLine2: form.address.address2,
161
+ postalCode: form.address.postCode,
162
+ country: form.address.country,
163
+ district: form.address.area,
164
+ state: form.address.province ? addressCore.getLabel(form.address.province, addressCore.getProvinceOption()) ?? form.address.province : void 0,
165
+ city: form.address.city ? addressCore.getLabel(form.address.city, addressCore.getCityOptions()) ?? form.address.city : void 0
166
+ },
167
+ browser: await getBrowserParams()
168
+ };
169
+ };
170
+ const pay = async (search = false, timeout) => {
171
+ var _a, _b, _c, _d, _e, _f, _g;
172
+ try {
173
+ const requestOptions = { locale: i18n.locale, timeout };
174
+ let res = null;
175
+ if (search) {
176
+ const extraParams = (_b = (_a = core.config)._getExtraParams) == null ? void 0 : _b.call(_a, "query", PaymentMethod.PIX);
177
+ res = await getPixPayInfo(
178
+ {
179
+ sessionId: session.sessionId,
180
+ clientKey: session.clientKey,
181
+ paymentMethod: PaymentMethod.PIX
182
+ },
183
+ extraParams,
184
+ requestOptions
185
+ );
186
+ } else {
187
+ const extraParams = (_d = (_c = core.config)._getExtraParams) == null ? void 0 : _d.call(_c, "payment", PaymentMethod.PIX);
188
+ res = await pixPay(await getPaymentParams(), extraParams, requestOptions);
189
+ }
190
+ !search && ((_e = props.onSubmitResponse) == null ? void 0 : _e.call(props, res));
191
+ const { status, orderStatus, errorMessage, errorCode, payInfo, sessionId } = res;
192
+ sessionId && (session.sessionId = sessionId);
193
+ if (status === "PROCESSING") {
194
+ if (!orderStatus) {
195
+ setSubmitButtonStatus("unSubmit");
196
+ return { end: true };
197
+ } else if (orderStatus === "SUCCESS") {
198
+ processOnSuccess(res);
199
+ return { end: true };
200
+ } else if (orderStatus === "FAILURE") {
201
+ errorMessage && setErrorMsg(errorMessage);
202
+ setSubmitButtonStatus("unSubmit");
203
+ processOnError(new PayKKaError("API_ERROR", errorMessage, { code: errorCode }));
204
+ return { end: true };
205
+ } else if (orderStatus === "PROCESSING") {
206
+ if (!search) {
207
+ if (redirectMode === "auto" && payInfo) {
208
+ redirectToPayment(payInfo);
209
+ return { end: true };
210
+ } else {
211
+ startReFetchPayInfo();
212
+ }
213
+ }
214
+ return { end: false };
215
+ } else if (orderStatus === "CANCELED") {
216
+ setSubmitButtonStatus("unSubmit");
217
+ (_f = props.onTimeout) == null ? void 0 : _f.call(props);
218
+ core.resetEnablePaymentMethod();
219
+ return { end: true };
220
+ }
221
+ } else if (status === "SUCCESS") {
222
+ processOnSuccess(res);
223
+ return { end: true };
224
+ } else if (status === "EXPIRED") {
225
+ setSubmitButtonStatus("unSubmit");
226
+ (_g = props.onExpired) == null ? void 0 : _g.call(props);
227
+ return { end: true };
228
+ }
229
+ setSubmitButtonStatus("unSubmit");
230
+ return { end: true };
231
+ } catch (error) {
232
+ if (isTimeoutError(error)) {
233
+ if (search) {
234
+ return { end: false };
235
+ } else {
236
+ onTimeout();
237
+ return { end: true };
238
+ }
239
+ } else {
240
+ const message = error.i18nKey ? i18n.get(error.i18nKey) : error.message;
241
+ message && setErrorMsg(message);
242
+ processOnError(new PayKKaError("API_ERROR", message, { code: error.code, cause: error }));
243
+ setSubmitButtonStatus("unSubmit");
244
+ return { end: true };
245
+ }
246
+ }
247
+ };
248
+ const validateForm = () => {
249
+ var _a;
250
+ (_a = formRef.current) == null ? void 0 : _a.validate(void 0, false).then(() => {
251
+ setValidated(true);
252
+ }).catch(() => {
253
+ setValidated(false);
254
+ });
255
+ };
256
+ y(() => {
257
+ validateForm();
258
+ }, [form]);
259
+ const onSubmit = async () => {
260
+ var _a;
261
+ setErrorMsg("");
262
+ (_a = formRef.current) == null ? void 0 : _a.validate(async (errors) => {
263
+ var _a2;
264
+ (fieldStatus == null ? void 0 : fieldStatus.address.show) && addressCore.setValidateAllFields(true);
265
+ (_a2 = props.onSubmit) == null ? void 0 : _a2.call(props, errors);
266
+ if (errors) {
267
+ setSubmitButtonStatus("unSubmit");
268
+ return;
269
+ }
270
+ setErrorMsg("");
271
+ setSubmitButtonStatus("loading");
272
+ await pay();
273
+ });
274
+ };
275
+ const setFormRef = (dom) => {
276
+ formRef.current = dom;
277
+ dom && validateForm();
278
+ };
279
+ const Button = () => {
280
+ var _a;
281
+ const transAmount = (_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.transAmount;
282
+ const amountText = (transAmount == null ? void 0 : transAmount.amount) ? formatAmount(transAmount).jointSymbol() : "";
283
+ const text = i18n.get("common.pay") + (amountText ? ` ${amountText}` : "");
284
+ return /* @__PURE__ */ u(
285
+ SubmitButton,
286
+ {
287
+ className: bem("button"),
288
+ status: submitButtonStatus,
289
+ text,
290
+ loadingText: i18n.get("common.payProcessing"),
291
+ successText: i18n.get("common.paySuccess"),
292
+ onClick: onSubmit,
293
+ verified: validated
294
+ }
295
+ );
296
+ };
297
+ const Email = () => {
298
+ return /* @__PURE__ */ u(b, { children: (fieldStatus == null ? void 0 : fieldStatus.email.show) && /* @__PURE__ */ u("div", { className: fieldClassNames, children: /* @__PURE__ */ u(
299
+ EmailField,
300
+ {
301
+ ref: emailFieldRef,
302
+ value: form.email,
303
+ disabled: fieldStatus == null ? void 0 : fieldStatus.email.disabled
304
+ }
305
+ ) }) });
306
+ };
307
+ const ErrorMessage = () => {
308
+ return /* @__PURE__ */ u(b, { children: !!errorMsg && /* @__PURE__ */ u(Info, { content: errorMsg }) });
309
+ };
310
+ const Address = () => {
311
+ var _a, _b;
312
+ return /* @__PURE__ */ u(b, { children: (fieldStatus == null ? void 0 : fieldStatus.address.show) && /* @__PURE__ */ u("div", { className: fieldClassNames, children: /* @__PURE__ */ u(
313
+ AddressField,
314
+ {
315
+ ref: addressFieldRef,
316
+ value: form.address,
317
+ country: ((_a = session == null ? void 0 : session.checkout) == null ? void 0 : _a.country) || ((_b = session == null ? void 0 : session.checkout) == null ? void 0 : _b.bill.country),
318
+ onAddressChange: (value) => setForm(Object.assign(form, { address: value }))
319
+ }
320
+ ) }) });
321
+ };
322
+ return /* @__PURE__ */ u(
323
+ CoreContext.Provider,
324
+ {
325
+ value: {
326
+ i18n,
327
+ session,
328
+ core
329
+ },
330
+ children: isCheckoutEnabled && i18n.ready.value && /* @__PURE__ */ u("div", { className: core.theme.className, children: [
331
+ showGuideCard && /* @__PURE__ */ u(GuideCard, { type: PaymentCategory.PIX }),
332
+ /* @__PURE__ */ u(Form, { form, ref: setFormRef, onFormChange: (form2) => setForm(form2), children: /* @__PURE__ */ u("div", { className: normalizedClass(COMMON_CLASS_NAME, bem()), children: [
333
+ Email(),
334
+ Address(),
335
+ /* @__PURE__ */ u("div", { className: bem("footer-wrapper"), children: [
336
+ ErrorMessage(),
337
+ !hidePaymentButton && Button()
338
+ ] })
339
+ ] }) })
340
+ ] })
341
+ }
342
+ );
343
+ });
344
+ export {
345
+ Pix
346
+ };