From d24954aef518caf2e6500e8b5877158b81bb6a72 Mon Sep 17 00:00:00 2001 From: Sanskar Atrey Date: Thu, 7 Nov 2024 12:46:56 +0530 Subject: [PATCH 1/5] =?UTF-8?q?test:=20added=20nested=20iframe=20test=20su?= =?UTF-8?q?pport=20in=20cypress=20and=20external=203ds=20ne=E2=80=A6=20(#7?= =?UTF-8?q?64)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Shiva Nandan --- .../e2e/external-3DS-netcetera-e2e-test.cy.ts | 81 +++++++++++++++++++ cypress-tests/cypress/support/commands.ts | 8 ++ cypress-tests/cypress/support/types.ts | 1 + cypress-tests/cypress/support/utils.ts | 9 ++- 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 cypress-tests/cypress/e2e/external-3DS-netcetera-e2e-test.cy.ts diff --git a/cypress-tests/cypress/e2e/external-3DS-netcetera-e2e-test.cy.ts b/cypress-tests/cypress/e2e/external-3DS-netcetera-e2e-test.cy.ts new file mode 100644 index 000000000..333ceb201 --- /dev/null +++ b/cypress-tests/cypress/e2e/external-3DS-netcetera-e2e-test.cy.ts @@ -0,0 +1,81 @@ +import * as testIds from "../../../src/Utilities/TestUtils.bs"; +import { getClientURL, netceteraChallengeTestCard, createPaymentBody, changeObjectKeyValue, connectorProfileIdMapping, connectorEnum } from "../support/utils"; +describe("External 3DS using Netcetera Checks", () => { + let getIframeBody: () => Cypress.Chainable>; + const publishableKey = Cypress.env('HYPERSWITCH_PUBLISHABLE_KEY') + const secretKey = Cypress.env('HYPERSWITCH_SECRET_KEY') + changeObjectKeyValue(createPaymentBody, "profile_id", connectorProfileIdMapping.get(connectorEnum.NETCETERA)) + changeObjectKeyValue(createPaymentBody, "request_external_three_ds_authentication", true) + changeObjectKeyValue(createPaymentBody, "authentication_type", "three_ds") + let iframeSelector = + "#orca-payment-element-iframeRef-orca-elements-payment-element-payment-element"; + + beforeEach(() => { + getIframeBody = () => cy.iframe(iframeSelector); + cy.createPaymentIntent(secretKey, createPaymentBody).then(() => { + cy.getGlobalState("clientSecret").then((clientSecret) => { + + cy.visit(getClientURL(clientSecret, publishableKey)); + }); + + }) + }); + + + it("title rendered correctly", () => { + cy.contains("Hyperswitch Unified Checkout").should("be.visible"); + }); + + it("orca-payment-element iframe loaded", () => { + cy.get( + "#orca-payment-element-iframeRef-orca-elements-payment-element-payment-element" + ) + .should("be.visible") + .its("0.contentDocument") + .its("body"); + }); + + + it('If the user completes the challenge, the payment should be successful.', () => { + getIframeBody().find(`[data-testid=${testIds.addNewCardIcon}]`).click() + getIframeBody().find(`[data-testid=${testIds.cardNoInputTestId}]`).type(netceteraChallengeTestCard) + getIframeBody().find(`[data-testid=${testIds.expiryInputTestId}]`).type("0444") + cy.wait(1000) + getIframeBody().find(`[data-testid=${testIds.cardCVVInputTestId}]`).type("1234") + getIframeBody().get("#submit").click(); + cy.wait(4000) + + cy.nestedIFrame("#threeDsAuthFrame", ($body) => { + cy.wrap($body).find('#otp') + .type('1234') + + cy.wrap($body).find('#sendOtp') + .click() + cy.contains("Thanks for your order!").should("be.visible"); + }) + + }) + + it('If the user closes the challenge, the payment should fail.', () => { + getIframeBody().find(`[data-testid=${testIds.addNewCardIcon}]`).click() + getIframeBody().find(`[data-testid=${testIds.cardNoInputTestId}]`).type(netceteraChallengeTestCard) + getIframeBody().find(`[data-testid=${testIds.expiryInputTestId}]`).type("0444") + cy.wait(1000) + getIframeBody().find(`[data-testid=${testIds.cardCVVInputTestId}]`).type("1234") + getIframeBody().get("#submit").click(); + cy.wait(4000) + + cy.nestedIFrame("#threeDsAuthFrame", ($body) => { + cy.wrap($body) + .find('#cancel') + .click() + cy.contains("Payment Failed!").should("be.visible"); + }) + }) + + +}) + + + + diff --git a/cypress-tests/cypress/support/commands.ts b/cypress-tests/cypress/support/commands.ts index 5a3fe36e2..e04b93f60 100644 --- a/cypress-tests/cypress/support/commands.ts +++ b/cypress-tests/cypress/support/commands.ts @@ -173,3 +173,11 @@ Cypress.Commands.add("createPaymentIntent", (secretKey: string, createPaymentBod Cypress.Commands.add("getGlobalState", (key: any) => { return globalState[key]; }); + +Cypress.Commands.add("nestedIFrame", (selector, callback) => { + cy.iframe("#orca-fullscreen").find(selector).should("exist").should("be.visible").then(($ele) => { + const $body = + $ele.contents().find('body') + callback($body); + }) +}); \ No newline at end of file diff --git a/cypress-tests/cypress/support/types.ts b/cypress-tests/cypress/support/types.ts index d1db388d1..1ad709b50 100644 --- a/cypress-tests/cypress/support/types.ts +++ b/cypress-tests/cypress/support/types.ts @@ -26,6 +26,7 @@ declare global { ): Chainable> createPaymentIntent(secretKey: string, createPaymentBody: Record): Chainable> getGlobalState(key: string): Chainable> + nestedIFrame(selector: string, callback: (body: Chainable>) => void): Chainable; } } } \ No newline at end of file diff --git a/cypress-tests/cypress/support/utils.ts b/cypress-tests/cypress/support/utils.ts index 496d55606..18a484a01 100644 --- a/cypress-tests/cypress/support/utils.ts +++ b/cypress-tests/cypress/support/utils.ts @@ -6,15 +6,17 @@ export const getClientURL = (clientSecret, publishableKey) => { return `${CLIENT_BASE_URL}?isCypressTestMode=true&clientSecret=${clientSecret}&publishableKey=${publishableKey}`; } -export const enum connectorEnum{ +export const enum connectorEnum { TRUSTPAY, ADYEN, - STRIPE + STRIPE, + NETCETERA } export const connectorProfileIdMapping = new Map([ [connectorEnum.TRUSTPAY, "pro_eP323T9e4ApKpilWBfPA"], [connectorEnum.ADYEN, "pro_Kvqzu8WqBZsT1OjHlCj4"], [connectorEnum.STRIPE, "pro_5fVcCxU8MFTYozgtf0P8"], + [connectorEnum.NETCETERA, "pro_h9VHXnJx8s6W4KSZfSUL"] ]); export const createPaymentBody = { @@ -78,7 +80,7 @@ export const createPaymentBody = { } -export const changeObjectKeyValue = (object: Record, key: string, value: string) => { +export const changeObjectKeyValue = (object: Record, key: string, value: boolean | string) => { object[key] = value } @@ -128,3 +130,4 @@ export const adyenTestCard = "4917610000000000"; export const bluesnapTestCard = "4000000000001091"; export const amexTestCard = "378282246310005" export const visaTestCard = "4242424242424242"; +export const netceteraChallengeTestCard = "348638267931507"; \ No newline at end of file From bb98ae66e17baad2638c6b261b293df982de66eb Mon Sep 17 00:00:00 2001 From: sakksham7 <130480324+sakksham7@users.noreply.github.com> Date: Thu, 7 Nov 2024 13:05:46 +0530 Subject: [PATCH 2/5] chore: added dynamic fields for ach (#777) --- src/Payments/ACHBankTransfer.res | 16 ++++++++++++---- src/Payments/PaymentMethodsRecord.res | 1 + src/Utilities/PaymentBody.res | 17 +---------------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/Payments/ACHBankTransfer.res b/src/Payments/ACHBankTransfer.res index c4665addb..98a91da37 100644 --- a/src/Payments/ACHBankTransfer.res +++ b/src/Payments/ACHBankTransfer.res @@ -10,7 +10,8 @@ let make = (~paymentType: CardThemeType.mode) => { let intent = PaymentHelpers.usePaymentIntent(Some(loggerState), BankTransfer) let (email, _) = Recoil.useLoggedRecoilState(userEmailAddress, "email", loggerState) let setComplete = Recoil.useSetRecoilState(fieldsComplete) - let paymentMethodListValue = Recoil.useRecoilValueFromAtom(PaymentUtils.paymentMethodListValue) + + let (requiredFieldsBody, setRequiredFieldsBody) = React.useState(_ => Dict.make()) let complete = email.value != "" && email.isValid->Option.getOr(false) let empty = email.value == "" @@ -27,9 +28,14 @@ let make = (~paymentType: CardThemeType.mode) => { let confirm = json->getDictFromJson->ConfirmType.itemToObjMapper if confirm.doSubmit { if complete { - let (connectors, _) = paymentMethodListValue->PaymentUtils.getConnectors(BankTransfer(ACH)) + let bodyArr = + PaymentBody.dynamicPaymentBody("bank_transfer", "ach") + ->getJsonFromArrayOfJson + ->flattenObject(true) + ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) + ->getArrayOfTupleFromDict intent( - ~bodyArr=PaymentBody.achBankTransferBody(~email=email.value, ~connectors), + ~bodyArr, ~confirmParam=confirm.confirmParams, ~handleUserError=false, ~iframeId, @@ -43,7 +49,9 @@ let make = (~paymentType: CardThemeType.mode) => { useSubmitPaymentData(submitCallback)
- +
diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index 68dea2a52..939697eaf 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -681,6 +681,7 @@ let dynamicFieldsEnabledPaymentMethods = [ "upi_collect", "sepa", "affirm", + "ach", ] let getIsBillingField = requiredFieldType => { diff --git a/src/Utilities/PaymentBody.res b/src/Utilities/PaymentBody.res index c7c8d2356..eaa5c76bb 100644 --- a/src/Utilities/PaymentBody.res +++ b/src/Utilities/PaymentBody.res @@ -654,21 +654,6 @@ let epsBody = (~name, ~bankName) => [ ), ] -let achBankTransferBody = (~email, ~connectors) => [ - ("payment_method", "bank_transfer"->JSON.Encode.string), - ("connector", connectors->Utils.getArrofJsonString->JSON.Encode.array), - ("payment_method_type", "ach"->JSON.Encode.string), - ( - "payment_method_data", - [ - ("billing", [("email", email->JSON.Encode.string)]->Utils.getJsonFromArrayOfJson), - ( - "bank_transfer", - [("ach_bank_transfer", Dict.make()->JSON.Encode.object)]->Utils.getJsonFromArrayOfJson, - ), - ]->Utils.getJsonFromArrayOfJson, - ), -] let bacsBankTransferBody = (~email, ~name, ~connectors) => { let (firstName, lastName) = name->Utils.getFirstAndLastNameFromFullName @@ -945,7 +930,7 @@ let appendRedirectPaymentMethods = [ ] let appendBankeDebitMethods = ["sepa"] -let appendBankTransferMethods = ["sepa"] +let appendBankTransferMethods = ["sepa", "ach"] let getPaymentMethodSuffix = (~paymentMethodType, ~paymentMethod, ~isQrPaymentMethod) => { if isQrPaymentMethod { From 2930ae0d9feff46481e3b4df327e1de304de541a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 7 Nov 2024 07:37:29 +0000 Subject: [PATCH 3/5] chore(release): 0.101.2 [skip ci] ## [0.101.2](https://github.com/juspay/hyperswitch-web/compare/v0.101.1...v0.101.2) (2024-11-07) --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76ecbd4e3..8f5c9c6ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## [0.101.2](https://github.com/juspay/hyperswitch-web/compare/v0.101.1...v0.101.2) (2024-11-07) + ## [0.101.1](https://github.com/juspay/hyperswitch-web/compare/v0.101.0...v0.101.1) (2024-11-07) # [0.101.0](https://github.com/juspay/hyperswitch-web/compare/v0.100.1...v0.101.0) (2024-11-07) diff --git a/package-lock.json b/package-lock.json index 5853054d8..13479c43a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "orca-payment-page", - "version": "0.101.1", + "version": "0.101.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "orca-payment-page", - "version": "0.101.1", + "version": "0.101.2", "hasInstallScript": true, "dependencies": { "@glennsl/rescript-fetch": "^0.2.0", diff --git a/package.json b/package.json index 18e32f89b..7f83f3d0b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "orca-payment-page", - "version": "0.101.1", + "version": "0.101.2", "main": "index.js", "private": true, "dependencies": { From 9ee7a4e25dc176da36b156a0932833c6d1fe2613 Mon Sep 17 00:00:00 2001 From: sakksham7 <130480324+sakksham7@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:48:29 +0530 Subject: [PATCH 4/5] refactor: added utility for mergeAndFlattenToTuples (#778) --- src/Components/DynamicFields.res | 27 ++++++++++++-------------- src/Components/SavedMethods.res | 18 +++-------------- src/Payments/ACHBankTransfer.res | 8 +++----- src/Payments/CardPayment.res | 6 +----- src/Payments/KlarnaSDK.res | 6 +----- src/Payments/PaymentMethodsRecord.res | 23 ---------------------- src/Payments/PaymentMethodsWrapper.res | 7 +------ src/Payments/PaypalSDKHelpers.res | 7 +------ src/Payments/SepaBankTransfer.res | 8 +++----- src/Utilities/ApplePayHelpers.res | 12 ++---------- src/Utilities/DynamicFieldsUtils.res | 23 ++++++++++++++++++++++ src/Utilities/GooglePayHelpers.res | 12 ++---------- src/Utilities/Utils.res | 7 +++++++ 13 files changed, 59 insertions(+), 105 deletions(-) diff --git a/src/Components/DynamicFields.res b/src/Components/DynamicFields.res index ee1fe6e3d..2c6f9ea30 100644 --- a/src/Components/DynamicFields.res +++ b/src/Components/DynamicFields.res @@ -1,4 +1,3 @@ -open RecoilAtoms @react.component let make = ( ~paymentType, @@ -12,7 +11,9 @@ let make = ( ~cvcProps=None, ~isBancontact=false, ) => { + open DynamicFieldsUtils open Utils + open RecoilAtoms let paymentMethodListValue = Recoil.useRecoilValueFromAtom(PaymentUtils.paymentMethodListValue) React.useEffect(() => { @@ -41,10 +42,8 @@ let make = ( paymentMethodTypes.required_fields ->Array.concat(creditRequiredFields) - ->DynamicFieldsUtils.removeRequiredFieldsDuplicates - } else if ( - PaymentMethodsRecord.dynamicFieldsEnabledPaymentMethods->Array.includes(paymentMethodType) - ) { + ->removeRequiredFieldsDuplicates + } else if dynamicFieldsEnabledPaymentMethods->Array.includes(paymentMethodType) { paymentMethodTypes.required_fields } else { [] @@ -52,9 +51,7 @@ let make = ( }, (paymentMethod, paymentMethodTypes.required_fields, paymentMethodType)) let requiredFields = React.useMemo(() => { - requiredFieldsWithBillingDetails->DynamicFieldsUtils.removeBillingDetailsIfUseBillingAddress( - billingAddress, - ) + requiredFieldsWithBillingDetails->removeBillingDetailsIfUseBillingAddress(billingAddress) }, [requiredFieldsWithBillingDetails]) let isAllStoredCardsHaveName = React.useMemo(() => { @@ -69,7 +66,7 @@ let make = ( ~isSavedCardFlow, ~isAllStoredCardsHaveName, ) - ->DynamicFieldsUtils.updateDynamicFields(billingAddress) + ->updateDynamicFields(billingAddress) ->Belt.SortArray.stableSortBy(PaymentMethodsRecord.sortPaymentMethodFields) //<...>// }, (requiredFields, isAllStoredCardsHaveName, isSavedCardFlow)) @@ -255,7 +252,7 @@ let make = ( } } - DynamicFieldsUtils.useRequiredFieldsEmptyAndValid( + useRequiredFieldsEmptyAndValid( ~requiredFields, ~fieldsArr, ~countryNames, @@ -268,14 +265,14 @@ let make = ( ~cvcNumber, ) - DynamicFieldsUtils.useSetInitialRequiredFields( + useSetInitialRequiredFields( ~requiredFields={ billingAddress.usePrefilledValues === Auto ? requiredFieldsWithBillingDetails : requiredFields }, ~paymentMethodType, ) - DynamicFieldsUtils.useRequiredFieldsBody( + useRequiredFieldsBody( ~requiredFields, ~paymentMethodType, ~cardNumber, @@ -286,7 +283,7 @@ let make = ( ~setRequiredFieldsBody, ) - let submitCallback = DynamicFieldsUtils.useSubmitCallback() + let submitCallback = useSubmitCallback() useSubmitPaymentData(submitCallback) let bottomElement = @@ -307,11 +304,11 @@ let make = ( } let dynamicFieldsToRenderOutsideBilling = React.useMemo(() => { - fieldsArr->Array.filter(DynamicFieldsUtils.isFieldTypeToRenderOutsideBilling) + fieldsArr->Array.filter(isFieldTypeToRenderOutsideBilling) }, [fieldsArr]) let dynamicFieldsToRenderInsideBilling = React.useMemo(() => { - fieldsArr->Array.filter(field => !(field->DynamicFieldsUtils.isFieldTypeToRenderOutsideBilling)) + fieldsArr->Array.filter(field => !(field->isFieldTypeToRenderOutsideBilling)) }, [fieldsArr]) let isInfoElementPresent = dynamicFieldsToRenderInsideBilling->Array.includes(InfoElement) diff --git a/src/Components/SavedMethods.res b/src/Components/SavedMethods.res index ae2dbdf1f..377deb887 100644 --- a/src/Components/SavedMethods.res +++ b/src/Components/SavedMethods.res @@ -147,11 +147,7 @@ let make = ( | _ => // TODO - To be replaced with proper error message intent( - ~bodyArr=savedPaymentMethodBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict, + ~bodyArr=savedPaymentMethodBody->mergeAndFlattenToTuples(requiredFieldsBody), ~confirmParam=confirm.confirmParams, ~handleUserError=false, ~manualRetry=isManualRetryEnabled, @@ -168,11 +164,7 @@ let make = ( | _ => // TODO - To be replaced with proper error message intent( - ~bodyArr=savedPaymentMethodBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict, + ~bodyArr=savedPaymentMethodBody->mergeAndFlattenToTuples(requiredFieldsBody), ~confirmParam=confirm.confirmParams, ~handleUserError=false, ~manualRetry=isManualRetryEnabled, @@ -180,11 +172,7 @@ let make = ( } | _ => intent( - ~bodyArr=savedPaymentMethodBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict, + ~bodyArr=savedPaymentMethodBody->mergeAndFlattenToTuples(requiredFieldsBody), ~confirmParam=confirm.confirmParams, ~handleUserError=false, ~manualRetry=isManualRetryEnabled, diff --git a/src/Payments/ACHBankTransfer.res b/src/Payments/ACHBankTransfer.res index 98a91da37..c7fc5b913 100644 --- a/src/Payments/ACHBankTransfer.res +++ b/src/Payments/ACHBankTransfer.res @@ -29,11 +29,9 @@ let make = (~paymentType: CardThemeType.mode) => { if confirm.doSubmit { if complete { let bodyArr = - PaymentBody.dynamicPaymentBody("bank_transfer", "ach") - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + PaymentBody.dynamicPaymentBody("bank_transfer", "ach")->mergeAndFlattenToTuples( + requiredFieldsBody, + ) intent( ~bodyArr, ~confirmParam=confirm.confirmParams, diff --git a/src/Payments/CardPayment.res b/src/Payments/CardPayment.res index da4da5c98..05c540660 100644 --- a/src/Payments/CardPayment.res +++ b/src/Payments/CardPayment.res @@ -163,11 +163,7 @@ let make = ( if validFormat && (showFields || isBancontact) { intent( ~bodyArr={ - (isBancontact ? banContactBody : cardBody) - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + (isBancontact ? banContactBody : cardBody)->mergeAndFlattenToTuples(requiredFieldsBody) }, ~confirmParam=confirm.confirmParams, ~handleUserError=false, diff --git a/src/Payments/KlarnaSDK.res b/src/Payments/KlarnaSDK.res index a53771a7b..ea7ab5303 100644 --- a/src/Payments/KlarnaSDK.res +++ b/src/Payments/KlarnaSDK.res @@ -100,11 +100,7 @@ let make = (~sessionObj: SessionsType.token) => { ) let body = { - klarnaSDKBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + klarnaSDKBody->mergeAndFlattenToTuples(requiredFieldsBody) } res.approved diff --git a/src/Payments/PaymentMethodsRecord.res b/src/Payments/PaymentMethodsRecord.res index 939697eaf..050542ba3 100644 --- a/src/Payments/PaymentMethodsRecord.res +++ b/src/Payments/PaymentMethodsRecord.res @@ -661,29 +661,6 @@ let getFieldType = (dict, isBancontact) => { } } -let dynamicFieldsEnabledPaymentMethods = [ - "crypto_currency", - "debit", - "credit", - "blik", - "google_pay", - "apple_pay", - "bancontact_card", - "open_banking_uk", - "eps", - "ideal", - "sofort", - "pix_transfer", - "giropay", - "local_bank_transfer_transfer", - "afterpay_clearpay", - "mifinity", - "upi_collect", - "sepa", - "affirm", - "ach", -] - let getIsBillingField = requiredFieldType => { switch requiredFieldType { | AddressLine1 diff --git a/src/Payments/PaymentMethodsWrapper.res b/src/Payments/PaymentMethodsWrapper.res index 857a796e8..cb4cf0627 100644 --- a/src/Payments/PaymentMethodsWrapper.res +++ b/src/Payments/PaymentMethodsWrapper.res @@ -84,12 +84,7 @@ let make = (~paymentType: CardThemeType.mode, ~paymentMethodName: string) => { phoneNumber.countryCode->Option.getOr("") ++ phoneNumber.value, ), ~paymentExperience=paymentFlow, - ) - ->Dict.fromArray - ->JSON.Encode.object - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + )->mergeAndFlattenToTuples(requiredFieldsBody) intent( ~bodyArr=body, diff --git a/src/Payments/PaypalSDKHelpers.res b/src/Payments/PaypalSDKHelpers.res index 2b22e4cc9..d50d0a33a 100644 --- a/src/Payments/PaypalSDKHelpers.res +++ b/src/Payments/PaypalSDKHelpers.res @@ -299,12 +299,7 @@ let loadBraintreePaypalSdk = ( ~statesList=stateJson, ) - let paypalBody = - body - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + let paypalBody = body->mergeAndFlattenToTuples(requiredFieldsBody) let modifiedPaymentBody = PaymentUtils.appendedCustomerAcceptance( ~isGuestCustomer, diff --git a/src/Payments/SepaBankTransfer.res b/src/Payments/SepaBankTransfer.res index 8f9c4bd2e..ca543425e 100644 --- a/src/Payments/SepaBankTransfer.res +++ b/src/Payments/SepaBankTransfer.res @@ -29,11 +29,9 @@ let make = (~paymentType) => { if confirm.doSubmit { if complete { let bodyArr = - PaymentBody.dynamicPaymentBody("bank_transfer", "sepa") - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + PaymentBody.dynamicPaymentBody("bank_transfer", "sepa")->mergeAndFlattenToTuples( + requiredFieldsBody, + ) intent( ~bodyArr, diff --git a/src/Utilities/ApplePayHelpers.res b/src/Utilities/ApplePayHelpers.res index 71b92d0d8..3a342cacd 100644 --- a/src/Utilities/ApplePayHelpers.res +++ b/src/Utilities/ApplePayHelpers.res @@ -61,11 +61,7 @@ let getApplePayFromResponse = ( let bodyDict = PaymentBody.applePayBody(~token, ~connectors) - bodyDict - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + bodyDict->mergeAndFlattenToTuples(requiredFieldsBody) } let startApplePaySession = ( @@ -261,11 +257,7 @@ let useHandleApplePayResponse = ( let bodyArr = if isWallet { applePayBody } else { - applePayBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + applePayBody->mergeAndFlattenToTuples(requiredFieldsBody) } processPayment( diff --git a/src/Utilities/DynamicFieldsUtils.res b/src/Utilities/DynamicFieldsUtils.res index 380d087ed..4861d6f45 100644 --- a/src/Utilities/DynamicFieldsUtils.res +++ b/src/Utilities/DynamicFieldsUtils.res @@ -1,5 +1,28 @@ open RecoilAtoms +let dynamicFieldsEnabledPaymentMethods = [ + "crypto_currency", + "debit", + "credit", + "blik", + "google_pay", + "apple_pay", + "bancontact_card", + "open_banking_uk", + "eps", + "ideal", + "sofort", + "pix_transfer", + "giropay", + "local_bank_transfer_transfer", + "afterpay_clearpay", + "mifinity", + "upi_collect", + "sepa", + "affirm", + "ach", +] + let getName = (item: PaymentMethodsRecord.required_fields, field: RecoilAtomTypes.field) => { let fieldNameArr = field.value->String.split(" ") let requiredFieldsArr = item.required_field->String.split(".") diff --git a/src/Utilities/GooglePayHelpers.res b/src/Utilities/GooglePayHelpers.res index 4f4e961ee..8552941d3 100644 --- a/src/Utilities/GooglePayHelpers.res +++ b/src/Utilities/GooglePayHelpers.res @@ -53,11 +53,7 @@ let getGooglePayBodyFromResponse = ( ) } - gPayBody - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + gPayBody->mergeAndFlattenToTuples(requiredFieldsBody) } let processPayment = ( @@ -123,11 +119,7 @@ let useHandleGooglePayResponse = ( let googlePayBody = if isWallet { body } else { - body - ->getJsonFromArrayOfJson - ->flattenObject(true) - ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) - ->getArrayOfTupleFromDict + body->mergeAndFlattenToTuples(requiredFieldsBody) } processPayment( diff --git a/src/Utilities/Utils.res b/src/Utilities/Utils.res index 49b177a68..45c43cc0d 100644 --- a/src/Utilities/Utils.res +++ b/src/Utilities/Utils.res @@ -1423,3 +1423,10 @@ let isKeyPresentInDict = (dict, key) => dict->Dict.get(key)->Option.isSome let checkIsTestCardWildcard = val => ["1111222233334444"]->Array.includes(val) let minorUnitToString = val => (val->Int.toFloat /. 100.)->Float.toString + +let mergeAndFlattenToTuples = (body, requiredFieldsBody) => + body + ->getJsonFromArrayOfJson + ->flattenObject(true) + ->mergeTwoFlattenedJsonDicts(requiredFieldsBody) + ->getArrayOfTupleFromDict From b40ed767433742b1ff23cba7aef8d4e201b8d104 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 7 Nov 2024 09:20:37 +0000 Subject: [PATCH 5/5] chore(release): 0.101.3 [skip ci] ## [0.101.3](https://github.com/juspay/hyperswitch-web/compare/v0.101.2...v0.101.3) (2024-11-07) --- CHANGELOG.md | 2 ++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f5c9c6ea..3d0281313 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## [0.101.3](https://github.com/juspay/hyperswitch-web/compare/v0.101.2...v0.101.3) (2024-11-07) + ## [0.101.2](https://github.com/juspay/hyperswitch-web/compare/v0.101.1...v0.101.2) (2024-11-07) ## [0.101.1](https://github.com/juspay/hyperswitch-web/compare/v0.101.0...v0.101.1) (2024-11-07) diff --git a/package-lock.json b/package-lock.json index 13479c43a..76d00eb7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "orca-payment-page", - "version": "0.101.2", + "version": "0.101.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "orca-payment-page", - "version": "0.101.2", + "version": "0.101.3", "hasInstallScript": true, "dependencies": { "@glennsl/rescript-fetch": "^0.2.0", diff --git a/package.json b/package.json index 7f83f3d0b..d6b56eb7b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "orca-payment-page", - "version": "0.101.2", + "version": "0.101.3", "main": "index.js", "private": true, "dependencies": {