diff --git a/src/CardTheme.res b/src/CardTheme.res index 28c3d6da..dd6285db 100644 --- a/src/CardTheme.res +++ b/src/CardTheme.res @@ -128,6 +128,8 @@ let getVariables = (str, dict, default, logger) => { "spacingGridColumn", "spacingGridRow", "spacingAccordionItem", + "sdkHandleConfirmPayment", + "sdkHandleOneClickConfirmPayment", ] unknownKeysWarning(validKeys, json, "appearance.variables", ~logger) { diff --git a/src/Hooks/CommonHooks.res b/src/Hooks/CommonHooks.res index 99ce8264..b5fd1f56 100644 --- a/src/Hooks/CommonHooks.res +++ b/src/Hooks/CommonHooks.res @@ -14,6 +14,7 @@ type keys = { iframeId: string, parentURL: string, sdkHandleConfirmPayment: bool, + sdkHandleOneClickConfirmPayment: bool, } @val @scope("document") external querySelector: string => Js.Nullable.t = "querySelector" @@ -67,7 +68,7 @@ let useScript = (src: string) => { let updateKeys = (dict, keyPair, setKeys) => { let (key, value) = keyPair let valueStr = value->Js.Json.decodeString->Belt.Option.getWithDefault("") - let valueBool = value->Js.Json.decodeBoolean->Belt.Option.getWithDefault(false) + let valueBool = default => value->Js.Json.decodeBoolean->Belt.Option.getWithDefault(default) if dict->Utils.getDictIsSome(key) { switch key { | "iframeId" => @@ -88,7 +89,12 @@ let updateKeys = (dict, keyPair, setKeys) => { | "sdkHandleConfirmPayment" => setKeys(.prev => { ...prev, - sdkHandleConfirmPayment: dict->Utils.getBool(key, valueBool), + sdkHandleConfirmPayment: dict->Utils.getBool(key, valueBool(false)), + }) + | "sdkHandleOneClickConfirmPayment" => + setKeys(.prev => { + ...prev, + sdkHandleOneClickConfirmPayment: dict->Utils.getBool(key, valueBool(true)), }) | _ => () } @@ -100,4 +106,5 @@ let defaultkeys = { iframeId: "", parentURL: "*", sdkHandleConfirmPayment: false, + sdkHandleOneClickConfirmPayment: true, } diff --git a/src/LoaderController.res b/src/LoaderController.res index 013ad025..eb700e8c 100644 --- a/src/LoaderController.res +++ b/src/LoaderController.res @@ -206,6 +206,7 @@ let make = (~children, ~paymentMode, ~setIntegrateErrorError, ~logger) => { ("publishableKey", ""->Js.Json.string), ("parentURL", "*"->Js.Json.string), ("sdkHandleConfirmPayment", false->Js.Json.boolean), + ("sdkHandleOneClickConfirmPayment", true->Js.Json.boolean), ]->Js.Array2.forEach(keyPair => { dict->CommonHooks.updateKeys(keyPair, setKeys) }) diff --git a/src/Payments/ApplePay.res b/src/Payments/ApplePay.res index 63ec66f0..7a1ef706 100644 --- a/src/Payments/ApplePay.res +++ b/src/Payments/ApplePay.res @@ -1,7 +1,9 @@ @react.component let make = (~sessionObj: option, ~list: PaymentMethodsRecord.list) => { let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom) - let {publishableKey} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys) + let {publishableKey, sdkHandleOneClickConfirmPayment} = Recoil.useRecoilValueFromAtom( + RecoilAtoms.keys, + ) let setIsShowOrPayUsing = Recoil.useSetRecoilState(RecoilAtoms.isShowOrPayUsing) let (showApplePay, setShowApplePay) = React.useState(() => false) let (showApplePayLoader, setShowApplePayLoader) = React.useState(() => false) @@ -202,30 +204,40 @@ let make = (~sessionObj: option, ~list: PaymentMethodsRecord.list) => (), ) setApplePayClicked(_ => true) + open Promise + OrcaUtils.makeOneClickHandlerPromise(sdkHandleOneClickConfirmPayment) + ->then(result => { + let result = result->Js.Json.decodeBoolean->Belt.Option.getWithDefault(false) + if result { + if isInvokeSDKFlow { + let isDelayedSessionToken = + sessionObj + ->Belt.Option.getWithDefault(Js.Json.null) + ->Js.Json.decodeObject + ->Belt.Option.getWithDefault(Js.Dict.empty()) + ->Js.Dict.get("delayed_session_token") + ->Belt.Option.getWithDefault(Js.Json.null) + ->Js.Json.decodeBoolean + ->Belt.Option.getWithDefault(false) - if isInvokeSDKFlow { - let isDelayedSessionToken = - sessionObj - ->Belt.Option.getWithDefault(Js.Json.null) - ->Js.Json.decodeObject - ->Belt.Option.getWithDefault(Js.Dict.empty()) - ->Js.Dict.get("delayed_session_token") - ->Belt.Option.getWithDefault(Js.Json.null) - ->Js.Json.decodeBoolean - ->Belt.Option.getWithDefault(false) - - if isDelayedSessionToken { - setShowApplePayLoader(_ => true) - let bodyDict = PaymentBody.applePayThirdPartySdkBody(~connectors) - processPayment(bodyDict) + if isDelayedSessionToken { + setShowApplePayLoader(_ => true) + let bodyDict = PaymentBody.applePayThirdPartySdkBody(~connectors) + processPayment(bodyDict) + } else { + let message = [("applePayButtonClicked", true->Js.Json.boolean)] + Utils.handlePostMessage(message) + } + } else { + let bodyDict = PaymentBody.applePayRedirectBody(~connectors) + processPayment(bodyDict) + } } else { - let message = [("applePayButtonClicked", true->Js.Json.boolean)] - Utils.handlePostMessage(message) + setApplePayClicked(_ => false) } - } else { - let bodyDict = PaymentBody.applePayRedirectBody(~connectors) - processPayment(bodyDict) - } + resolve() + }) + ->ignore } React.useEffect1(() => { diff --git a/src/Payments/GPay.res b/src/Payments/GPay.res index e7b7086a..15cf656f 100644 --- a/src/Payments/GPay.res +++ b/src/Payments/GPay.res @@ -14,7 +14,7 @@ let make = ( let (requiredFieldsBody, setRequiredFieldsBody) = React.useState(_ => Js.Dict.empty()) let (loggerState, _setLoggerState) = Recoil.useRecoilState(loggerAtom) let {iframeId} = Recoil.useRecoilValueFromAtom(keys) - let {publishableKey} = Recoil.useRecoilValueFromAtom(keys) + let {publishableKey, sdkHandleOneClickConfirmPayment} = Recoil.useRecoilValueFromAtom(keys) let {localeString} = Recoil.useRecoilValueFromAtom(configAtom) let options = Recoil.useRecoilValueFromAtom(optionAtom) let intent = PaymentHelpers.usePaymentIntent(Some(loggerState), Gpay) @@ -135,28 +135,35 @@ let make = ( ~paymentMethod="GOOGLE_PAY", (), ) - if isInvokeSDKFlow { - if isDelayedSessionToken { - let bodyDict = PaymentBody.gPayThirdPartySdkBody(~connectors) - processPayment(bodyDict) - } else { - handlePostMessage([ - ("fullscreen", true->Js.Json.boolean), - ("param", "paymentloader"->Js.Json.string), - ("iframeId", iframeId->Js.Json.string), - ]) - options.readOnly ? () : handlePostMessage([("GpayClicked", true->Js.Json.boolean)]) + open Promise + OrcaUtils.makeOneClickHandlerPromise(sdkHandleOneClickConfirmPayment)->then(result => { + let result = result->Js.Json.decodeBoolean->Belt.Option.getWithDefault(false) + if result { + if isInvokeSDKFlow { + if isDelayedSessionToken { + let bodyDict = PaymentBody.gPayThirdPartySdkBody(~connectors) + processPayment(bodyDict) + } else { + handlePostMessage([ + ("fullscreen", true->Js.Json.boolean), + ("param", "paymentloader"->Js.Json.string), + ("iframeId", iframeId->Js.Json.string), + ]) + options.readOnly ? () : handlePostMessage([("GpayClicked", true->Js.Json.boolean)]) + } + } else { + let bodyDict = PaymentBody.gpayRedirectBody(~connectors) + processPayment(bodyDict) + } + loggerState.setLogInfo( + ~value="", + ~eventName=PAYMENT_DATA_FILLED, + ~paymentMethod="GOOGLE_PAY", + (), + ) } - } else { - let bodyDict = PaymentBody.gpayRedirectBody(~connectors) - processPayment(bodyDict) - } - loggerState.setLogInfo( - ~value="", - ~eventName=PAYMENT_DATA_FILLED, - ~paymentMethod="GOOGLE_PAY", - (), - ) + resolve() + }) } let buttonStyle = { diff --git a/src/Payments/PayPal.res b/src/Payments/PayPal.res index 04765d99..85f42123 100644 --- a/src/Payments/PayPal.res +++ b/src/Payments/PayPal.res @@ -14,7 +14,7 @@ let payPalIcon = let make = (~list: PaymentMethodsRecord.list) => { let loggerState = Recoil.useRecoilValueFromAtom(loggerAtom) let (paypalClicked, setPaypalClicked) = React.useState(_ => false) - let {publishableKey} = Recoil.useRecoilValueFromAtom(keys) + let {publishableKey, sdkHandleOneClickConfirmPayment} = Recoil.useRecoilValueFromAtom(keys) let options = Recoil.useRecoilValueFromAtom(optionAtom) let (_, _, labelType) = options.wallets.style.type_ let _label = switch labelType { @@ -37,17 +37,28 @@ let make = (~list: PaymentMethodsRecord.list) => { (), ) setPaypalClicked(_ => true) - let (connectors, _) = list->PaymentUtils.getConnectors(Wallets(Paypal(Redirect))) - let body = PaymentBody.paypalRedirectionBody(~connectors) - intent( - ~bodyArr=body, - ~confirmParam={ - return_url: options.wallets.walletReturnUrl, - publishableKey, - }, - ~handleUserError=true, - (), - ) + open Promise + OrcaUtils.makeOneClickHandlerPromise(sdkHandleOneClickConfirmPayment) + ->then(result => { + let result = result->Js.Json.decodeBoolean->Belt.Option.getWithDefault(false) + if result { + let (connectors, _) = list->PaymentUtils.getConnectors(Wallets(Paypal(Redirect))) + let body = PaymentBody.paypalRedirectionBody(~connectors) + intent( + ~bodyArr=body, + ~confirmParam={ + return_url: options.wallets.walletReturnUrl, + publishableKey, + }, + ~handleUserError=true, + (), + ) + } else { + setPaypalClicked(_ => false) + } + resolve() + }) + ->ignore }