From 5efa3913f5dbd9b77e77df779ee97e924d96e49c Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Mon, 23 Mar 2026 17:28:15 +0530 Subject: [PATCH 1/6] feat: pix automatio --- src/Components/Loader.res | 40 ++++- src/Components/PaymentLoader.res | 7 +- src/LocaleStrings/ArabicLocale.res | 2 + src/LocaleStrings/CatalanLocale.res | 2 + src/LocaleStrings/ChineseLocale.res | 2 + src/LocaleStrings/DeutschLocale.res | 2 + src/LocaleStrings/DutchLocale.res | 2 + src/LocaleStrings/EnglishGBLocale.res | 2 + src/LocaleStrings/EnglishLocale.res | 2 + src/LocaleStrings/FrenchBelgiumLocale.res | 2 + src/LocaleStrings/FrenchLocale.res | 2 + src/LocaleStrings/HebrewLocale.res | 2 + src/LocaleStrings/ItalianLocale.res | 2 + src/LocaleStrings/JapaneseLocale.res | 2 + src/LocaleStrings/LocaleStringTypes.res | 2 + src/LocaleStrings/PolishLocale.res | 2 + src/LocaleStrings/PortugueseLocale.res | 2 + src/LocaleStrings/RussianLocale.res | 2 + src/LocaleStrings/SpanishLocale.res | 2 + src/LocaleStrings/SwedishLocale.res | 2 + .../TraditionalChineseLocale.res | 2 + src/Payments/PaymentMethodsRecord.res | 14 ++ src/Types/HyperLoggerTypes.res | 1 + src/Types/PaymentConfirmTypes.res | 25 +++ src/Utilities/DynamicFieldsUtils.res | 2 + src/Utilities/LoggerUtils.res | 1 + src/Utilities/PaymentHelpers.res | 160 +++++++++++++++--- src/hyper-log-catcher/HyperLogger.res | 1 + 28 files changed, 261 insertions(+), 28 deletions(-) diff --git a/src/Components/Loader.res b/src/Components/Loader.res index 4186c62ab..36bb76d1b 100644 --- a/src/Components/Loader.res +++ b/src/Components/Loader.res @@ -1,7 +1,39 @@ +type loaderPaymentMethod = + | PixAutomaticoPush + | Other + +type loaderTextConfig = { + title: string, + subtitle: string, +} + +let parsePaymentMethod = methodString => { + switch methodString { + | "pix_automatico_push" => PixAutomaticoPush + | _ => Other + } +} + +let getLoaderTextConfig = (paymentMethod: loaderPaymentMethod) => { + switch paymentMethod { + | PixAutomaticoPush => { + title: "Please confirm the payment in your banking app", + subtitle: "Open your banking application and authorize the payment request. The status will be updated automatically once confirmed.", + } + | Other => { + title: "We are processing your payment...", + subtitle: "You have been redirected to new tab to complete your payments. Status will be updated automatically", + } + } +} + @react.component -let make = (~branding="auto", ~showText=true) => { +let make = (~branding="auto", ~showText=true, ~paymentMethod="") => { let arr = ["hyperswitch-triangle", "hyperswitch-square", "hyperswitch-circle"] + let parsedPaymentMethod = parsePaymentMethod(paymentMethod) + let textConfig = getLoaderTextConfig(parsedPaymentMethod) +
@@ -33,12 +65,10 @@ let make = (~branding="auto", ~showText=true) => {
- {React.string("We are processing your payment...")} + {React.string(textConfig.title)}
- {React.string( - "You have been redirected to new tab to complete your payments. Status will be updated automatically", - )} + {React.string(textConfig.subtitle)}
diff --git a/src/Components/PaymentLoader.res b/src/Components/PaymentLoader.res index 481bcc189..37bc4e7a1 100644 --- a/src/Components/PaymentLoader.res +++ b/src/Components/PaymentLoader.res @@ -2,6 +2,7 @@ let make = () => { open Utils let (branding, setBranding) = React.useState(_ => "auto") + let (paymentMethod, setPaymentMethod) = React.useState(_ => "") React.useEffect0(() => { messageParentWindow([("iframeMountedCallback", true->JSON.Encode.bool)]) @@ -12,6 +13,10 @@ let make = () => { if dict->getDictFromDict("options")->getOptionString("branding")->Option.isSome { setBranding(_ => dict->getDictFromDict("options")->getString("branding", "auto")) } + let metadata = dict->getJsonObjectFromDict("metadata") + let metaDataDict = metadata->JSON.Decode.object->Option.getOr(Dict.make()) + let paymentMethodStr = metaDataDict->getString("paymentMethod", "") + setPaymentMethod(_ => paymentMethodStr) } } Window.addEventListener("message", handle) @@ -25,7 +30,7 @@ let make = () => {
- +
} diff --git a/src/LocaleStrings/ArabicLocale.res b/src/LocaleStrings/ArabicLocale.res index f77f758d9..4cda8dd18 100644 --- a/src/LocaleStrings/ArabicLocale.res +++ b/src/LocaleStrings/ArabicLocale.res @@ -230,6 +230,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `الخدمات المصرفية المفتوحة`, payment_methods_evoucher: `قسيمة إلكترونية`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix تلقائي QR`, + payment_methods_pix_automatico_push: `Pix تلقائي Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `باي بال`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/CatalanLocale.res b/src/LocaleStrings/CatalanLocale.res index 39a2a90a6..ae30e61b2 100644 --- a/src/LocaleStrings/CatalanLocale.res +++ b/src/LocaleStrings/CatalanLocale.res @@ -229,6 +229,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Bancaire ouvert`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automàtic QR`, + payment_methods_pix_automatico_push: `Pix Automàtic Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/ChineseLocale.res b/src/LocaleStrings/ChineseLocale.res index be3597b23..409d37d5f 100644 --- a/src/LocaleStrings/ChineseLocale.res +++ b/src/LocaleStrings/ChineseLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `开放银行`, payment_methods_evoucher: `电子代金券`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix 自动 QR`, + payment_methods_pix_automatico_push: `Pix 自动推送`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `银联`, diff --git a/src/LocaleStrings/DeutschLocale.res b/src/LocaleStrings/DeutschLocale.res index 2e7de5f96..ff98d30e3 100644 --- a/src/LocaleStrings/DeutschLocale.res +++ b/src/LocaleStrings/DeutschLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatisch QR`, + payment_methods_pix_automatico_push: `Pix Automatisch Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/DutchLocale.res b/src/LocaleStrings/DutchLocale.res index 25a877aee..f773767c7 100644 --- a/src/LocaleStrings/DutchLocale.res +++ b/src/LocaleStrings/DutchLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatisch QR`, + payment_methods_pix_automatico_push: `Pix Automatisch Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/EnglishGBLocale.res b/src/LocaleStrings/EnglishGBLocale.res index 7d47c9e31..e65cd29d2 100644 --- a/src/LocaleStrings/EnglishGBLocale.res +++ b/src/LocaleStrings/EnglishGBLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatic QR`, + payment_methods_pix_automatico_push: `Pix Automatic Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/EnglishLocale.res b/src/LocaleStrings/EnglishLocale.res index cb32cdbd9..d2af42caf 100644 --- a/src/LocaleStrings/EnglishLocale.res +++ b/src/LocaleStrings/EnglishLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatic QR`, + payment_methods_pix_automatico_push: `Pix Automatic Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/FrenchBelgiumLocale.res b/src/LocaleStrings/FrenchBelgiumLocale.res index 33fc7f208..aeefec76b 100644 --- a/src/LocaleStrings/FrenchBelgiumLocale.res +++ b/src/LocaleStrings/FrenchBelgiumLocale.res @@ -229,6 +229,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatique QR`, + payment_methods_pix_automatico_push: `Pix Automatique Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/FrenchLocale.res b/src/LocaleStrings/FrenchLocale.res index 14790272a..500d85054 100644 --- a/src/LocaleStrings/FrenchLocale.res +++ b/src/LocaleStrings/FrenchLocale.res @@ -229,6 +229,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatique QR`, + payment_methods_pix_automatico_push: `Pix Automatique Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/HebrewLocale.res b/src/LocaleStrings/HebrewLocale.res index fe3d39da7..1ca9cb90b 100644 --- a/src/LocaleStrings/HebrewLocale.res +++ b/src/LocaleStrings/HebrewLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `בנקאות פתוחה`, payment_methods_evoucher: `שובר אלקטרוני`, payment_methods_pix_transfer: `פיקס`, + payment_methods_pix_automatico_qr: `פיקס אוטומטי QR`, + payment_methods_pix_automatico_push: `פיקס אוטומטי Push`, payment_methods_boleto: `בולטו`, payment_methods_paypal: `פייפאל`, payment_methods_local_bank_transfer_transfer: `יוניון פיי`, diff --git a/src/LocaleStrings/ItalianLocale.res b/src/LocaleStrings/ItalianLocale.res index cb4584d94..9fe81b7a7 100644 --- a/src/LocaleStrings/ItalianLocale.res +++ b/src/LocaleStrings/ItalianLocale.res @@ -229,6 +229,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatico QR`, + payment_methods_pix_automatico_push: `Pix Automatico Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/JapaneseLocale.res b/src/LocaleStrings/JapaneseLocale.res index 5c3c38d1d..bfa27a06a 100644 --- a/src/LocaleStrings/JapaneseLocale.res +++ b/src/LocaleStrings/JapaneseLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `オープンバンキング`, payment_methods_evoucher: `電子バウチャー`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix 自動 QR`, + payment_methods_pix_automatico_push: `Pix 自動プッシュ`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/LocaleStringTypes.res b/src/LocaleStrings/LocaleStringTypes.res index ee83e7a6c..3fcb28cfa 100644 --- a/src/LocaleStrings/LocaleStringTypes.res +++ b/src/LocaleStrings/LocaleStringTypes.res @@ -216,6 +216,8 @@ type localeStrings = { payment_methods_open_banking_pis: string, payment_methods_evoucher: string, payment_methods_pix_transfer: string, + payment_methods_pix_automatico_qr: string, + payment_methods_pix_automatico_push: string, payment_methods_boleto: string, payment_methods_paypal: string, payment_methods_local_bank_transfer_transfer: string, diff --git a/src/LocaleStrings/PolishLocale.res b/src/LocaleStrings/PolishLocale.res index 514d737be..ec3d7f30f 100644 --- a/src/LocaleStrings/PolishLocale.res +++ b/src/LocaleStrings/PolishLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatyczny QR`, + payment_methods_pix_automatico_push: `Pix Automatyczny Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/PortugueseLocale.res b/src/LocaleStrings/PortugueseLocale.res index 30ada9aa5..353b5fefa 100644 --- a/src/LocaleStrings/PortugueseLocale.res +++ b/src/LocaleStrings/PortugueseLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automático QR`, + payment_methods_pix_automatico_push: `Pix Automático Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/RussianLocale.res b/src/LocaleStrings/RussianLocale.res index c9fe91adb..6dd2528ee 100644 --- a/src/LocaleStrings/RussianLocale.res +++ b/src/LocaleStrings/RussianLocale.res @@ -236,6 +236,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Автоматический QR`, + payment_methods_pix_automatico_push: `Pix Автоматический Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/SpanishLocale.res b/src/LocaleStrings/SpanishLocale.res index 82f87dd88..b310cced8 100644 --- a/src/LocaleStrings/SpanishLocale.res +++ b/src/LocaleStrings/SpanishLocale.res @@ -228,6 +228,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Banca abierta`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automático QR`, + payment_methods_pix_automatico_push: `Pix Automático Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/SwedishLocale.res b/src/LocaleStrings/SwedishLocale.res index 661c65ecd..186595522 100644 --- a/src/LocaleStrings/SwedishLocale.res +++ b/src/LocaleStrings/SwedishLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `Open Banking`, payment_methods_evoucher: `E-Voucher`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix Automatisk QR`, + payment_methods_pix_automatico_push: `Pix Automatisk Push`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `Union Pay`, diff --git a/src/LocaleStrings/TraditionalChineseLocale.res b/src/LocaleStrings/TraditionalChineseLocale.res index 288ec6548..36643775a 100644 --- a/src/LocaleStrings/TraditionalChineseLocale.res +++ b/src/LocaleStrings/TraditionalChineseLocale.res @@ -227,6 +227,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { payment_methods_open_banking_pis: `開放銀行`, payment_methods_evoucher: `電子禮券`, payment_methods_pix_transfer: `Pix`, + payment_methods_pix_automatico_qr: `Pix 自動 QR`, + payment_methods_pix_automatico_push: `Pix 自動推送`, payment_methods_boleto: `Boleto`, payment_methods_paypal: `Paypal`, payment_methods_local_bank_transfer_transfer: `銀聯`, diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index 98adba98f..820b9ce7b 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -593,6 +593,13 @@ let getPaymentMethodsFields = (~localeString: LocaleStringTypes.localeStrings) = fields: [InfoElement], miniIcon: Some(icon("cash_voucher", ~size=19)), }, + { + paymentMethodName: "pix_automatico_push_transfer", + fields: [InfoElement], + icon: Some(icon("pix", ~size=26, ~width=40)), + displayName: localeString.payment_methods_pix_automatico_push, + miniIcon: None, + }, { paymentMethodName: "pix_transfer", fields: [InfoElement], @@ -600,6 +607,13 @@ let getPaymentMethodsFields = (~localeString: LocaleStringTypes.localeStrings) = displayName: localeString.payment_methods_pix_transfer, miniIcon: None, }, + { + paymentMethodName: "pix_automatico_qr_transfer", + fields: [InfoElement], + icon: Some(icon("pix", ~size=26, ~width=40)), + displayName: localeString.payment_methods_pix_automatico_qr, + miniIcon: None, + }, { paymentMethodName: "boleto", icon: Some(icon("boleto", ~size=21, ~width=25)), diff --git a/src/Types/HyperLoggerTypes.res b/src/Types/HyperLoggerTypes.res index 80820f318..612ecd267 100644 --- a/src/Types/HyperLoggerTypes.res +++ b/src/Types/HyperLoggerTypes.res @@ -61,6 +61,7 @@ type eventName = | REDIRECTING_USER | DISPLAY_BANK_TRANSFER_INFO_PAGE | DISPLAY_QR_CODE_INFO_PAGE + | DISPLAY_WAIT_SCREEN | DISPLAY_VOUCHER | DISPLAY_THREE_DS_SDK | THREE_DS_METHOD diff --git a/src/Types/PaymentConfirmTypes.res b/src/Types/PaymentConfirmTypes.res index 0fa37776c..7a637271f 100644 --- a/src/Types/PaymentConfirmTypes.res +++ b/src/Types/PaymentConfirmTypes.res @@ -33,6 +33,11 @@ type voucherDetails = { reference: string, } +type pollConfig = { + delay_in_secs: int, + frequency: int, +} + type nextAction = { redirectToUrl: string, popupUrl: string, @@ -49,6 +54,7 @@ type nextAction = { display_text: option, border_color: option, iframe_data: option, + poll_config: option, } type intent = { nextAction: nextAction, @@ -66,6 +72,11 @@ let defaultRedirectTourl = { returnUrl: "", url: "", } +let defaultPollConfig = { + delay_in_secs: 2, + frequency: 0, +} + let defaultNextAction = { redirectToUrl: "", popupUrl: "", @@ -82,6 +93,7 @@ let defaultNextAction = { display_text: None, border_color: None, iframe_data: None, + poll_config: None, } let defaultIntent = { nextAction: defaultNextAction, @@ -139,6 +151,13 @@ let getVoucherDetails = json => { } } +let getPollConfig = json => { + { + delay_in_secs: json->getInt("delay_in_secs", 2), + frequency: json->getInt("frequency", 0), + } +} + let getNextAction = (dict, str) => { dict ->Dict.get(str) @@ -182,6 +201,12 @@ let getNextAction = (dict, str) => { display_text: json->getOptionString("display_text"), border_color: json->getOptionString("border_color"), iframe_data: Some(json->Utils.getJsonObjectFromDict("iframe_data")), + poll_config: { + json + ->Dict.get("poll_config") + ->Option.flatMap(JSON.Decode.object) + ->Option.map(json => json->getPollConfig) + }, } }) ->Option.getOr(defaultNextAction) diff --git a/src/Utilities/DynamicFieldsUtils.res b/src/Utilities/DynamicFieldsUtils.res index ab309e69e..1d5360bbb 100644 --- a/src/Utilities/DynamicFieldsUtils.res +++ b/src/Utilities/DynamicFieldsUtils.res @@ -13,6 +13,8 @@ let dynamicFieldsEnabledPaymentMethods = [ "ideal", "sofort", "pix_transfer", + "pix_automatico_push_transfer", + "pix_automatico_qr_transfer", "giropay", "local_bank_transfer_transfer", "afterpay_clearpay", diff --git a/src/Utilities/LoggerUtils.res b/src/Utilities/LoggerUtils.res index a7a3b52c5..695bdb309 100644 --- a/src/Utilities/LoggerUtils.res +++ b/src/Utilities/LoggerUtils.res @@ -304,6 +304,7 @@ let apiEventInitMapper = (eventName: HyperLoggerTypes.eventName): option< | REDIRECTING_USER | DISPLAY_BANK_TRANSFER_INFO_PAGE | DISPLAY_QR_CODE_INFO_PAGE + | DISPLAY_WAIT_SCREEN | DISPLAY_VOUCHER | DISPLAY_THREE_DS_SDK | THREE_DS_METHOD diff --git a/src/Utilities/PaymentHelpers.res b/src/Utilities/PaymentHelpers.res index 213e2b185..d6dfc477c 100644 --- a/src/Utilities/PaymentHelpers.res +++ b/src/Utilities/PaymentHelpers.res @@ -171,26 +171,62 @@ let rec pollRetrievePaymentIntent = ( ~customPodUri, ~isForceSync=false, ~sdkAuthorization=None, + ~delayInMs=2000, + ~endTimestamp=None, ) => { open Promise - retrievePaymentIntent( - clientSecret, - ~headers, - ~publishableKey, - ~logger, - ~customPodUri, - ~isForceSync, - ~sdkAuthorization, - ) - ->then(json => { - let dict = json->getDictFromJson - let status = dict->getString("status", "") - if status === "succeeded" || status === "failed" { - resolve(json) + switch endTimestamp { + | Some(timestamp) => + let currentTime = Date.now() *. 1000000.0 // convert to nanoseconds + if currentTime >= timestamp { + retrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ) + ->then(json => resolve(json)) + ->catch(_ => resolve(JSON.Encode.null)) } else { - delay(2000) - ->then(_val => { + retrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ) + ->then(json => { + let dict = json->getDictFromJson + let status = dict->getString("status", "") + + if status === "succeeded" || status === "failed" { + resolve(json) + } else { + delay(delayInMs) + ->then(_val => { + pollRetrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ~delayInMs, + ~endTimestamp=Some(timestamp), + ) + }) + ->catch(_ => Promise.resolve(JSON.Encode.null)) + } + }) + ->catch(e => { + Console.error2("Unable to retrieve payment due to following error", e) pollRetrievePaymentIntent( clientSecret, ~headers, @@ -199,14 +235,13 @@ let rec pollRetrievePaymentIntent = ( ~customPodUri, ~isForceSync, ~sdkAuthorization, + ~delayInMs, + ~endTimestamp=Some(timestamp), ) }) - ->catch(_ => Promise.resolve(JSON.Encode.null)) } - }) - ->catch(e => { - Console.error2("Unable to retrieve payment due to following error", e) - pollRetrievePaymentIntent( + | None => + retrievePaymentIntent( clientSecret, ~headers, ~publishableKey, @@ -215,7 +250,43 @@ let rec pollRetrievePaymentIntent = ( ~isForceSync, ~sdkAuthorization, ) - }) + ->then(json => { + let dict = json->getDictFromJson + let status = dict->getString("status", "") + + if status === "succeeded" || status === "failed" { + resolve(json) + } else { + delay(delayInMs) + ->then(_val => { + pollRetrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ~delayInMs, + ) + }) + ->catch(_ => Promise.resolve(JSON.Encode.null)) + } + }) + ->catch(e => { + Console.error2("Unable to retrieve payment due to following error", e) + pollRetrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ~delayInMs, + ) + }) + } } let retrieveStatus = async (~publishableKey, ~customPodUri, pollID, logger, ~sdkAuthorization) => { @@ -817,6 +888,51 @@ let rec intentCall = ( ("nextActionData", nextActionData), ]->getJsonFromArrayOfJson resolve(response) + } else if intent.nextAction.type_ === "wait_screen_information" { + let displayToTimestamp = intent.nextAction.display_to_timestamp->Option.getOr(0.0) + let pollConfig = + intent.nextAction.poll_config->Option.getOr({delay_in_secs: 2, frequency: 0}) + let headersDict = headers->Dict.fromArray + + handleLogging(~optLogger, ~value="", ~eventName=DISPLAY_WAIT_SCREEN, ~paymentMethod) + + if !isPaymentSession { + let metaData = + [("paymentMethod", paymentMethod->JSON.Encode.string)]->getJsonFromArrayOfJson + messageParentWindow([ + ("fullscreen", true->JSON.Encode.bool), + ("param", `paymentloader`->JSON.Encode.string), + ("iframeId", iframeId->JSON.Encode.string), + ("metadata", metaData), + ]) + + pollRetrievePaymentIntent( + clientSecret, + ~headers=headersDict, + ~publishableKey=confirmParam.publishableKey, + ~logger=optLogger->Option.getOr(LoggerUtils.defaultLoggerConfig), + ~customPodUri, + ~sdkAuthorization, + ~delayInMs=pollConfig.delay_in_secs * 1000, + ~endTimestamp=Some(displayToTimestamp), + ) + ->Promise.then( + retrievedData => { + closePaymentLoaderIfAny() + postSubmitResponse(~jsonData=retrievedData, ~url=url.href) + Promise.resolve() + }, + ) + ->Promise.catch( + _ => { + closePaymentLoaderIfAny() + postSubmitResponse(~jsonData=data, ~url=url.href) + Promise.resolve() + }, + ) + ->ignore + } + resolve(data) } else { if !isPaymentSession { postFailedSubmitResponse( diff --git a/src/hyper-log-catcher/HyperLogger.res b/src/hyper-log-catcher/HyperLogger.res index 4c0cfa3c0..393d2d4a3 100644 --- a/src/hyper-log-catcher/HyperLogger.res +++ b/src/hyper-log-catcher/HyperLogger.res @@ -221,6 +221,7 @@ let make = (~sessionId=?, ~source: source, ~clientSecret=?, ~merchantId=?, ~meta REDIRECTING_USER, DISPLAY_BANK_TRANSFER_INFO_PAGE, DISPLAY_QR_CODE_INFO_PAGE, + DISPLAY_WAIT_SCREEN, DISPLAY_VOUCHER, LOADER_CHANGED, PAYMENT_METHODS_CALL, From f85da1aa61929f00e3e8718c1f79189ad97aa439 Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Fri, 3 Apr 2026 21:21:50 +0530 Subject: [PATCH 2/6] refactor: apply suggested changes --- src/Components/DynamicFields.res | 58 +++++++++++++++++++ src/Components/PixPaymentInput.res | 23 +++++++- src/LocaleStrings/ArabicLocale.res | 2 + src/LocaleStrings/CatalanLocale.res | 2 + src/LocaleStrings/ChineseLocale.res | 2 + src/LocaleStrings/DeutschLocale.res | 2 + src/LocaleStrings/DutchLocale.res | 2 + src/LocaleStrings/EnglishGBLocale.res | 2 + src/LocaleStrings/EnglishLocale.res | 2 + src/LocaleStrings/FrenchBelgiumLocale.res | 2 + src/LocaleStrings/FrenchLocale.res | 2 + src/LocaleStrings/HebrewLocale.res | 2 + src/LocaleStrings/ItalianLocale.res | 2 + src/LocaleStrings/JapaneseLocale.res | 2 + src/LocaleStrings/LocaleStringTypes.res | 2 + src/LocaleStrings/PolishLocale.res | 2 + src/LocaleStrings/PortugueseLocale.res | 2 + src/LocaleStrings/RussianLocale.res | 2 + src/LocaleStrings/SpanishLocale.res | 2 + src/LocaleStrings/SwedishLocale.res | 2 + .../TraditionalChineseLocale.res | 2 + src/Payments/PaymentMethodsRecord.res | 4 ++ src/Utilities/DynamicFieldsUtils.res | 22 +++++++ src/Utilities/PaymentHelpers.res | 6 +- src/Utilities/RecoilAtoms.res | 2 + 25 files changed, 149 insertions(+), 4 deletions(-) diff --git a/src/Components/DynamicFields.res b/src/Components/DynamicFields.res index d600d63e8..4e1934b32 100644 --- a/src/Components/DynamicFields.res +++ b/src/Components/DynamicFields.res @@ -157,12 +157,16 @@ let make = ( let cityRef = React.useRef(Nullable.null) let bankAccountNumberRef = React.useRef(Nullable.null) let sourceBankAccountIdRef = React.useRef(Nullable.null) + let branchCodeRef = React.useRef(Nullable.null) + let bankIdentifierRef = React.useRef(Nullable.null) let postalRef = React.useRef(Nullable.null) let (selectedBank, setSelectedBank) = Recoil.useRecoilState(userBank) let (country, setCountry) = Recoil.useRecoilState(userCountry) let (bankAccountNumber, setBankAccountNumber) = Recoil.useRecoilState(userBankAccountNumber) let (sourceBankAccountId, setSourceBankAccountId) = Recoil.useRecoilState(sourceBankAccountId) + let (branchCode, setBranchCode) = Recoil.useRecoilState(userBranchCode) + let (bankIdentifier, setBankIdentifier) = Recoil.useRecoilState(userBankIdentifier) let countryList = CountryStateDataRefs.countryDataRef.contents let stateNames = getStateNames({ value: country, @@ -527,6 +531,58 @@ let make = ( inputRef=sourceBankAccountIdRef placeholder="DE00 0000 0000 0000 0000 00" /> + | BranchCode => + { + let value = ReactEvent.Form.target(ev)["value"] + setBranchCode(_ => { + isValid: Some(value !== ""), + value, + errorString: value !== "" ? "" : localeString.branchCodeEmptyText, + }) + }} + onBlur={ev => { + let value = ReactEvent.Focus.target(ev)["value"] + setBranchCode(prev => { + ...prev, + isValid: Some(value !== ""), + }) + }} + type_="text" + name="branchCode" + maxLength=20 + inputRef=branchCodeRef + placeholder="" + /> + | BankIdentifier => + { + let value = ReactEvent.Form.target(ev)["value"] + setBankIdentifier(_ => { + isValid: Some(value !== ""), + value, + errorString: value !== "" ? "" : localeString.bankIdentifierEmptyText, + }) + }} + onBlur={ev => { + let value = ReactEvent.Focus.target(ev)["value"] + setBankIdentifier(prev => { + ...prev, + isValid: Some(value !== ""), + }) + }} + type_="text" + name="bankIdentifier" + maxLength=20 + inputRef=bankIdentifierRef + placeholder="" + /> | DocumentNumber | Email | InfoElement @@ -837,6 +893,8 @@ let make = ( | BankAccountNumber | IBAN | SourceBankAccountId + | BranchCode + | BankIdentifier | None => React.null }} diff --git a/src/Components/PixPaymentInput.res b/src/Components/PixPaymentInput.res index 17512eee9..884cd416c 100644 --- a/src/Components/PixPaymentInput.res +++ b/src/Components/PixPaymentInput.res @@ -8,6 +8,9 @@ let make = (~fieldType="") => { let (pixCPF, setPixCPF) = Recoil.useRecoilState(userPixCPF) let (pixKey, setPixKey) = Recoil.useRecoilState(userPixKey) let (sourceBankAccountId, setSourceBankAccountId) = Recoil.useRecoilState(sourceBankAccountId) + let (bankAccountNumber, setBankAccountNumber) = Recoil.useRecoilState(userBankAccountNumber) + let (branchCode, setBranchCode) = Recoil.useRecoilState(userBranchCode) + let (bankIdentifier, setBankIdentifier) = Recoil.useRecoilState(userBankIdentifier) let inputRef = React.useRef(Nullable.null) let validatePixKey = (val): RecoilAtomTypes.field => @@ -129,8 +132,26 @@ let make = (~fieldType="") => { errorString: localeString.sourceBankAccountIdEmptyText, }) } + if bankAccountNumber.value == "" { + setBankAccountNumber(prev => { + ...prev, + errorString: localeString.ibanEmptyText, + }) + } + if branchCode.value == "" { + setBranchCode(prev => { + ...prev, + errorString: localeString.branchCodeEmptyText, + }) + } + if bankIdentifier.value == "" { + setBankIdentifier(prev => { + ...prev, + errorString: localeString.bankIdentifierEmptyText, + }) + } } - }, [pixCNPJ.value, pixKey.value, pixCPF.value]) + }, [pixCNPJ.value, pixKey.value, pixCPF.value, sourceBankAccountId.value, bankAccountNumber.value, branchCode.value, bankIdentifier.value]) useSubmitPaymentData(submitCallback) diff --git a/src/LocaleStrings/ArabicLocale.res b/src/LocaleStrings/ArabicLocale.res index 4cda8dd18..0665f47ae 100644 --- a/src/LocaleStrings/ArabicLocale.res +++ b/src/LocaleStrings/ArabicLocale.res @@ -164,6 +164,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `أدخل مفتاح Pix`, pixKeyLabel: `مفتاح Pix`, sourceBankAccountIdEmptyText: `لا يمكن أن يكون معرف الحساب المصرفي المصدر فارغاً`, + branchCodeEmptyText: `لا يمكن أن يكون رمز الفرع فارغاً`, + bankIdentifierEmptyText: `لا يمكن أن يكون معرف البنك فارغاً`, invalidCardHolderNameError: `اسم حامل البطاقة لا يمكن أن يحتوي على أرقام`, invalidNickNameError: `لا يمكن أن يحتوي الاسم المستعار على أكثر من رقمين`, expiry: `انتهاء الصلاحية`, diff --git a/src/LocaleStrings/CatalanLocale.res b/src/LocaleStrings/CatalanLocale.res index ae30e61b2..7dac28c4c 100644 --- a/src/LocaleStrings/CatalanLocale.res +++ b/src/LocaleStrings/CatalanLocale.res @@ -163,6 +163,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Introdueix la clau Pix`, pixKeyLabel: `Clau Pix`, sourceBankAccountIdEmptyText: `L'identificador del compte bancari d'origen no pot estar buit`, + branchCodeEmptyText: `El codi de sucursal no pot estar buit`, + bankIdentifierEmptyText: `L'identificador bancari no pot estar buit`, invalidCardHolderNameError: `El nom del titular de la targeta no pot contenir dígits`, invalidNickNameError: `El sobrenom no pot contenir més de 2 dígits`, expiry: `caducitat`, diff --git a/src/LocaleStrings/ChineseLocale.res b/src/LocaleStrings/ChineseLocale.res index 409d37d5f..e6254784c 100644 --- a/src/LocaleStrings/ChineseLocale.res +++ b/src/LocaleStrings/ChineseLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `输入 Pix 密钥`, pixKeyLabel: `Pix 密钥`, sourceBankAccountIdEmptyText: `源银行账户ID不能为空`, + branchCodeEmptyText: `支行代码不能为空`, + bankIdentifierEmptyText: `银行标识符不能为空`, invalidCardHolderNameError: `持卡人姓名不能包含数字`, invalidNickNameError: `昵称不能包含超过2个数字`, expiry: `到期`, diff --git a/src/LocaleStrings/DeutschLocale.res b/src/LocaleStrings/DeutschLocale.res index ff98d30e3..fddae55ba 100644 --- a/src/LocaleStrings/DeutschLocale.res +++ b/src/LocaleStrings/DeutschLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Geben Sie den Pix-Schlüssel ein`, pixKeyLabel: `Pix-Schlüssel`, sourceBankAccountIdEmptyText: `Quell-Bankkonten-ID darf nicht leer sein`, + branchCodeEmptyText: `Bankleitzahl darf nicht leer sein`, + bankIdentifierEmptyText: `Bankkennung darf nicht leer sein`, invalidCardHolderNameError: `Der Name des Karteninhabers darf keine Ziffern enthalten`, invalidNickNameError: `Der Spitzname darf nicht mehr als 2 Ziffern enthalten`, expiry: `ablauf`, diff --git a/src/LocaleStrings/DutchLocale.res b/src/LocaleStrings/DutchLocale.res index f773767c7..93c202bcf 100644 --- a/src/LocaleStrings/DutchLocale.res +++ b/src/LocaleStrings/DutchLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Voer Pix-sleutel in`, pixKeyLabel: `Pix-sleutel`, sourceBankAccountIdEmptyText: `Bron bankrekeningnummer mag niet leeg zijn`, + branchCodeEmptyText: `Bankfiliaalkode mag niet leeg zijn`, + bankIdentifierEmptyText: `Bankidentificatie mag niet leeg zijn`, invalidCardHolderNameError: `De naam van de kaarthouder mag geen cijfers bevatten`, invalidNickNameError: `De bijnaam mag niet meer dan 2 cijfers bevatten`, expiry: `vervaldatum`, diff --git a/src/LocaleStrings/EnglishGBLocale.res b/src/LocaleStrings/EnglishGBLocale.res index e65cd29d2..cf384e7c9 100644 --- a/src/LocaleStrings/EnglishGBLocale.res +++ b/src/LocaleStrings/EnglishGBLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Enter Pix key`, pixKeyLabel: `Pix key`, sourceBankAccountIdEmptyText: `Source Bank Account ID cannot be empty`, + branchCodeEmptyText: `Branch Code cannot be empty`, + bankIdentifierEmptyText: `Bank Identifier cannot be empty`, invalidCardHolderNameError: `Cardholder's name cannot contain digits`, invalidNickNameError: `Nickname cannot have more than 2 digits`, expiry: `expiry`, diff --git a/src/LocaleStrings/EnglishLocale.res b/src/LocaleStrings/EnglishLocale.res index d2af42caf..cbb3e92d6 100644 --- a/src/LocaleStrings/EnglishLocale.res +++ b/src/LocaleStrings/EnglishLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Enter Pix key`, pixKeyLabel: `Pix key`, sourceBankAccountIdEmptyText: `Source Bank Account ID cannot be empty`, + branchCodeEmptyText: `Branch Code cannot be empty`, + bankIdentifierEmptyText: `Bank Identifier cannot be empty`, invalidCardHolderNameError: `Card Holder's name cannot have digits`, invalidNickNameError: `Nickname cannot have more than 2 digits`, expiry: `expiry`, diff --git a/src/LocaleStrings/FrenchBelgiumLocale.res b/src/LocaleStrings/FrenchBelgiumLocale.res index aeefec76b..b6ceee79d 100644 --- a/src/LocaleStrings/FrenchBelgiumLocale.res +++ b/src/LocaleStrings/FrenchBelgiumLocale.res @@ -163,6 +163,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Entrez la clé Pix`, pixKeyLabel: `Clé Pix`, sourceBankAccountIdEmptyText: `L'identifiant du compte bancaire source ne peut pas être vide`, + branchCodeEmptyText: `Le code de la succursale ne peut pas être vide`, + bankIdentifierEmptyText: `L'identifiant bancaire ne peut pas être vide`, invalidCardHolderNameError: `Le nom du titulaire de la carte ne peut pas contenir de chiffres`, invalidNickNameError: `Le surnom ne peut pas contenir plus de 2 chiffres`, expiry: `expiration`, diff --git a/src/LocaleStrings/FrenchLocale.res b/src/LocaleStrings/FrenchLocale.res index 500d85054..df0b330e8 100644 --- a/src/LocaleStrings/FrenchLocale.res +++ b/src/LocaleStrings/FrenchLocale.res @@ -163,6 +163,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Entrez la clé Pix`, pixKeyLabel: `Clé Pix`, sourceBankAccountIdEmptyText: `L'identifiant du compte bancaire source ne peut pas être vide`, + branchCodeEmptyText: `Le code de la succursale ne peut pas être vide`, + bankIdentifierEmptyText: `L'identifiant bancaire ne peut pas être vide`, invalidCardHolderNameError: `Le nom du titulaire de la carte ne peut pas contenir de chiffres`, invalidNickNameError: `Le surnom ne peut pas contenir plus de 2 chiffres`, expiry: `expiration`, diff --git a/src/LocaleStrings/HebrewLocale.res b/src/LocaleStrings/HebrewLocale.res index 1ca9cb90b..f81267fa9 100644 --- a/src/LocaleStrings/HebrewLocale.res +++ b/src/LocaleStrings/HebrewLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `הכנס מפתח Pix`, pixKeyLabel: `מפתח Pix`, sourceBankAccountIdEmptyText: `מזהה חשבון בנק מקור לא יכול להיות ריק`, + branchCodeEmptyText: `קוד סניף לא יכול להיות ריק`, + bankIdentifierEmptyText: `מזהה בנק לא יכול להיות ריק`, invalidCardHolderNameError: `שם בעל הכרטיס לא יכול לכלול ספרות`, invalidNickNameError: `הכינוי לא יכול לכלול יותר משתי ספרות`, expiry: `תְפוּגָה`, diff --git a/src/LocaleStrings/ItalianLocale.res b/src/LocaleStrings/ItalianLocale.res index 9fe81b7a7..d45521a01 100644 --- a/src/LocaleStrings/ItalianLocale.res +++ b/src/LocaleStrings/ItalianLocale.res @@ -163,6 +163,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Inserisci la chiave Pix`, pixKeyLabel: `Chiave Pix`, sourceBankAccountIdEmptyText: `L'ID del conto bancario di origine non può essere vuoto`, + branchCodeEmptyText: `Il codice di filiale non può essere vuoto`, + bankIdentifierEmptyText: `L'identificatore bancario non può essere vuoto`, invalidCardHolderNameError: `Il nome del titolare della carta non può contenere cifre`, invalidNickNameError: `Il soprannome non può contenere più di 2 cifre`, expiry: `scadenza`, diff --git a/src/LocaleStrings/JapaneseLocale.res b/src/LocaleStrings/JapaneseLocale.res index bfa27a06a..d541bdc00 100644 --- a/src/LocaleStrings/JapaneseLocale.res +++ b/src/LocaleStrings/JapaneseLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Pixキーを入力`, pixKeyLabel: `Pixキー`, sourceBankAccountIdEmptyText: `送金元銀行口座IDを入力してください`, + branchCodeEmptyText: `支店コードを入力してください`, + bankIdentifierEmptyText: `銀行識別子を入力してください`, invalidCardHolderNameError: `カード所有者の名前に数字を含めることはできません`, invalidNickNameError: `ニックネームには2つ以上の数字を含めることはできません`, expiry: `有効期限`, diff --git a/src/LocaleStrings/LocaleStringTypes.res b/src/LocaleStrings/LocaleStringTypes.res index 3fcb28cfa..216596b2b 100644 --- a/src/LocaleStrings/LocaleStringTypes.res +++ b/src/LocaleStrings/LocaleStringTypes.res @@ -150,6 +150,8 @@ type localeStrings = { pixKeyLabel: string, pixKeyPlaceholder: string, sourceBankAccountIdEmptyText: string, + branchCodeEmptyText: string, + bankIdentifierEmptyText: string, invalidCardHolderNameError: string, invalidNickNameError: string, expiry: string, diff --git a/src/LocaleStrings/PolishLocale.res b/src/LocaleStrings/PolishLocale.res index ec3d7f30f..e3686e133 100644 --- a/src/LocaleStrings/PolishLocale.res +++ b/src/LocaleStrings/PolishLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Wprowadź klucz Pix`, pixKeyLabel: `Klucz Pix`, sourceBankAccountIdEmptyText: `Identyfikator źródłowego konta bankowego nie może być pusty`, + branchCodeEmptyText: `Kod oddziału nie może być pusty`, + bankIdentifierEmptyText: `Identyfikator banku nie może być pusty`, invalidCardHolderNameError: `Imię posiadacza karty nie może zawierać cyfr`, invalidNickNameError: `Pseudonim nie może zawierać więcej niż 2 cyfry`, expiry: `wygaśnięcie`, diff --git a/src/LocaleStrings/PortugueseLocale.res b/src/LocaleStrings/PortugueseLocale.res index 353b5fefa..77723a738 100644 --- a/src/LocaleStrings/PortugueseLocale.res +++ b/src/LocaleStrings/PortugueseLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Digite a chave Pix`, pixKeyLabel: `Chave Pix`, sourceBankAccountIdEmptyText: `O ID da conta bancária de origem não pode estar vazio`, + branchCodeEmptyText: `O código de agência não pode estar vazio`, + bankIdentifierEmptyText: `O identificador bancário não pode estar vazio`, invalidCardHolderNameError: `O nome do titular do cartão não pode conter dígitos`, invalidNickNameError: `O apelido não pode conter mais de 2 dígitos`, expiry: `termo`, diff --git a/src/LocaleStrings/RussianLocale.res b/src/LocaleStrings/RussianLocale.res index 6dd2528ee..3aeff9d3b 100644 --- a/src/LocaleStrings/RussianLocale.res +++ b/src/LocaleStrings/RussianLocale.res @@ -170,6 +170,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Введите ключ Pix`, pixKeyLabel: `Ключ Pix`, sourceBankAccountIdEmptyText: `Идентификатор исходного банковского счета не может быть пустым`, + branchCodeEmptyText: `Код отделения не может быть пустым`, + bankIdentifierEmptyText: `Идентификатор банка не может быть пустым`, invalidCardHolderNameError: `Имя владельца карты не может содержать цифры`, invalidNickNameError: `Псевдоним не может содержать более 2 цифр`, expiry: `истечение срока действия`, diff --git a/src/LocaleStrings/SpanishLocale.res b/src/LocaleStrings/SpanishLocale.res index b310cced8..20db50548 100644 --- a/src/LocaleStrings/SpanishLocale.res +++ b/src/LocaleStrings/SpanishLocale.res @@ -162,6 +162,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Introduce la clave Pix`, pixKeyLabel: `Clave Pix`, sourceBankAccountIdEmptyText: `El ID de la cuenta bancaria de origen no puede estar vacío`, + branchCodeEmptyText: `El código de sucursal no puede estar vacío`, + bankIdentifierEmptyText: `El identificador bancario no puede estar vacío`, invalidCardHolderNameError: `El nombre del titular de la tarjeta no puede contener dígitos`, invalidNickNameError: `El apodo no puede contener más de 2 dígitos`, expiry: `expiración`, diff --git a/src/LocaleStrings/SwedishLocale.res b/src/LocaleStrings/SwedishLocale.res index 186595522..845fd1ed9 100644 --- a/src/LocaleStrings/SwedishLocale.res +++ b/src/LocaleStrings/SwedishLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `Ange Pix-nyckel`, pixKeyLabel: `Pix-nyckel`, sourceBankAccountIdEmptyText: `Käll bankkonto-ID kan inte vara tomt`, + branchCodeEmptyText: `Bankfilialskod kan inte vara tom`, + bankIdentifierEmptyText: `Bankidentifierare kan inte vara tom`, invalidCardHolderNameError: `Kortinnehavarens namn får inte innehålla siffror`, invalidNickNameError: `Smeknamnet får inte innehålla mer än 2 siffror`, expiry: `upphörande`, diff --git a/src/LocaleStrings/TraditionalChineseLocale.res b/src/LocaleStrings/TraditionalChineseLocale.res index 36643775a..404d6146f 100644 --- a/src/LocaleStrings/TraditionalChineseLocale.res +++ b/src/LocaleStrings/TraditionalChineseLocale.res @@ -161,6 +161,8 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyPlaceholder: `輸入 Pix 金鑰`, pixKeyLabel: `Pix 金鑰`, sourceBankAccountIdEmptyText: `來源銀行帳戶ID不能為空`, + branchCodeEmptyText: `分行代碼不能為空`, + bankIdentifierEmptyText: `銀行識別碼不能為空`, invalidCardHolderNameError: `持卡人姓名不能包含數字`, invalidNickNameError: `暱稱不能包含超過兩個數字`, expiry: `到期`, diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index 820b9ce7b..ace5dd9e6 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -68,6 +68,8 @@ type paymentMethodsFields = | BankAccountNumber | IBAN | SourceBankAccountId + | BranchCode + | BankIdentifier | GiftCardNumber | GiftCardPin @@ -736,6 +738,8 @@ let getPaymentMethodsFieldTypeFromString = (str, isBancontact) => { | ("user_bank_account_number", _) => BankAccountNumber | ("user_iban", _) => BankAccountNumber | ("user_source_bank_account_id", _) => SourceBankAccountId + | ("user_branch_code", _) => BranchCode + | ("user_bank_identifier", _) => BankIdentifier | ("user_social_security_number", _) => DocumentNumber | _ => None } diff --git a/src/Utilities/DynamicFieldsUtils.res b/src/Utilities/DynamicFieldsUtils.res index 1d5360bbb..16b362913 100644 --- a/src/Utilities/DynamicFieldsUtils.res +++ b/src/Utilities/DynamicFieldsUtils.res @@ -226,6 +226,8 @@ let useRequiredFieldsEmptyAndValid = ( let dateOfBirth = Recoil.useRecoilValueFromAtom(dateOfBirth) let bankAccountNumber = Recoil.useRecoilValueFromAtom(userBankAccountNumber) let sourceBankAccountId = Recoil.useRecoilValueFromAtom(sourceBankAccountId) + let branchCode = Recoil.useRecoilValueFromAtom(userBranchCode) + let bankIdentifier = Recoil.useRecoilValueFromAtom(userBankIdentifier) let giftCardNumber = Recoil.useRecoilValueFromAtom(userGiftCardNumber) let giftCardPin = Recoil.useRecoilValueFromAtom(userGiftCardPin) @@ -280,6 +282,8 @@ let useRequiredFieldsEmptyAndValid = ( | GiftCardNumber => giftCardNumber.value !== "" | GiftCardPin => giftCardPin.value !== "" | SourceBankAccountId => sourceBankAccountId.value !== "" + | BranchCode => branchCode.value !== "" + | BankIdentifier => bankIdentifier.value !== "" | _ => true } }) @@ -336,6 +340,8 @@ let useRequiredFieldsEmptyAndValid = ( | GiftCardNumber => giftCardNumber.value === "" | GiftCardPin => giftCardPin.value === "" | SourceBankAccountId => sourceBankAccountId.value === "" + | BranchCode => branchCode.value === "" + | BankIdentifier => bankIdentifier.value === "" | _ => false } }) @@ -371,6 +377,8 @@ let useRequiredFieldsEmptyAndValid = ( cvcNumber, bankAccountNumber, sourceBankAccountId.value, + branchCode.value, + bankIdentifier.value, cryptoCurrencyNetworks, documentType, documentNumber.value, @@ -417,6 +425,8 @@ let useSetInitialRequiredFields = ( let (dateOfBirth, setDateOfBirth) = Recoil.useRecoilState(dateOfBirth) let (bankAccountNumber, setBankAccountNumber) = Recoil.useRecoilState(userBankAccountNumber) let (sourceBankAccountId, setSourceBankAccountId) = Recoil.useRecoilState(sourceBankAccountId) + let (branchCode, setBranchCode) = Recoil.useRecoilState(userBranchCode) + let (bankIdentifier, setBankIdentifier) = Recoil.useRecoilState(userBankIdentifier) let (giftCardNumber, setGiftCardNumber) = Recoil.useRecoilState(userGiftCardNumber) let (giftCardPin, setGiftCardPin) = Recoil.useRecoilState(userGiftCardPin) @@ -551,6 +561,10 @@ let useSetInitialRequiredFields = ( setFields(setBankAccountNumber, bankAccountNumber, requiredField, false) | SourceBankAccountId => setFields(setSourceBankAccountId, sourceBankAccountId, requiredField, false) + | BranchCode => + setFields(setBranchCode, branchCode, requiredField, false) + | BankIdentifier => + setFields(setBankIdentifier, bankIdentifier, requiredField, false) | DocumentType(_) => if value !== "" && documentType === "" { setDocumentType(_ => value) @@ -616,6 +630,8 @@ let useRequiredFieldsBody = ( let dateOfBirth = Recoil.useRecoilValueFromAtom(dateOfBirth) let bankAccountNumber = Recoil.useRecoilValueFromAtom(userBankAccountNumber) let sourceBankAccountId = Recoil.useRecoilValueFromAtom(sourceBankAccountId) + let branchCode = Recoil.useRecoilValueFromAtom(userBranchCode) + let bankIdentifier = Recoil.useRecoilValueFromAtom(userBankIdentifier) let countryCode = Utils.getCountryCode(country).isoAlpha2 let stateCode = Utils.getStateCodeFromStateName(state.value, countryCode) let giftCardNumber = Recoil.useRecoilValueFromAtom(userGiftCardNumber) @@ -681,6 +697,8 @@ let useRequiredFieldsBody = ( | BankAccountNumber => bankAccountNumber.value | SourceBankAccountId => sourceBankAccountId.value + | BranchCode => branchCode.value + | BankIdentifier => bankIdentifier.value | StateAndCity | PhoneNumberAndCountryCode | CountryAndPincode(_) @@ -789,6 +807,8 @@ let useRequiredFieldsBody = ( dateOfBirth, bankAccountNumber, sourceBankAccountId, + branchCode, + bankIdentifier, )) } @@ -815,6 +835,8 @@ let isFieldTypeToRenderOutsideBilling = (fieldType: PaymentMethodsRecord.payment | IBAN | SourceBankAccountId | BankAccountNumber + | BranchCode + | BankIdentifier | InfoElement => true | _ => false } diff --git a/src/Utilities/PaymentHelpers.res b/src/Utilities/PaymentHelpers.res index d6dfc477c..e1f867052 100644 --- a/src/Utilities/PaymentHelpers.res +++ b/src/Utilities/PaymentHelpers.res @@ -889,9 +889,9 @@ let rec intentCall = ( ]->getJsonFromArrayOfJson resolve(response) } else if intent.nextAction.type_ === "wait_screen_information" { - let displayToTimestamp = intent.nextAction.display_to_timestamp->Option.getOr(0.0) + let displayToTimestamp = intent.nextAction.display_to_timestamp let pollConfig = - intent.nextAction.poll_config->Option.getOr({delay_in_secs: 2, frequency: 0}) + intent.nextAction.poll_config->Option.getOr(PaymentConfirmTypes.defaultPollConfig) let headersDict = headers->Dict.fromArray handleLogging(~optLogger, ~value="", ~eventName=DISPLAY_WAIT_SCREEN, ~paymentMethod) @@ -914,7 +914,7 @@ let rec intentCall = ( ~customPodUri, ~sdkAuthorization, ~delayInMs=pollConfig.delay_in_secs * 1000, - ~endTimestamp=Some(displayToTimestamp), + ~endTimestamp=displayToTimestamp, ) ->Promise.then( retrievedData => { diff --git a/src/Utilities/RecoilAtoms.res b/src/Utilities/RecoilAtoms.res index c2ab07a50..eface4305 100644 --- a/src/Utilities/RecoilAtoms.res +++ b/src/Utilities/RecoilAtoms.res @@ -81,6 +81,8 @@ let isCompleteCallbackUsed = Recoil.atom("isCompleteCallbackUsed", false) let isPaymentButtonHandlerProvidedAtom = Recoil.atom("isPaymentButtonHandlerProvidedAtom", false) let userBankAccountNumber = Recoil.atom("userBankAccountNumber", defaultFieldValues) let sourceBankAccountId = Recoil.atom("sourceBankAccountId", defaultFieldValues) +let userBranchCode = Recoil.atom("userBranchCode", defaultFieldValues) +let userBankIdentifier = Recoil.atom("userBankIdentifier", defaultFieldValues) type areOneClickWalletsRendered = { isGooglePay: bool, From 2f1689ec89d941f9146e04941bddb693d85e94cc Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Sat, 4 Apr 2026 19:33:25 +0530 Subject: [PATCH 3/6] refactor: apply suggested changes --- src/Components/DynamicFields.res | 4 +- src/Components/Loader.res | 16 ++-- src/Components/PaymentLoader.res | 12 ++- src/Components/PixPaymentInput.res | 10 +- src/LocaleStrings/ArabicLocale.res | 6 ++ src/LocaleStrings/CatalanLocale.res | 6 ++ src/LocaleStrings/ChineseLocale.res | 6 ++ src/LocaleStrings/DeutschLocale.res | 6 ++ src/LocaleStrings/DutchLocale.res | 6 ++ src/LocaleStrings/EnglishGBLocale.res | 6 ++ src/LocaleStrings/EnglishLocale.res | 6 ++ src/LocaleStrings/FrenchBelgiumLocale.res | 6 ++ src/LocaleStrings/FrenchLocale.res | 6 ++ src/LocaleStrings/HebrewLocale.res | 6 ++ src/LocaleStrings/ItalianLocale.res | 6 ++ src/LocaleStrings/JapaneseLocale.res | 6 ++ src/LocaleStrings/LocaleStringTypes.res | 6 ++ src/LocaleStrings/PolishLocale.res | 6 ++ src/LocaleStrings/PortugueseLocale.res | 6 ++ src/LocaleStrings/RussianLocale.res | 6 ++ src/LocaleStrings/SpanishLocale.res | 6 ++ src/LocaleStrings/SwedishLocale.res | 6 ++ .../TraditionalChineseLocale.res | 6 ++ src/Types/PaymentConfirmTypes.res | 9 +- src/Utilities/DynamicFieldsUtils.res | 6 +- src/Utilities/PaymentHelpers.res | 95 ++++++------------- src/hyper-loader/Elements.res | 1 + src/hyper-loader/LoaderPaymentElement.res | 12 ++- .../PaymentMethodsManagementElements.res | 1 + 29 files changed, 190 insertions(+), 90 deletions(-) diff --git a/src/Components/DynamicFields.res b/src/Components/DynamicFields.res index 4e1934b32..579e80ee9 100644 --- a/src/Components/DynamicFields.res +++ b/src/Components/DynamicFields.res @@ -533,7 +533,7 @@ let make = ( /> | BranchCode => { @@ -559,7 +559,7 @@ let make = ( /> | BankIdentifier => { diff --git a/src/Components/Loader.res b/src/Components/Loader.res index 36bb76d1b..7a488c77a 100644 --- a/src/Components/Loader.res +++ b/src/Components/Loader.res @@ -14,15 +14,18 @@ let parsePaymentMethod = methodString => { } } -let getLoaderTextConfig = (paymentMethod: loaderPaymentMethod) => { +let getLoaderTextConfig = ( + paymentMethod: loaderPaymentMethod, + ~localeString: LocaleStringTypes.localeStrings, +) => { switch paymentMethod { | PixAutomaticoPush => { - title: "Please confirm the payment in your banking app", - subtitle: "Open your banking application and authorize the payment request. The status will be updated automatically once confirmed.", + title: localeString.loaderPaymentConfirmBankingAppTitle, + subtitle: localeString.loaderPaymentConfirmBankingAppSubtitle, } | Other => { - title: "We are processing your payment...", - subtitle: "You have been redirected to new tab to complete your payments. Status will be updated automatically", + title: localeString.loaderPaymentProcessingTitle, + subtitle: localeString.loaderPaymentProcessingSubtitle, } } } @@ -30,9 +33,10 @@ let getLoaderTextConfig = (paymentMethod: loaderPaymentMethod) => { @react.component let make = (~branding="auto", ~showText=true, ~paymentMethod="") => { let arr = ["hyperswitch-triangle", "hyperswitch-square", "hyperswitch-circle"] + let {localeString} = Recoil.useRecoilValueFromAtom(RecoilAtoms.configAtom) let parsedPaymentMethod = parsePaymentMethod(paymentMethod) - let textConfig = getLoaderTextConfig(parsedPaymentMethod) + let textConfig = getLoaderTextConfig(parsedPaymentMethod, ~localeString)
diff --git a/src/Components/PaymentLoader.res b/src/Components/PaymentLoader.res index 37bc4e7a1..fec99a399 100644 --- a/src/Components/PaymentLoader.res +++ b/src/Components/PaymentLoader.res @@ -3,6 +3,7 @@ let make = () => { open Utils let (branding, setBranding) = React.useState(_ => "auto") let (paymentMethod, setPaymentMethod) = React.useState(_ => "") + let setConfig = Recoil.useSetRecoilState(RecoilAtoms.configAtom) React.useEffect0(() => { messageParentWindow([("iframeMountedCallback", true->JSON.Encode.bool)]) @@ -10,9 +11,16 @@ let make = () => { let json = ev.data->safeParse let dict = json->getDictFromJson if dict->Utils.getBool("fullScreenIframeMounted", false) { - if dict->getDictFromDict("options")->getOptionString("branding")->Option.isSome { - setBranding(_ => dict->getDictFromDict("options")->getString("branding", "auto")) + let optionsDict = dict->getDictFromDict("options") + if optionsDict->getOptionString("branding")->Option.isSome { + setBranding(_ => optionsDict->getString("branding", "auto")) } + let locale = optionsDict->getString("locale", "auto") + CardTheme.getLocaleObject(locale) + ->Promise.thenResolve(localeString => { + setConfig(prev => {...prev, localeString}) + }) + ->ignore let metadata = dict->getJsonObjectFromDict("metadata") let metaDataDict = metadata->JSON.Decode.object->Option.getOr(Dict.make()) let paymentMethodStr = metaDataDict->getString("paymentMethod", "") diff --git a/src/Components/PixPaymentInput.res b/src/Components/PixPaymentInput.res index 884cd416c..7880d5ff5 100644 --- a/src/Components/PixPaymentInput.res +++ b/src/Components/PixPaymentInput.res @@ -151,7 +151,15 @@ let make = (~fieldType="") => { }) } } - }, [pixCNPJ.value, pixKey.value, pixCPF.value, sourceBankAccountId.value, bankAccountNumber.value, branchCode.value, bankIdentifier.value]) + }, ( + pixCNPJ.value, + pixKey.value, + pixCPF.value, + sourceBankAccountId.value, + bankAccountNumber.value, + branchCode.value, + bankIdentifier.value, + )) useSubmitPaymentData(submitCallback) diff --git a/src/LocaleStrings/ArabicLocale.res b/src/LocaleStrings/ArabicLocale.res index 0665f47ae..60e976e17 100644 --- a/src/LocaleStrings/ArabicLocale.res +++ b/src/LocaleStrings/ArabicLocale.res @@ -265,4 +265,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `دفعة واحدة بقيمة ${currency} ${amount}` : `${numPayments->Int.toString} دفعات بقيمة ${currency} ${amount}`, installmentSelectPlanError: "يرجى اختيار خطة تقسيط", + loaderPaymentProcessingTitle: "جارٍ معالجة دفعتك...", + loaderPaymentProcessingSubtitle: "تمت إعادة توجيهك إلى علامة تبويب جديدة لإتمام الدفع. سيتم تحديث الحالة تلقائيًا", + loaderPaymentConfirmBankingAppTitle: "يرجى تأكيد الدفع في تطبيق البنك الخاص بك", + loaderPaymentConfirmBankingAppSubtitle: "افتح تطبيق البنك الخاص بك وقم بتفويض طلب الدفع. سيتم تحديث الحالة تلقائيًا بعد التأكيد.", + branchCodeLabel: "رمز الفرع", + bankIdentifierLabel: "معرف البنك", } diff --git a/src/LocaleStrings/CatalanLocale.res b/src/LocaleStrings/CatalanLocale.res index 7dac28c4c..4517d560b 100644 --- a/src/LocaleStrings/CatalanLocale.res +++ b/src/LocaleStrings/CatalanLocale.res @@ -264,4 +264,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 termini de ${currency} ${amount}` : `${numPayments->Int.toString} terminis de ${currency} ${amount}`, installmentSelectPlanError: "Si us plau, seleccioneu un pla de terminis", + loaderPaymentProcessingTitle: "Estem processant el vostre pagament...", + loaderPaymentProcessingSubtitle: `Heu estat redirigit a una nova pestanya per completar el pagament. L'estat s'actualitzarà automàticament`, + loaderPaymentConfirmBankingAppTitle: `Si us plau, confirmeu el pagament a la vostra aplicació bancària`, + loaderPaymentConfirmBankingAppSubtitle: `Obriu la vostra aplicació bancària i autoritzeu la sol·licitud de pagament. L'estat s'actualitzarà automàticament un cop confirmat.`, + branchCodeLabel: "Codi de sucursal", + bankIdentifierLabel: "Identificador bancari", } diff --git a/src/LocaleStrings/ChineseLocale.res b/src/LocaleStrings/ChineseLocale.res index e6254784c..41f5e8823 100644 --- a/src/LocaleStrings/ChineseLocale.res +++ b/src/LocaleStrings/ChineseLocale.res @@ -260,4 +260,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { installmentPaymentLabel: (numPayments, currency, amount) => `${numPayments->Int.toString}期付款,每期 ${currency} ${amount}`, installmentSelectPlanError: "请选择分期计划", + loaderPaymentProcessingTitle: "我们正在处理您的付款...", + loaderPaymentProcessingSubtitle: "您已被重定向到新标签页以完成付款。状态将自动更新", + loaderPaymentConfirmBankingAppTitle: "请在您的银行应用中确认付款", + loaderPaymentConfirmBankingAppSubtitle: "打开您的银行应用程序并授权付款请求。确认后状态将自动更新。", + branchCodeLabel: "支行代码", + bankIdentifierLabel: "银行识别码", } diff --git a/src/LocaleStrings/DeutschLocale.res b/src/LocaleStrings/DeutschLocale.res index fddae55ba..5cede36d6 100644 --- a/src/LocaleStrings/DeutschLocale.res +++ b/src/LocaleStrings/DeutschLocale.res @@ -263,4 +263,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 Zahlung à ${currency} ${amount}` : `${numPayments->Int.toString} Zahlungen à ${currency} ${amount}`, installmentSelectPlanError: "Bitte wählen Sie einen Ratenplan", + loaderPaymentProcessingTitle: "Ihre Zahlung wird verarbeitet...", + loaderPaymentProcessingSubtitle: "Sie wurden auf eine neue Registerkarte weitergeleitet, um Ihre Zahlung abzuschließen. Der Status wird automatisch aktualisiert", + loaderPaymentConfirmBankingAppTitle: "Bitte bestätigen Sie die Zahlung in Ihrer Banking-App", + loaderPaymentConfirmBankingAppSubtitle: `Öffnen Sie Ihre Banking-Anwendung und autorisieren Sie die Zahlungsanforderung. Der Status wird automatisch aktualisiert, sobald die Bestätigung erfolgt ist.`, + branchCodeLabel: "Bankleitzahl", + bankIdentifierLabel: "Bankkennung", } diff --git a/src/LocaleStrings/DutchLocale.res b/src/LocaleStrings/DutchLocale.res index 93c202bcf..530e82ae1 100644 --- a/src/LocaleStrings/DutchLocale.res +++ b/src/LocaleStrings/DutchLocale.res @@ -262,4 +262,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 betaling van ${currency} ${amount}` : `${numPayments->Int.toString} betalingen van ${currency} ${amount}`, installmentSelectPlanError: "Selecteer een aflossingsplan", + loaderPaymentProcessingTitle: "We verwerken uw betaling...", + loaderPaymentProcessingSubtitle: "U bent doorgestuurd naar een nieuw tabblad om uw betaling te voltooien. De status wordt automatisch bijgewerkt", + loaderPaymentConfirmBankingAppTitle: "Bevestig de betaling in uw bankieren-app", + loaderPaymentConfirmBankingAppSubtitle: "Open uw bankieren-applicatie en autoriseer het betalingsverzoek. De status wordt automatisch bijgewerkt zodra dit is bevestigd.", + branchCodeLabel: "Filiaalcode", + bankIdentifierLabel: "Bankidentificatie", } diff --git a/src/LocaleStrings/EnglishGBLocale.res b/src/LocaleStrings/EnglishGBLocale.res index cf384e7c9..0f7446869 100644 --- a/src/LocaleStrings/EnglishGBLocale.res +++ b/src/LocaleStrings/EnglishGBLocale.res @@ -262,4 +262,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 payment of ${currency} ${amount}` : `${numPayments->Int.toString} payments of ${currency} ${amount}`, installmentSelectPlanError: "Please select an instalment plan", + loaderPaymentProcessingTitle: "We are processing your payment...", + loaderPaymentProcessingSubtitle: "You have been redirected to new tab to complete your payments. Status will be updated automatically", + loaderPaymentConfirmBankingAppTitle: "Please confirm the payment in your banking app", + loaderPaymentConfirmBankingAppSubtitle: "Open your banking application and authorise the payment request. The status will be updated automatically once confirmed.", + branchCodeLabel: "Branch Code", + bankIdentifierLabel: "Bank Identifier", } diff --git a/src/LocaleStrings/EnglishLocale.res b/src/LocaleStrings/EnglishLocale.res index cbb3e92d6..22a6fc017 100644 --- a/src/LocaleStrings/EnglishLocale.res +++ b/src/LocaleStrings/EnglishLocale.res @@ -262,4 +262,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 payment of ${currency} ${amount}` : `${numPayments->Int.toString} payments of ${currency} ${amount}`, installmentSelectPlanError: "Please select an installment plan", + loaderPaymentProcessingTitle: "We are processing your payment...", + loaderPaymentProcessingSubtitle: "You have been redirected to new tab to complete your payments. Status will be updated automatically", + loaderPaymentConfirmBankingAppTitle: "Please confirm the payment in your banking app", + loaderPaymentConfirmBankingAppSubtitle: "Open your banking application and authorize the payment request. The status will be updated automatically once confirmed.", + branchCodeLabel: "Branch Code", + bankIdentifierLabel: "Bank Identifier", } diff --git a/src/LocaleStrings/FrenchBelgiumLocale.res b/src/LocaleStrings/FrenchBelgiumLocale.res index b6ceee79d..f1c762d01 100644 --- a/src/LocaleStrings/FrenchBelgiumLocale.res +++ b/src/LocaleStrings/FrenchBelgiumLocale.res @@ -264,4 +264,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 paiement à ${currency} ${amount}` : `${numPayments->Int.toString} paiements à ${currency} ${amount}`, installmentSelectPlanError: "Veuillez sélectionner un plan de paiement", + loaderPaymentProcessingTitle: "Nous traitons votre paiement...", + loaderPaymentProcessingSubtitle: `Vous avez été redirigé vers un nouvel onglet pour finaliser votre paiement. Le statut sera mis à jour automatiquement`, + loaderPaymentConfirmBankingAppTitle: "Veuillez confirmer le paiement dans votre application bancaire", + loaderPaymentConfirmBankingAppSubtitle: `Ouvrez votre application bancaire et autorisez la demande de paiement. Le statut sera mis à jour automatiquement une fois la confirmation effectuée.`, + branchCodeLabel: "Code agence", + bankIdentifierLabel: "Identifiant bancaire", } diff --git a/src/LocaleStrings/FrenchLocale.res b/src/LocaleStrings/FrenchLocale.res index df0b330e8..8f2224914 100644 --- a/src/LocaleStrings/FrenchLocale.res +++ b/src/LocaleStrings/FrenchLocale.res @@ -264,4 +264,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 paiement à ${currency} ${amount}` : `${numPayments->Int.toString} paiements à ${currency} ${amount}`, installmentSelectPlanError: "Veuillez sélectionner un plan de paiement", + loaderPaymentProcessingTitle: "Nous traitons votre paiement...", + loaderPaymentProcessingSubtitle: `Vous avez été redirigé vers un nouvel onglet pour finaliser votre paiement. Le statut sera mis à jour automatiquement`, + loaderPaymentConfirmBankingAppTitle: "Veuillez confirmer le paiement dans votre application bancaire", + loaderPaymentConfirmBankingAppSubtitle: `Ouvrez votre application bancaire et autorisez la demande de paiement. Le statut sera mis à jour automatiquement une fois la confirmation effectuée.`, + branchCodeLabel: "Code agence", + bankIdentifierLabel: "Identifiant bancaire", } diff --git a/src/LocaleStrings/HebrewLocale.res b/src/LocaleStrings/HebrewLocale.res index f81267fa9..8f9512c96 100644 --- a/src/LocaleStrings/HebrewLocale.res +++ b/src/LocaleStrings/HebrewLocale.res @@ -263,4 +263,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `תשלום אחד של ${currency} ${amount}` : `${numPayments->Int.toString} תשלומים של ${currency} ${amount}`, installmentSelectPlanError: "אנא בחר תוכנית תשלומים", + loaderPaymentProcessingTitle: "אנחנו מעבדים את התשלום שלך...", + loaderPaymentProcessingSubtitle: "הופנית לכרטיסייה חדשה להשלמת התשלום. הסטטוס יתעדכן אוטומטית", + loaderPaymentConfirmBankingAppTitle: "אנא אשר את התשלום באפליקציית הבנק שלך", + loaderPaymentConfirmBankingAppSubtitle: "פתח את אפליקציית הבנק שלך ואשר את בקשת התשלום. הסטטוס יתעדכן אוטומטית לאחר האישור.", + branchCodeLabel: "קוד סניף", + bankIdentifierLabel: "מזהה בנק", } diff --git a/src/LocaleStrings/ItalianLocale.res b/src/LocaleStrings/ItalianLocale.res index d45521a01..3e4c32fb2 100644 --- a/src/LocaleStrings/ItalianLocale.res +++ b/src/LocaleStrings/ItalianLocale.res @@ -264,4 +264,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 rata da ${currency} ${amount}` : `${numPayments->Int.toString} rate da ${currency} ${amount}`, installmentSelectPlanError: "Seleziona un piano a rate", + loaderPaymentProcessingTitle: "Stiamo elaborando il tuo pagamento...", + loaderPaymentProcessingSubtitle: "Sei stato reindirizzato a una nuova scheda per completare il pagamento. Lo stato verrà aggiornato automaticamente", + loaderPaymentConfirmBankingAppTitle: "Conferma il pagamento nella tua app bancaria", + loaderPaymentConfirmBankingAppSubtitle: `Apri la tua applicazione bancaria e autorizza la richiesta di pagamento. Lo stato verrà aggiornato automaticamente una volta confermato.`, + branchCodeLabel: "Codice filiale", + bankIdentifierLabel: "Identificativo bancario", } diff --git a/src/LocaleStrings/JapaneseLocale.res b/src/LocaleStrings/JapaneseLocale.res index d541bdc00..69bba352d 100644 --- a/src/LocaleStrings/JapaneseLocale.res +++ b/src/LocaleStrings/JapaneseLocale.res @@ -261,4 +261,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { installmentPaymentLabel: (numPayments, currency, amount) => `${currency} ${amount} × ${numPayments->Int.toString}回払い`, installmentSelectPlanError: "分割払いプランを選択してください", + loaderPaymentProcessingTitle: "お支払いを処理しています...", + loaderPaymentProcessingSubtitle: "お支払いを完了するために新しいタブにリダイレクトされました。ステータスは自動的に更新されます", + loaderPaymentConfirmBankingAppTitle: "銀行アプリでお支払いを確認してください", + loaderPaymentConfirmBankingAppSubtitle: "銀行アプリケーションを開き、支払いリクエストを承認してください。確認後、ステータスは自動的に更新されます。", + branchCodeLabel: "支店コード", + bankIdentifierLabel: "銀行識別コード", } diff --git a/src/LocaleStrings/LocaleStringTypes.res b/src/LocaleStrings/LocaleStringTypes.res index 216596b2b..d8b3a92d0 100644 --- a/src/LocaleStrings/LocaleStringTypes.res +++ b/src/LocaleStrings/LocaleStringTypes.res @@ -247,6 +247,12 @@ type localeStrings = { installmentTotalPayable: string, installmentPaymentLabel: (int, string, string) => string, installmentSelectPlanError: string, + loaderPaymentProcessingTitle: string, + loaderPaymentProcessingSubtitle: string, + loaderPaymentConfirmBankingAppTitle: string, + loaderPaymentConfirmBankingAppSubtitle: string, + branchCodeLabel: string, + bankIdentifierLabel: string, } type constantStrings = { diff --git a/src/LocaleStrings/PolishLocale.res b/src/LocaleStrings/PolishLocale.res index e3686e133..7938b9ac4 100644 --- a/src/LocaleStrings/PolishLocale.res +++ b/src/LocaleStrings/PolishLocale.res @@ -263,4 +263,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 rata po ${currency} ${amount}` : `${numPayments->Int.toString} raty po ${currency} ${amount}`, installmentSelectPlanError: "Proszę wybrać plan rat", + loaderPaymentProcessingTitle: "Przetwarzamy Twoją płatność...", + loaderPaymentProcessingSubtitle: `Zostałeś przekierowany na nową kartę, aby dokończyć płatność. Status zostanie automatycznie zaktualizowany`, + loaderPaymentConfirmBankingAppTitle: `Potwierdź płatność w swojej aplikacji bankowej`, + loaderPaymentConfirmBankingAppSubtitle: `Otwórz swoją aplikację bankową i autoryzuj żądanie płatności. Status zostanie automatycznie zaktualizowany po potwierdzeniu.`, + branchCodeLabel: `Kod oddziału`, + bankIdentifierLabel: "Identyfikator banku", } diff --git a/src/LocaleStrings/PortugueseLocale.res b/src/LocaleStrings/PortugueseLocale.res index 77723a738..0f79e89c1 100644 --- a/src/LocaleStrings/PortugueseLocale.res +++ b/src/LocaleStrings/PortugueseLocale.res @@ -263,4 +263,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 parcela de ${currency} ${amount}` : `${numPayments->Int.toString} parcelas de ${currency} ${amount}`, installmentSelectPlanError: "Por favor, selecione um plano de parcelamento", + loaderPaymentProcessingTitle: "Estamos processando seu pagamento...", + loaderPaymentProcessingSubtitle: `Você foi redirecionado para uma nova aba para concluir seu pagamento. O status será atualizado automaticamente`, + loaderPaymentConfirmBankingAppTitle: "Por favor, confirme o pagamento no seu aplicativo bancário", + loaderPaymentConfirmBankingAppSubtitle: `Abra seu aplicativo bancário e autorize a solicitação de pagamento. O status será atualizado automaticamente após a confirmação.`, + branchCodeLabel: `Código da agência`, + bankIdentifierLabel: `Identificador bancário`, } diff --git a/src/LocaleStrings/RussianLocale.res b/src/LocaleStrings/RussianLocale.res index 3aeff9d3b..2bb040c39 100644 --- a/src/LocaleStrings/RussianLocale.res +++ b/src/LocaleStrings/RussianLocale.res @@ -271,4 +271,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 платёж ${currency} ${amount}` : `${numPayments->Int.toString} платежа по ${currency} ${amount}`, installmentSelectPlanError: "Пожалуйста, выберите план рассрочки", + loaderPaymentProcessingTitle: "Мы обрабатываем ваш платёж...", + loaderPaymentProcessingSubtitle: "Вы были перенаправлены на новую вкладку для завершения платежа. Статус обновится автоматически", + loaderPaymentConfirmBankingAppTitle: "Пожалуйста, подтвердите платёж в вашем банковском приложении", + loaderPaymentConfirmBankingAppSubtitle: "Откройте ваше банковское приложение и подтвердите запрос на оплату. Статус обновится автоматически после подтверждения.", + branchCodeLabel: "Код отделения", + bankIdentifierLabel: "Идентификатор банка", } diff --git a/src/LocaleStrings/SpanishLocale.res b/src/LocaleStrings/SpanishLocale.res index 20db50548..7f8f06dab 100644 --- a/src/LocaleStrings/SpanishLocale.res +++ b/src/LocaleStrings/SpanishLocale.res @@ -263,4 +263,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 pago de ${currency} ${amount}` : `${numPayments->Int.toString} pagos de ${currency} ${amount}`, installmentSelectPlanError: "Por favor seleccione un plan de cuotas", + loaderPaymentProcessingTitle: "Estamos procesando su pago...", + loaderPaymentProcessingSubtitle: `Ha sido redirigido a una nueva pestaña para completar su pago. El estado se actualizará automáticamente`, + loaderPaymentConfirmBankingAppTitle: "Por favor confirme el pago en su aplicación bancaria", + loaderPaymentConfirmBankingAppSubtitle: `Abra su aplicación bancaria y autorice la solicitud de pago. El estado se actualizará automáticamente una vez confirmado.`, + branchCodeLabel: `Código de sucursal`, + bankIdentifierLabel: "Identificador bancario", } diff --git a/src/LocaleStrings/SwedishLocale.res b/src/LocaleStrings/SwedishLocale.res index 845fd1ed9..2a94e5c6d 100644 --- a/src/LocaleStrings/SwedishLocale.res +++ b/src/LocaleStrings/SwedishLocale.res @@ -262,4 +262,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { ? `1 betalning à ${currency} ${amount}` : `${numPayments->Int.toString} betalningar à ${currency} ${amount}`, installmentSelectPlanError: "Välj ett avbetalningsplan", + loaderPaymentProcessingTitle: "Vi behandlar din betalning...", + loaderPaymentProcessingSubtitle: `Du har omdirigerats till en ny flik för att slutföra din betalning. Statusen uppdateras automatiskt`, + loaderPaymentConfirmBankingAppTitle: `Bekräfta betalningen i din bankapp`, + loaderPaymentConfirmBankingAppSubtitle: `Öppna din bankapplikation och godkänn betalningsförfrågan. Statusen uppdateras automatiskt när den har bekräftats.`, + branchCodeLabel: "Kontorskod", + bankIdentifierLabel: "Bankidentifierare", } diff --git a/src/LocaleStrings/TraditionalChineseLocale.res b/src/LocaleStrings/TraditionalChineseLocale.res index 404d6146f..e2cdd3267 100644 --- a/src/LocaleStrings/TraditionalChineseLocale.res +++ b/src/LocaleStrings/TraditionalChineseLocale.res @@ -260,4 +260,10 @@ let localeStrings: LocaleStringTypes.localeStrings = { installmentPaymentLabel: (numPayments, currency, amount) => `${numPayments->Int.toString}期付款,每期 ${currency} ${amount}`, installmentSelectPlanError: "請選擇分期計劃", + loaderPaymentProcessingTitle: "我們正在處理您的付款...", + loaderPaymentProcessingSubtitle: "您已被重新導向到新分頁以完成付款。狀態將自動更新", + loaderPaymentConfirmBankingAppTitle: "請在您的銀行應用程式中確認付款", + loaderPaymentConfirmBankingAppSubtitle: "開啟您的銀行應用程式並授權付款請求。確認後狀態將自動更新。", + branchCodeLabel: "分行代碼", + bankIdentifierLabel: "銀行識別碼", } diff --git a/src/Types/PaymentConfirmTypes.res b/src/Types/PaymentConfirmTypes.res index 7a637271f..b1bbea77c 100644 --- a/src/Types/PaymentConfirmTypes.res +++ b/src/Types/PaymentConfirmTypes.res @@ -185,12 +185,9 @@ let getNextAction = (dict, str) => { ->Dict.get("three_ds_data") ->Option.getOr(Dict.make()->JSON.Encode.object), ), - display_to_timestamp: Some( - json - ->Dict.get("display_to_timestamp") - ->Option.flatMap(JSON.Decode.float) - ->Option.getOr(0.0), - ), + display_to_timestamp: json + ->Dict.get("display_to_timestamp") + ->Option.flatMap(JSON.Decode.float), voucher_details: { json ->Dict.get("voucher_details") diff --git a/src/Utilities/DynamicFieldsUtils.res b/src/Utilities/DynamicFieldsUtils.res index 16b362913..42fdcc939 100644 --- a/src/Utilities/DynamicFieldsUtils.res +++ b/src/Utilities/DynamicFieldsUtils.res @@ -561,10 +561,8 @@ let useSetInitialRequiredFields = ( setFields(setBankAccountNumber, bankAccountNumber, requiredField, false) | SourceBankAccountId => setFields(setSourceBankAccountId, sourceBankAccountId, requiredField, false) - | BranchCode => - setFields(setBranchCode, branchCode, requiredField, false) - | BankIdentifier => - setFields(setBankIdentifier, bankIdentifier, requiredField, false) + | BranchCode => setFields(setBranchCode, branchCode, requiredField, false) + | BankIdentifier => setFields(setBankIdentifier, bankIdentifier, requiredField, false) | DocumentType(_) => if value !== "" && documentType === "" { setDocumentType(_ => value) diff --git a/src/Utilities/PaymentHelpers.res b/src/Utilities/PaymentHelpers.res index e1f867052..9f258d3c3 100644 --- a/src/Utilities/PaymentHelpers.res +++ b/src/Utilities/PaymentHelpers.res @@ -172,75 +172,30 @@ let rec pollRetrievePaymentIntent = ( ~isForceSync=false, ~sdkAuthorization=None, ~delayInMs=2000, - ~endTimestamp=None, + ~endTimestampNanos=None, ) => { open Promise - switch endTimestamp { + let isExpired = switch endTimestampNanos { | Some(timestamp) => let currentTime = Date.now() *. 1000000.0 // convert to nanoseconds - if currentTime >= timestamp { - retrievePaymentIntent( - clientSecret, - ~headers, - ~publishableKey, - ~logger, - ~customPodUri, - ~isForceSync, - ~sdkAuthorization, - ) - ->then(json => resolve(json)) - ->catch(_ => resolve(JSON.Encode.null)) - } else { - retrievePaymentIntent( - clientSecret, - ~headers, - ~publishableKey, - ~logger, - ~customPodUri, - ~isForceSync, - ~sdkAuthorization, - ) - ->then(json => { - let dict = json->getDictFromJson - let status = dict->getString("status", "") + currentTime >= timestamp + | None => false + } - if status === "succeeded" || status === "failed" { - resolve(json) - } else { - delay(delayInMs) - ->then(_val => { - pollRetrievePaymentIntent( - clientSecret, - ~headers, - ~publishableKey, - ~logger, - ~customPodUri, - ~isForceSync, - ~sdkAuthorization, - ~delayInMs, - ~endTimestamp=Some(timestamp), - ) - }) - ->catch(_ => Promise.resolve(JSON.Encode.null)) - } - }) - ->catch(e => { - Console.error2("Unable to retrieve payment due to following error", e) - pollRetrievePaymentIntent( - clientSecret, - ~headers, - ~publishableKey, - ~logger, - ~customPodUri, - ~isForceSync, - ~sdkAuthorization, - ~delayInMs, - ~endTimestamp=Some(timestamp), - ) - }) - } - | None => + if isExpired { + retrievePaymentIntent( + clientSecret, + ~headers, + ~publishableKey, + ~logger, + ~customPodUri, + ~isForceSync, + ~sdkAuthorization, + ) + ->then(json => resolve(json)) + ->catch(_ => resolve(JSON.Encode.null)) + } else { retrievePaymentIntent( clientSecret, ~headers, @@ -268,6 +223,7 @@ let rec pollRetrievePaymentIntent = ( ~isForceSync, ~sdkAuthorization, ~delayInMs, + ~endTimestampNanos, ) }) ->catch(_ => Promise.resolve(JSON.Encode.null)) @@ -284,6 +240,7 @@ let rec pollRetrievePaymentIntent = ( ~isForceSync, ~sdkAuthorization, ~delayInMs, + ~endTimestampNanos, ) }) } @@ -889,7 +846,12 @@ let rec intentCall = ( ]->getJsonFromArrayOfJson resolve(response) } else if intent.nextAction.type_ === "wait_screen_information" { - let displayToTimestamp = intent.nextAction.display_to_timestamp + let displayToTimestamp = switch intent.nextAction.display_to_timestamp { + | Some(timestamp) => Some(timestamp) + | None => + let fifteenMinsNanos = Date.now() *. 1000000.0 +. 15.0 *. 60.0 *. 1000000000.0 + Some(fifteenMinsNanos) + } let pollConfig = intent.nextAction.poll_config->Option.getOr(PaymentConfirmTypes.defaultPollConfig) let headersDict = headers->Dict.fromArray @@ -914,7 +876,7 @@ let rec intentCall = ( ~customPodUri, ~sdkAuthorization, ~delayInMs=pollConfig.delay_in_secs * 1000, - ~endTimestamp=displayToTimestamp, + ~endTimestampNanos=displayToTimestamp, ) ->Promise.then( retrievedData => { @@ -931,8 +893,9 @@ let rec intentCall = ( }, ) ->ignore + } else { + resolve(data) } - resolve(data) } else { if !isPaymentSession { postFailedSubmitResponse( diff --git a/src/hyper-loader/Elements.res b/src/hyper-loader/Elements.res index 77bfc7ad7..8f9a6a07a 100644 --- a/src/hyper-loader/Elements.res +++ b/src/hyper-loader/Elements.res @@ -1498,6 +1498,7 @@ let make = ( setElementIframeRef, iframeRef, mountPostMessage, + ~locale=locale->Utils.getStringFromJson("auto"), ~redirectionFlags: RecoilAtomTypes.redirectionFlags, ~logger=Some(logger), ) diff --git a/src/hyper-loader/LoaderPaymentElement.res b/src/hyper-loader/LoaderPaymentElement.res index 768e5eed3..005afcb2a 100644 --- a/src/hyper-loader/LoaderPaymentElement.res +++ b/src/hyper-loader/LoaderPaymentElement.res @@ -14,12 +14,18 @@ let make = ( setIframeRef, iframeRef, mountPostMessage, + ~locale, ~isPaymentManagementElement=false, ~redirectionFlags: RecoilAtomTypes.redirectionFlags, ~logger: option, ) => { try { let logger = logger->Option.getOr(LoggerUtils.defaultLoggerConfig) + let optionsWithLocale = { + let dict = options->Utils.getDictFromJson->Dict.copy + dict->Dict.set("locale", locale->JSON.Encode.string) + dict->JSON.Encode.object + } let mountId = ref("") let setPaymentIframeRef = ref => { setIframeRef(ref) @@ -335,7 +341,7 @@ let make = ( [ ("fullScreenIframeMounted", true->JSON.Encode.bool), ("metadata", fullscreenMetadata.contents), - ("options", options), + ("options", optionsWithLocale), ]->Dict.fromArray, ) } @@ -344,7 +350,7 @@ let make = ( [ ("fullScreenIframeMounted", true->JSON.Encode.bool), ("metadata", fullscreenMetadata.contents), - ("options", options), + ("options", optionsWithLocale), ]->Dict.fromArray, ) let fullScreenEle = Window.querySelector(`#orca-fullscreen`) @@ -366,7 +372,7 @@ let make = ( mainElement->Window.iframePostMessage( [ ("fullScreenIframeMounted", false->JSON.Encode.bool), - ("options", options), + ("options", optionsWithLocale), ]->Dict.fromArray, ) } diff --git a/src/hyper-loader/PaymentMethodsManagementElements.res b/src/hyper-loader/PaymentMethodsManagementElements.res index 67966f639..c700ff57b 100644 --- a/src/hyper-loader/PaymentMethodsManagementElements.res +++ b/src/hyper-loader/PaymentMethodsManagementElements.res @@ -238,6 +238,7 @@ let make = ( setElementIframeRef, iframeRef, mountPostMessage, + ~locale=locale->Utils.getStringFromJson("auto"), ~isPaymentManagementElement=true, ~redirectionFlags=RecoilAtoms.defaultRedirectionFlags, ~logger=Some(logger), From 9d91aa71c1c662091fad47474dd233d7f2a3746f Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Thu, 9 Apr 2026 13:23:09 +0530 Subject: [PATCH 4/6] refactor: apply suggested changes --- src/Components/DynamicFields.res | 6 +++-- src/Components/PixPaymentInput.res | 24 ++++++++++++------- src/LocaleStrings/ArabicLocale.res | 5 ++++ src/LocaleStrings/CatalanLocale.res | 5 ++++ src/LocaleStrings/ChineseLocale.res | 5 ++++ src/LocaleStrings/DeutschLocale.res | 5 ++++ src/LocaleStrings/DutchLocale.res | 5 ++++ src/LocaleStrings/EnglishGBLocale.res | 5 ++++ src/LocaleStrings/EnglishLocale.res | 5 ++++ src/LocaleStrings/FrenchBelgiumLocale.res | 5 ++++ src/LocaleStrings/FrenchLocale.res | 5 ++++ src/LocaleStrings/HebrewLocale.res | 5 ++++ src/LocaleStrings/ItalianLocale.res | 5 ++++ src/LocaleStrings/JapaneseLocale.res | 5 ++++ src/LocaleStrings/LocaleStringTypes.res | 5 ++++ src/LocaleStrings/PolishLocale.res | 5 ++++ src/LocaleStrings/PortugueseLocale.res | 5 ++++ src/LocaleStrings/RussianLocale.res | 5 ++++ src/LocaleStrings/SpanishLocale.res | 5 ++++ src/LocaleStrings/SwedishLocale.res | 5 ++++ .../TraditionalChineseLocale.res | 5 ++++ src/Payments/PaymentMethodsRecord.res | 3 +++ src/Utilities/DynamicFieldsUtils.res | 10 ++++++++ src/Utilities/RecoilAtoms.res | 1 + 24 files changed, 129 insertions(+), 10 deletions(-) diff --git a/src/Components/DynamicFields.res b/src/Components/DynamicFields.res index 579e80ee9..1921a88eb 100644 --- a/src/Components/DynamicFields.res +++ b/src/Components/DynamicFields.res @@ -478,6 +478,7 @@ let make = ( | PixKey => | PixCPF => | PixCNPJ => + | PixAccountNumber => | BankAccountNumber | IBAN => | BankIdentifier => | DocumentNumber | Email @@ -865,6 +866,7 @@ let make = ( | PixKey | PixCPF | PixCNPJ + | PixAccountNumber | DocumentType(_) | DocumentNumber | CardNumber diff --git a/src/Components/PixPaymentInput.res b/src/Components/PixPaymentInput.res index 7880d5ff5..57e2925e4 100644 --- a/src/Components/PixPaymentInput.res +++ b/src/Components/PixPaymentInput.res @@ -7,8 +7,8 @@ let make = (~fieldType="") => { let (pixCNPJ, setPixCNPJ) = Recoil.useRecoilState(userPixCNPJ) let (pixCPF, setPixCPF) = Recoil.useRecoilState(userPixCPF) let (pixKey, setPixKey) = Recoil.useRecoilState(userPixKey) + let (pixAccountNumber, setPixAccountNumber) = Recoil.useRecoilState(userPixAccountNumber) let (sourceBankAccountId, setSourceBankAccountId) = Recoil.useRecoilState(sourceBankAccountId) - let (bankAccountNumber, setBankAccountNumber) = Recoil.useRecoilState(userBankAccountNumber) let (branchCode, setBranchCode) = Recoil.useRecoilState(userBranchCode) let (bankIdentifier, setBankIdentifier) = Recoil.useRecoilState(userBankIdentifier) let inputRef = React.useRef(Nullable.null) @@ -75,6 +75,14 @@ let make = (~fieldType="") => { Some(14), validatePixCNPJ, ) + | "pixAccountNumber" => ( + localeString.pixAccountNumberLabel, + setPixAccountNumber, + pixAccountNumber, + localeString.pixAccountNumberPlaceholder, + None, + validatePixKey, + ) | _ => ( "", _ => (), @@ -126,16 +134,16 @@ let make = (~fieldType="") => { errorString: localeString.pixCPFEmptyText, }) } - if sourceBankAccountId.value == "" { - setSourceBankAccountId(prev => { + if pixAccountNumber.value == "" { + setPixAccountNumber(prev => { ...prev, - errorString: localeString.sourceBankAccountIdEmptyText, + errorString: localeString.pixAccountNumberEmptyText, }) } - if bankAccountNumber.value == "" { - setBankAccountNumber(prev => { + if sourceBankAccountId.value == "" { + setSourceBankAccountId(prev => { ...prev, - errorString: localeString.ibanEmptyText, + errorString: localeString.sourceBankAccountIdEmptyText, }) } if branchCode.value == "" { @@ -155,8 +163,8 @@ let make = (~fieldType="") => { pixCNPJ.value, pixKey.value, pixCPF.value, + pixAccountNumber.value, sourceBankAccountId.value, - bankAccountNumber.value, branchCode.value, bankIdentifier.value, )) diff --git a/src/LocaleStrings/ArabicLocale.res b/src/LocaleStrings/ArabicLocale.res index 60e976e17..29c1e16a5 100644 --- a/src/LocaleStrings/ArabicLocale.res +++ b/src/LocaleStrings/ArabicLocale.res @@ -163,6 +163,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `مفتاح Pix لا يمكن أن يكون فارغًا`, pixKeyPlaceholder: `أدخل مفتاح Pix`, pixKeyLabel: `مفتاح Pix`, + pixAccountNumberEmptyText: "لا يمكن أن يكون رقم حساب Pix فارغًا", + pixAccountNumberLabel: "رقم حساب Pix", + pixAccountNumberPlaceholder: "أدخل رقم حساب Pix", sourceBankAccountIdEmptyText: `لا يمكن أن يكون معرف الحساب المصرفي المصدر فارغاً`, branchCodeEmptyText: `لا يمكن أن يكون رمز الفرع فارغاً`, bankIdentifierEmptyText: `لا يمكن أن يكون معرف البنك فارغاً`, @@ -271,4 +274,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "افتح تطبيق البنك الخاص بك وقم بتفويض طلب الدفع. سيتم تحديث الحالة تلقائيًا بعد التأكيد.", branchCodeLabel: "رمز الفرع", bankIdentifierLabel: "معرف البنك", + branchCodePlaceholder: "أدخل رمز الفرع", + bankIdentifierPlaceholder: "أدخل معرف البنك", } diff --git a/src/LocaleStrings/CatalanLocale.res b/src/LocaleStrings/CatalanLocale.res index 4517d560b..96cfe1823 100644 --- a/src/LocaleStrings/CatalanLocale.res +++ b/src/LocaleStrings/CatalanLocale.res @@ -162,6 +162,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `La clau Pix no pot estar buida`, pixKeyPlaceholder: `Introdueix la clau Pix`, pixKeyLabel: `Clau Pix`, + pixAccountNumberEmptyText: `El número de compte Pix no pot estar buit`, + pixAccountNumberLabel: "Nombre de compte Pix", + pixAccountNumberPlaceholder: `Introduïu el nombre de compte Pix`, sourceBankAccountIdEmptyText: `L'identificador del compte bancari d'origen no pot estar buit`, branchCodeEmptyText: `El codi de sucursal no pot estar buit`, bankIdentifierEmptyText: `L'identificador bancari no pot estar buit`, @@ -270,4 +273,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Obriu la vostra aplicació bancària i autoritzeu la sol·licitud de pagament. L'estat s'actualitzarà automàticament un cop confirmat.`, branchCodeLabel: "Codi de sucursal", bankIdentifierLabel: "Identificador bancari", + branchCodePlaceholder: `Introduïu el codi de sucursal`, + bankIdentifierPlaceholder: `Introduïu l'identificador bancari`, } diff --git a/src/LocaleStrings/ChineseLocale.res b/src/LocaleStrings/ChineseLocale.res index 41f5e8823..76ca5c133 100644 --- a/src/LocaleStrings/ChineseLocale.res +++ b/src/LocaleStrings/ChineseLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix 密钥不能为空`, pixKeyPlaceholder: `输入 Pix 密钥`, pixKeyLabel: `Pix 密钥`, + pixAccountNumberEmptyText: "Pix账户号码不能为空", + pixAccountNumberLabel: "Pix账户号码", + pixAccountNumberPlaceholder: "输入Pix账户号码", sourceBankAccountIdEmptyText: `源银行账户ID不能为空`, branchCodeEmptyText: `支行代码不能为空`, bankIdentifierEmptyText: `银行标识符不能为空`, @@ -266,4 +269,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "打开您的银行应用程序并授权付款请求。确认后状态将自动更新。", branchCodeLabel: "支行代码", bankIdentifierLabel: "银行识别码", + branchCodePlaceholder: "输入分行代码", + bankIdentifierPlaceholder: "输入银行识别码", } diff --git a/src/LocaleStrings/DeutschLocale.res b/src/LocaleStrings/DeutschLocale.res index 5cede36d6..d18210086 100644 --- a/src/LocaleStrings/DeutschLocale.res +++ b/src/LocaleStrings/DeutschLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix-Schlüssel darf nicht leer sein`, pixKeyPlaceholder: `Geben Sie den Pix-Schlüssel ein`, pixKeyLabel: `Pix-Schlüssel`, + pixAccountNumberEmptyText: `Pix-Kontonummer darf nicht leer sein`, + pixAccountNumberLabel: "Pix-Kontonummer", + pixAccountNumberPlaceholder: "Pix-Kontonummer eingeben", sourceBankAccountIdEmptyText: `Quell-Bankkonten-ID darf nicht leer sein`, branchCodeEmptyText: `Bankleitzahl darf nicht leer sein`, bankIdentifierEmptyText: `Bankkennung darf nicht leer sein`, @@ -269,4 +272,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Öffnen Sie Ihre Banking-Anwendung und autorisieren Sie die Zahlungsanforderung. Der Status wird automatisch aktualisiert, sobald die Bestätigung erfolgt ist.`, branchCodeLabel: "Bankleitzahl", bankIdentifierLabel: "Bankkennung", + branchCodePlaceholder: "Bankleitzahl eingeben", + bankIdentifierPlaceholder: "Bankkennung eingeben", } diff --git a/src/LocaleStrings/DutchLocale.res b/src/LocaleStrings/DutchLocale.res index 530e82ae1..972f9a045 100644 --- a/src/LocaleStrings/DutchLocale.res +++ b/src/LocaleStrings/DutchLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix-sleutel mag niet leeg zijn`, pixKeyPlaceholder: `Voer Pix-sleutel in`, pixKeyLabel: `Pix-sleutel`, + pixAccountNumberEmptyText: "Pix-rekeningnummer mag niet leeg zijn", + pixAccountNumberLabel: "Pix-rekeningnummer", + pixAccountNumberPlaceholder: "Voer het Pix-rekeningnummer in", sourceBankAccountIdEmptyText: `Bron bankrekeningnummer mag niet leeg zijn`, branchCodeEmptyText: `Bankfiliaalkode mag niet leeg zijn`, bankIdentifierEmptyText: `Bankidentificatie mag niet leeg zijn`, @@ -268,4 +271,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "Open uw bankieren-applicatie en autoriseer het betalingsverzoek. De status wordt automatisch bijgewerkt zodra dit is bevestigd.", branchCodeLabel: "Filiaalcode", bankIdentifierLabel: "Bankidentificatie", + branchCodePlaceholder: "Voer de filiaalcode in", + bankIdentifierPlaceholder: "Voer de bankidentificatie in", } diff --git a/src/LocaleStrings/EnglishGBLocale.res b/src/LocaleStrings/EnglishGBLocale.res index 0f7446869..a7bde7eb1 100644 --- a/src/LocaleStrings/EnglishGBLocale.res +++ b/src/LocaleStrings/EnglishGBLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix key cannot be empty`, pixKeyPlaceholder: `Enter Pix key`, pixKeyLabel: `Pix key`, + pixAccountNumberEmptyText: `Pix Account Number cannot be empty`, + pixAccountNumberLabel: "Pix Account Number", + pixAccountNumberPlaceholder: "Enter Pix account number", sourceBankAccountIdEmptyText: `Source Bank Account ID cannot be empty`, branchCodeEmptyText: `Branch Code cannot be empty`, bankIdentifierEmptyText: `Bank Identifier cannot be empty`, @@ -268,4 +271,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "Open your banking application and authorise the payment request. The status will be updated automatically once confirmed.", branchCodeLabel: "Branch Code", bankIdentifierLabel: "Bank Identifier", + branchCodePlaceholder: "Enter branch code", + bankIdentifierPlaceholder: "Enter bank identifier", } diff --git a/src/LocaleStrings/EnglishLocale.res b/src/LocaleStrings/EnglishLocale.res index 22a6fc017..cd5bb9baa 100644 --- a/src/LocaleStrings/EnglishLocale.res +++ b/src/LocaleStrings/EnglishLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix key cannot be empty`, pixKeyPlaceholder: `Enter Pix key`, pixKeyLabel: `Pix key`, + pixAccountNumberEmptyText: `Pix Account Number cannot be empty`, + pixAccountNumberLabel: "Pix Account Number", + pixAccountNumberPlaceholder: "Enter Pix account number", sourceBankAccountIdEmptyText: `Source Bank Account ID cannot be empty`, branchCodeEmptyText: `Branch Code cannot be empty`, bankIdentifierEmptyText: `Bank Identifier cannot be empty`, @@ -268,4 +271,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "Open your banking application and authorize the payment request. The status will be updated automatically once confirmed.", branchCodeLabel: "Branch Code", bankIdentifierLabel: "Bank Identifier", + branchCodePlaceholder: "Enter branch code", + bankIdentifierPlaceholder: "Enter bank identifier", } diff --git a/src/LocaleStrings/FrenchBelgiumLocale.res b/src/LocaleStrings/FrenchBelgiumLocale.res index f1c762d01..8198ce4cf 100644 --- a/src/LocaleStrings/FrenchBelgiumLocale.res +++ b/src/LocaleStrings/FrenchBelgiumLocale.res @@ -162,6 +162,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `La clé Pix ne peut pas être vide`, pixKeyPlaceholder: `Entrez la clé Pix`, pixKeyLabel: `Clé Pix`, + pixAccountNumberEmptyText: `Le numéro de compte Pix ne peut pas être vide`, + pixAccountNumberLabel: `Numéro de compte Pix`, + pixAccountNumberPlaceholder: `Entrez le numéro de compte Pix`, sourceBankAccountIdEmptyText: `L'identifiant du compte bancaire source ne peut pas être vide`, branchCodeEmptyText: `Le code de la succursale ne peut pas être vide`, bankIdentifierEmptyText: `L'identifiant bancaire ne peut pas être vide`, @@ -270,4 +273,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Ouvrez votre application bancaire et autorisez la demande de paiement. Le statut sera mis à jour automatiquement une fois la confirmation effectuée.`, branchCodeLabel: "Code agence", bankIdentifierLabel: "Identifiant bancaire", + branchCodePlaceholder: "Entrez le code de la succursale", + bankIdentifierPlaceholder: `Entrez l'identifiant bancaire`, } diff --git a/src/LocaleStrings/FrenchLocale.res b/src/LocaleStrings/FrenchLocale.res index 8f2224914..8016810cf 100644 --- a/src/LocaleStrings/FrenchLocale.res +++ b/src/LocaleStrings/FrenchLocale.res @@ -162,6 +162,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `La clé Pix ne peut pas être vide`, pixKeyPlaceholder: `Entrez la clé Pix`, pixKeyLabel: `Clé Pix`, + pixAccountNumberEmptyText: `Le numéro de compte Pix ne peut pas être vide`, + pixAccountNumberLabel: `Numéro de compte Pix`, + pixAccountNumberPlaceholder: `Entrez le numéro de compte Pix`, sourceBankAccountIdEmptyText: `L'identifiant du compte bancaire source ne peut pas être vide`, branchCodeEmptyText: `Le code de la succursale ne peut pas être vide`, bankIdentifierEmptyText: `L'identifiant bancaire ne peut pas être vide`, @@ -270,4 +273,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Ouvrez votre application bancaire et autorisez la demande de paiement. Le statut sera mis à jour automatiquement une fois la confirmation effectuée.`, branchCodeLabel: "Code agence", bankIdentifierLabel: "Identifiant bancaire", + branchCodePlaceholder: "Entrez le code de la succursale", + bankIdentifierPlaceholder: `Entrez l'identifiant bancaire`, } diff --git a/src/LocaleStrings/HebrewLocale.res b/src/LocaleStrings/HebrewLocale.res index 8f9512c96..490244897 100644 --- a/src/LocaleStrings/HebrewLocale.res +++ b/src/LocaleStrings/HebrewLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `מפתח Pix לא יכול להיות ריק`, pixKeyPlaceholder: `הכנס מפתח Pix`, pixKeyLabel: `מפתח Pix`, + pixAccountNumberEmptyText: "מספר חשבון Pix לא יכול להיות ריק", + pixAccountNumberLabel: "מספר חשבון Pix", + pixAccountNumberPlaceholder: "הזן מספר חשבון Pix", sourceBankAccountIdEmptyText: `מזהה חשבון בנק מקור לא יכול להיות ריק`, branchCodeEmptyText: `קוד סניף לא יכול להיות ריק`, bankIdentifierEmptyText: `מזהה בנק לא יכול להיות ריק`, @@ -269,4 +272,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "פתח את אפליקציית הבנק שלך ואשר את בקשת התשלום. הסטטוס יתעדכן אוטומטית לאחר האישור.", branchCodeLabel: "קוד סניף", bankIdentifierLabel: "מזהה בנק", + branchCodePlaceholder: "הזן קוד סניף", + bankIdentifierPlaceholder: "הזן מזהה בנק", } diff --git a/src/LocaleStrings/ItalianLocale.res b/src/LocaleStrings/ItalianLocale.res index 3e4c32fb2..953b15da6 100644 --- a/src/LocaleStrings/ItalianLocale.res +++ b/src/LocaleStrings/ItalianLocale.res @@ -162,6 +162,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `La chiave Pix non può essere vuota`, pixKeyPlaceholder: `Inserisci la chiave Pix`, pixKeyLabel: `Chiave Pix`, + pixAccountNumberEmptyText: `Il numero di conto Pix non può essere vuoto`, + pixAccountNumberLabel: "Numero di conto Pix", + pixAccountNumberPlaceholder: "Inserisci il numero di conto Pix", sourceBankAccountIdEmptyText: `L'ID del conto bancario di origine non può essere vuoto`, branchCodeEmptyText: `Il codice di filiale non può essere vuoto`, bankIdentifierEmptyText: `L'identificatore bancario non può essere vuoto`, @@ -270,4 +273,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Apri la tua applicazione bancaria e autorizza la richiesta di pagamento. Lo stato verrà aggiornato automaticamente una volta confermato.`, branchCodeLabel: "Codice filiale", bankIdentifierLabel: "Identificativo bancario", + branchCodePlaceholder: "Inserisci il codice filiale", + bankIdentifierPlaceholder: `Inserisci l'identificativo bancario`, } diff --git a/src/LocaleStrings/JapaneseLocale.res b/src/LocaleStrings/JapaneseLocale.res index 69bba352d..21171f266 100644 --- a/src/LocaleStrings/JapaneseLocale.res +++ b/src/LocaleStrings/JapaneseLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pixキーは空にできません`, pixKeyPlaceholder: `Pixキーを入力`, pixKeyLabel: `Pixキー`, + pixAccountNumberEmptyText: "Pixアカウント番号を入力してください", + pixAccountNumberLabel: "Pixアカウント番号", + pixAccountNumberPlaceholder: "Pixアカウント番号を入力", sourceBankAccountIdEmptyText: `送金元銀行口座IDを入力してください`, branchCodeEmptyText: `支店コードを入力してください`, bankIdentifierEmptyText: `銀行識別子を入力してください`, @@ -267,4 +270,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "銀行アプリケーションを開き、支払いリクエストを承認してください。確認後、ステータスは自動的に更新されます。", branchCodeLabel: "支店コード", bankIdentifierLabel: "銀行識別コード", + branchCodePlaceholder: "支店コードを入力", + bankIdentifierPlaceholder: "銀行識別コードを入力", } diff --git a/src/LocaleStrings/LocaleStringTypes.res b/src/LocaleStrings/LocaleStringTypes.res index d8b3a92d0..d8a79295c 100644 --- a/src/LocaleStrings/LocaleStringTypes.res +++ b/src/LocaleStrings/LocaleStringTypes.res @@ -149,6 +149,9 @@ type localeStrings = { pixKeyEmptyText: string, pixKeyLabel: string, pixKeyPlaceholder: string, + pixAccountNumberEmptyText: string, + pixAccountNumberLabel: string, + pixAccountNumberPlaceholder: string, sourceBankAccountIdEmptyText: string, branchCodeEmptyText: string, bankIdentifierEmptyText: string, @@ -253,6 +256,8 @@ type localeStrings = { loaderPaymentConfirmBankingAppSubtitle: string, branchCodeLabel: string, bankIdentifierLabel: string, + branchCodePlaceholder: string, + bankIdentifierPlaceholder: string, } type constantStrings = { diff --git a/src/LocaleStrings/PolishLocale.res b/src/LocaleStrings/PolishLocale.res index 7938b9ac4..3caf309e7 100644 --- a/src/LocaleStrings/PolishLocale.res +++ b/src/LocaleStrings/PolishLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Klucz Pix nie może być pusty`, pixKeyPlaceholder: `Wprowadź klucz Pix`, pixKeyLabel: `Klucz Pix`, + pixAccountNumberEmptyText: `Numer konta Pix nie może być pusty`, + pixAccountNumberLabel: "Numer konta Pix", + pixAccountNumberPlaceholder: `Wprowadź numer konta Pix`, sourceBankAccountIdEmptyText: `Identyfikator źródłowego konta bankowego nie może być pusty`, branchCodeEmptyText: `Kod oddziału nie może być pusty`, bankIdentifierEmptyText: `Identyfikator banku nie może być pusty`, @@ -269,4 +272,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Otwórz swoją aplikację bankową i autoryzuj żądanie płatności. Status zostanie automatycznie zaktualizowany po potwierdzeniu.`, branchCodeLabel: `Kod oddziału`, bankIdentifierLabel: "Identyfikator banku", + branchCodePlaceholder: `Wprowadź kod oddziału`, + bankIdentifierPlaceholder: `Wprowadź identyfikator banku`, } diff --git a/src/LocaleStrings/PortugueseLocale.res b/src/LocaleStrings/PortugueseLocale.res index 0f79e89c1..10b09651b 100644 --- a/src/LocaleStrings/PortugueseLocale.res +++ b/src/LocaleStrings/PortugueseLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `A chave Pix não pode estar vazia`, pixKeyPlaceholder: `Digite a chave Pix`, pixKeyLabel: `Chave Pix`, + pixAccountNumberEmptyText: `O número da conta Pix não pode estar vazio`, + pixAccountNumberLabel: `Número da conta Pix`, + pixAccountNumberPlaceholder: `Insira o número da conta Pix`, sourceBankAccountIdEmptyText: `O ID da conta bancária de origem não pode estar vazio`, branchCodeEmptyText: `O código de agência não pode estar vazio`, bankIdentifierEmptyText: `O identificador bancário não pode estar vazio`, @@ -269,4 +272,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Abra seu aplicativo bancário e autorize a solicitação de pagamento. O status será atualizado automaticamente após a confirmação.`, branchCodeLabel: `Código da agência`, bankIdentifierLabel: `Identificador bancário`, + branchCodePlaceholder: `Insira o código da agência`, + bankIdentifierPlaceholder: `Insira o identificador bancário`, } diff --git a/src/LocaleStrings/RussianLocale.res b/src/LocaleStrings/RussianLocale.res index 2bb040c39..2958a58b8 100644 --- a/src/LocaleStrings/RussianLocale.res +++ b/src/LocaleStrings/RussianLocale.res @@ -169,6 +169,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Ключ Pix не может быть пустым`, pixKeyPlaceholder: `Введите ключ Pix`, pixKeyLabel: `Ключ Pix`, + pixAccountNumberEmptyText: "Номер счета Pix не может быть пустым", + pixAccountNumberLabel: "Номер счета Pix", + pixAccountNumberPlaceholder: "Введите номер счета Pix", sourceBankAccountIdEmptyText: `Идентификатор исходного банковского счета не может быть пустым`, branchCodeEmptyText: `Код отделения не может быть пустым`, bankIdentifierEmptyText: `Идентификатор банка не может быть пустым`, @@ -277,4 +280,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "Откройте ваше банковское приложение и подтвердите запрос на оплату. Статус обновится автоматически после подтверждения.", branchCodeLabel: "Код отделения", bankIdentifierLabel: "Идентификатор банка", + branchCodePlaceholder: "Введите код отделения", + bankIdentifierPlaceholder: "Введите идентификатор банка", } diff --git a/src/LocaleStrings/SpanishLocale.res b/src/LocaleStrings/SpanishLocale.res index 7f8f06dab..c1ed38052 100644 --- a/src/LocaleStrings/SpanishLocale.res +++ b/src/LocaleStrings/SpanishLocale.res @@ -161,6 +161,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `La clave Pix no puede estar vacía`, pixKeyPlaceholder: `Introduce la clave Pix`, pixKeyLabel: `Clave Pix`, + pixAccountNumberEmptyText: `El número de cuenta Pix no puede estar vacío`, + pixAccountNumberLabel: `Número de cuenta Pix`, + pixAccountNumberPlaceholder: `Ingrese el número de cuenta Pix`, sourceBankAccountIdEmptyText: `El ID de la cuenta bancaria de origen no puede estar vacío`, branchCodeEmptyText: `El código de sucursal no puede estar vacío`, bankIdentifierEmptyText: `El identificador bancario no puede estar vacío`, @@ -269,4 +272,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Abra su aplicación bancaria y autorice la solicitud de pago. El estado se actualizará automáticamente una vez confirmado.`, branchCodeLabel: `Código de sucursal`, bankIdentifierLabel: "Identificador bancario", + branchCodePlaceholder: `Ingrese el código de sucursal`, + bankIdentifierPlaceholder: "Ingrese el identificador bancario", } diff --git a/src/LocaleStrings/SwedishLocale.res b/src/LocaleStrings/SwedishLocale.res index 2a94e5c6d..dc304fc27 100644 --- a/src/LocaleStrings/SwedishLocale.res +++ b/src/LocaleStrings/SwedishLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix-nyckel kan inte vara tom`, pixKeyPlaceholder: `Ange Pix-nyckel`, pixKeyLabel: `Pix-nyckel`, + pixAccountNumberEmptyText: `Pix-kontonummer får inte vara tomt`, + pixAccountNumberLabel: "Pix-kontonummer", + pixAccountNumberPlaceholder: "Ange Pix-kontonummer", sourceBankAccountIdEmptyText: `Käll bankkonto-ID kan inte vara tomt`, branchCodeEmptyText: `Bankfilialskod kan inte vara tom`, bankIdentifierEmptyText: `Bankidentifierare kan inte vara tom`, @@ -268,4 +271,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: `Öppna din bankapplikation och godkänn betalningsförfrågan. Statusen uppdateras automatiskt när den har bekräftats.`, branchCodeLabel: "Kontorskod", bankIdentifierLabel: "Bankidentifierare", + branchCodePlaceholder: "Ange filialkod", + bankIdentifierPlaceholder: "Ange bankidentifierare", } diff --git a/src/LocaleStrings/TraditionalChineseLocale.res b/src/LocaleStrings/TraditionalChineseLocale.res index e2cdd3267..5c9d5ea97 100644 --- a/src/LocaleStrings/TraditionalChineseLocale.res +++ b/src/LocaleStrings/TraditionalChineseLocale.res @@ -160,6 +160,9 @@ let localeStrings: LocaleStringTypes.localeStrings = { pixKeyEmptyText: `Pix 金鑰不能為空`, pixKeyPlaceholder: `輸入 Pix 金鑰`, pixKeyLabel: `Pix 金鑰`, + pixAccountNumberEmptyText: "Pix帳戶號碼不能為空", + pixAccountNumberLabel: "Pix帳戶號碼", + pixAccountNumberPlaceholder: "輸入Pix帳戶號碼", sourceBankAccountIdEmptyText: `來源銀行帳戶ID不能為空`, branchCodeEmptyText: `分行代碼不能為空`, bankIdentifierEmptyText: `銀行識別碼不能為空`, @@ -266,4 +269,6 @@ let localeStrings: LocaleStringTypes.localeStrings = { loaderPaymentConfirmBankingAppSubtitle: "開啟您的銀行應用程式並授權付款請求。確認後狀態將自動更新。", branchCodeLabel: "分行代碼", bankIdentifierLabel: "銀行識別碼", + branchCodePlaceholder: "輸入分行代碼", + bankIdentifierPlaceholder: "輸入銀行識別碼", } diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index ace5dd9e6..6d35ac500 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -70,6 +70,7 @@ type paymentMethodsFields = | SourceBankAccountId | BranchCode | BankIdentifier + | PixAccountNumber | GiftCardNumber | GiftCardPin @@ -93,6 +94,7 @@ let getPaymentMethodsFieldsOrder = paymentMethodField => { | PixCPF => 9 | CryptoCurrencyNetworks => 10 | PixCNPJ => 10 + | PixAccountNumber => 11 | InfoElement => 99 | _ => 3 } @@ -735,6 +737,7 @@ let getPaymentMethodsFieldTypeFromString = (str, isBancontact) => { | ("user_cpf", _) => PixCPF | ("user_cnpj", _) => PixCNPJ | ("user_pix_key", _) => PixKey + | ("user_pix_account_number", _) => PixAccountNumber | ("user_bank_account_number", _) => BankAccountNumber | ("user_iban", _) => BankAccountNumber | ("user_source_bank_account_id", _) => SourceBankAccountId diff --git a/src/Utilities/DynamicFieldsUtils.res b/src/Utilities/DynamicFieldsUtils.res index 42fdcc939..92289b4fe 100644 --- a/src/Utilities/DynamicFieldsUtils.res +++ b/src/Utilities/DynamicFieldsUtils.res @@ -202,6 +202,7 @@ let useRequiredFieldsEmptyAndValid = ( let pixCNPJ = Recoil.useRecoilValueFromAtom(userPixCNPJ) let pixCPF = Recoil.useRecoilValueFromAtom(userPixCPF) let pixKey = Recoil.useRecoilValueFromAtom(userPixKey) + let pixAccountNumber = Recoil.useRecoilValueFromAtom(userPixAccountNumber) let fullName = Recoil.useRecoilValueFromAtom(userFullName) let billingName = Recoil.useRecoilValueFromAtom(userBillingName) let line1 = Recoil.useRecoilValueFromAtom(userAddressline1) @@ -276,6 +277,7 @@ let useRequiredFieldsEmptyAndValid = ( | PixCNPJ => pixCNPJ.isValid->Option.getOr(false) | PixCPF => pixCPF.isValid->Option.getOr(false) | PixKey => pixKey.isValid->Option.getOr(false) + | PixAccountNumber => pixAccountNumber.isValid->Option.getOr(false) | BankAccountNumber | IBAN => bankAccountNumber.value !== "" @@ -315,6 +317,7 @@ let useRequiredFieldsEmptyAndValid = ( | PixCNPJ => pixCNPJ.value === "" | PixCPF => pixCPF.value === "" | PixKey => pixKey.value === "" + | PixAccountNumber => pixAccountNumber.value === "" | CryptoCurrencyNetworks => cryptoCurrencyNetworks === "" | Currency(currencyArr) => currency === "" && currencyArr->Array.length > 0 | DocumentType(optArr) => documentType === "" && optArr->Array.length > 0 @@ -367,6 +370,7 @@ let useRequiredFieldsEmptyAndValid = ( pixCNPJ.value, pixKey.value, pixCPF.value, + pixAccountNumber.value, giftCardPin.value, giftCardNumber.value, isCardValid, @@ -413,6 +417,7 @@ let useSetInitialRequiredFields = ( let (pixCNPJ, setPixCNPJ) = Recoil.useRecoilState(userPixCNPJ) let (pixCPF, setPixCPF) = Recoil.useRecoilState(userPixCPF) let (pixKey, setPixKey) = Recoil.useRecoilState(userPixKey) + let (pixAccountNumber, setPixAccountNumber) = Recoil.useRecoilState(userPixAccountNumber) let (country, setCountry) = Recoil.useRecoilState(userCountry) let (selectedBank, setSelectedBank) = Recoil.useRecoilState(userBank) @@ -525,6 +530,7 @@ let useSetInitialRequiredFields = ( | PixKey => setFields(setPixKey, pixKey, requiredField, false) | PixCNPJ => setFields(setPixCNPJ, pixCNPJ, requiredField, false) | PixCPF => setFields(setPixCPF, pixCPF, requiredField, false) + | PixAccountNumber => setFields(setPixAccountNumber, pixAccountNumber, requiredField, false) | BillingName => setFields(setBillingName, billingName, requiredField, true) | Country | AddressCountry(_) => @@ -609,6 +615,7 @@ let useRequiredFieldsBody = ( let pixCNPJ = Recoil.useRecoilValueFromAtom(userPixCNPJ) let pixCPF = Recoil.useRecoilValueFromAtom(userPixCPF) let pixKey = Recoil.useRecoilValueFromAtom(userPixKey) + let pixAccountNumber = Recoil.useRecoilValueFromAtom(userPixAccountNumber) let fullName = Recoil.useRecoilValueFromAtom(userFullName) let billingName = Recoil.useRecoilValueFromAtom(userBillingName) let line1 = Recoil.useRecoilValueFromAtom(userAddressline1) @@ -691,6 +698,7 @@ let useRequiredFieldsBody = ( | PixCNPJ => pixCNPJ.value | PixCPF => pixCPF.value | PixKey => pixKey.value + | PixAccountNumber => pixAccountNumber.value | IBAN | BankAccountNumber => bankAccountNumber.value @@ -784,6 +792,7 @@ let useRequiredFieldsBody = ( pixCNPJ.value, pixCPF.value, pixKey.value, + pixAccountNumber.value, documentType, documentNumber.value, city.value, @@ -825,6 +834,7 @@ let isFieldTypeToRenderOutsideBilling = (fieldType: PaymentMethodsRecord.payment | PixKey | PixCPF | PixCNPJ + | PixAccountNumber | DateOfBirth | Currency(_) | DocumentType(_) diff --git a/src/Utilities/RecoilAtoms.res b/src/Utilities/RecoilAtoms.res index eface4305..6340e83a6 100644 --- a/src/Utilities/RecoilAtoms.res +++ b/src/Utilities/RecoilAtoms.res @@ -75,6 +75,7 @@ let userVpaId = Recoil.atom("userVpaId", defaultFieldValues) let userPixKey = Recoil.atom("userPixKey", defaultFieldValues) let userPixCPF = Recoil.atom("userPixCPF", defaultFieldValues) let userPixCNPJ = Recoil.atom("userPixCNPJ", defaultFieldValues) +let userPixAccountNumber = Recoil.atom("userPixAccountNumber", defaultFieldValues) let userDocumentType = Recoil.atom("userDocumentType", "") let userDocumentNumber = Recoil.atom("userDocumentNumber", defaultFieldValues) let isCompleteCallbackUsed = Recoil.atom("isCompleteCallbackUsed", false) From 8807fe1e440db43e2d0ebefe34c204d304dc9462 Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Tue, 14 Apr 2026 12:43:38 +0530 Subject: [PATCH 5/6] refactor: apply suggested changes --- src/Payments/PaymentMethodsRecord.res | 1 - src/hyper-loader/LoaderPaymentElement.res | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index 77aac49c7..0bb7f5e01 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -94,7 +94,6 @@ let getPaymentMethodsFieldsOrder = paymentMethodField => { | PixCPF => 9 | CryptoCurrencyNetworks => 10 | PixCNPJ => 10 - | PixAccountNumber => 11 | InfoElement => 99 | _ => 3 } diff --git a/src/hyper-loader/LoaderPaymentElement.res b/src/hyper-loader/LoaderPaymentElement.res index ad192684a..86541a615 100644 --- a/src/hyper-loader/LoaderPaymentElement.res +++ b/src/hyper-loader/LoaderPaymentElement.res @@ -21,7 +21,7 @@ let make = ( ) => { try { let logger = logger->Option.getOr(LoggerUtils.defaultLoggerConfig) - let optionsWithLocale = { + let updatedOptions = { let dict = options->Utils.getDictFromJson->Dict.copy dict->Dict.set("locale", locale->JSON.Encode.string) dict->JSON.Encode.object @@ -341,7 +341,7 @@ let make = ( [ ("fullScreenIframeMounted", true->JSON.Encode.bool), ("metadata", fullscreenMetadata.contents), - ("options", optionsWithLocale), + ("options", updatedOptions), ]->Dict.fromArray, ) } @@ -350,7 +350,7 @@ let make = ( [ ("fullScreenIframeMounted", true->JSON.Encode.bool), ("metadata", fullscreenMetadata.contents), - ("options", optionsWithLocale), + ("options", updatedOptions), ]->Dict.fromArray, ) let fullScreenEle = Window.querySelector(`#orca-fullscreen`) @@ -372,7 +372,7 @@ let make = ( mainElement->Window.iframePostMessage( [ ("fullScreenIframeMounted", false->JSON.Encode.bool), - ("options", optionsWithLocale), + ("options", updatedOptions), ]->Dict.fromArray, ) } From 0bfbff6efa1f4550510aa53bfa53a272d6dad0bb Mon Sep 17 00:00:00 2001 From: "aritro.ghosh" Date: Tue, 14 Apr 2026 14:17:45 +0530 Subject: [PATCH 6/6] refactor: apply suggested changes --- src/Components/PaymentLoader.res | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Components/PaymentLoader.res b/src/Components/PaymentLoader.res index fec99a399..30a794442 100644 --- a/src/Components/PaymentLoader.res +++ b/src/Components/PaymentLoader.res @@ -20,6 +20,7 @@ let make = () => { ->Promise.thenResolve(localeString => { setConfig(prev => {...prev, localeString}) }) + ->Promise.catch(_ => Promise.resolve()) ->ignore let metadata = dict->getJsonObjectFromDict("metadata") let metaDataDict = metadata->JSON.Decode.object->Option.getOr(Dict.make())