Skip to content

Commit bce8bea

Browse files
fix: fixed Saved Methods ApplePay and GooglePay Handler (#455)
1 parent 195c474 commit bce8bea

File tree

5 files changed

+76
-60
lines changed

5 files changed

+76
-60
lines changed

src/Components/SavedMethods.res

Lines changed: 44 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ let make = (
3333
let dict = sessions->Utils.getDictFromJson
3434
let sessionObj = React.useMemo(() => SessionsType.itemToObjMapper(dict, Others), [dict])
3535

36-
let isApplePayReady = Recoil.useRecoilValueFromAtom(RecoilAtoms.isApplePayReady)
37-
let isGPayReady = Recoil.useRecoilValueFromAtom(RecoilAtoms.isGooglePayReady)
36+
let gPayToken = SessionsType.getPaymentSessionObj(sessionObj.sessionsToken, Gpay)
37+
38+
let applePaySessionObj = SessionsType.itemToObjMapper(dict, ApplePayObject)
39+
let applePayToken = SessionsType.getPaymentSessionObj(applePaySessionObj.sessionsToken, ApplePay)
3840

3941
let intent = PaymentHelpers.usePaymentIntent(Some(loggerState), Card)
4042
let savedCardlength = savedMethods->Array.length
@@ -59,13 +61,6 @@ let make = (
5961

6062
let bottomElement = {
6163
savedMethods
62-
->Array.filter(savedMethod => {
63-
switch savedMethod.paymentMethodType {
64-
| Some("apple_pay") => isApplePayReady
65-
| Some("google_pay") => isGPayReady
66-
| _ => true
67-
}
68-
})
6964
->Array.mapWithIndex((obj, i) => {
7065
let brandIcon = switch obj.paymentMethod {
7166
| "wallet" => getWalletBrandIcon(obj)
@@ -121,9 +116,9 @@ let make = (
121116

122117
useHandlePostMessages(~complete, ~empty, ~paymentType, ~savedMethod=true)
123118

124-
GooglePayHelpers.useHandleGooglePayResponse(~connectors=[], ~intent)
119+
GooglePayHelpers.useHandleGooglePayResponse(~connectors=[], ~intent, ~isSavedMethodsFlow=true)
125120

126-
ApplePayHelpers.useHandleApplePayResponse(~connectors=[], ~intent)
121+
ApplePayHelpers.useHandleApplePayResponse(~connectors=[], ~intent, ~isSavedMethodsFlow=true)
127122

128123
let submitCallback = React.useCallback((ev: Window.event) => {
129124
let json = ev.data->JSON.parseExn
@@ -162,52 +157,44 @@ let make = (
162157
confirm.confirmTimestamp >= confirm.readyTimestamp
163158
) {
164159
switch customerMethod.paymentMethodType {
165-
| Some("google_pay") => {
166-
let gPayToken = SessionsType.getPaymentSessionObj(sessionObj.sessionsToken, Gpay)
167-
switch gPayToken {
168-
| OtherTokenOptional(optToken) =>
169-
GooglePayHelpers.handleGooglePayClicked(
170-
~sessionObj=optToken,
171-
~componentName,
172-
~iframeId,
173-
~readOnly,
174-
)
175-
| _ =>
176-
// TODO - To be replaced with proper error message
177-
intent(
178-
~bodyArr=savedPaymentMethodBody
179-
->getJsonFromArrayOfJson
180-
->flattenObject(true)
181-
->mergeTwoFlattenedJsonDicts(requiredFieldsBody)
182-
->getArrayOfTupleFromDict,
183-
~confirmParam=confirm.confirmParams,
184-
~handleUserError=false,
185-
(),
186-
)
187-
}
160+
| Some("google_pay") =>
161+
switch gPayToken {
162+
| OtherTokenOptional(optToken) =>
163+
GooglePayHelpers.handleGooglePayClicked(
164+
~sessionObj=optToken,
165+
~componentName,
166+
~iframeId,
167+
~readOnly,
168+
)
169+
| _ =>
170+
// TODO - To be replaced with proper error message
171+
intent(
172+
~bodyArr=savedPaymentMethodBody
173+
->getJsonFromArrayOfJson
174+
->flattenObject(true)
175+
->mergeTwoFlattenedJsonDicts(requiredFieldsBody)
176+
->getArrayOfTupleFromDict,
177+
~confirmParam=confirm.confirmParams,
178+
~handleUserError=false,
179+
(),
180+
)
188181
}
189-
| Some("apple_pay") => {
190-
let applePaySessionObj = SessionsType.itemToObjMapper(dict, ApplePayObject)
191-
let applePayToken = SessionsType.getPaymentSessionObj(
192-
applePaySessionObj.sessionsToken,
193-
ApplePay,
182+
| Some("apple_pay") =>
183+
switch applePayToken {
184+
| ApplePayTokenOptional(optToken) =>
185+
ApplePayHelpers.handleApplePayButtonClicked(~sessionObj=optToken, ~componentName)
186+
| _ =>
187+
// TODO - To be replaced with proper error message
188+
intent(
189+
~bodyArr=savedPaymentMethodBody
190+
->getJsonFromArrayOfJson
191+
->flattenObject(true)
192+
->mergeTwoFlattenedJsonDicts(requiredFieldsBody)
193+
->getArrayOfTupleFromDict,
194+
~confirmParam=confirm.confirmParams,
195+
~handleUserError=false,
196+
(),
194197
)
195-
switch applePayToken {
196-
| ApplePayTokenOptional(optToken) =>
197-
ApplePayHelpers.handleApplePayButtonClicked(~sessionObj=optToken, ~componentName)
198-
| _ =>
199-
// TODO - To be replaced with proper error message
200-
intent(
201-
~bodyArr=savedPaymentMethodBody
202-
->getJsonFromArrayOfJson
203-
->flattenObject(true)
204-
->mergeTwoFlattenedJsonDicts(requiredFieldsBody)
205-
->getArrayOfTupleFromDict,
206-
~confirmParam=confirm.confirmParams,
207-
~handleUserError=false,
208-
(),
209-
)
210-
}
211198
}
212199
| _ =>
213200
intent(
@@ -244,6 +231,8 @@ let make = (
244231
complete,
245232
customerMethod,
246233
isCustomerAcceptanceRequired,
234+
applePayToken,
235+
gPayToken,
247236
))
248237
useSubmitPaymentData(submitCallback)
249238

src/PaymentElement.res

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ let make = (~cardProps, ~expiryProps, ~cvcProps, ~paymentType: CardThemeType.mod
2626
let (walletOptions, setWalletOptions) = React.useState(_ => [])
2727
let {sdkHandleConfirmPayment} = Recoil.useRecoilValueFromAtom(optionAtom)
2828

29+
let isApplePayReady = Recoil.useRecoilValueFromAtom(RecoilAtoms.isApplePayReady)
30+
let isGPayReady = Recoil.useRecoilValueFromAtom(RecoilAtoms.isGooglePayReady)
31+
2932
let (paymentMethodListValue, setPaymentMethodListValue) = Recoil.useRecoilState(
3033
PaymentUtils.paymentMethodListValue,
3134
)
@@ -72,7 +75,16 @@ let make = (~cardProps, ~expiryProps, ~cvcProps, ~paymentType: CardThemeType.mod
7275
}
7376
}
7477

75-
let finalSavedPaymentMethods = savedPaymentMethods->Array.copy
78+
let finalSavedPaymentMethods =
79+
savedPaymentMethods
80+
->Array.copy
81+
->Array.filter(savedMethod => {
82+
switch savedMethod.paymentMethodType {
83+
| Some("apple_pay") => isApplePayReady
84+
| Some("google_pay") => isGPayReady
85+
| _ => true
86+
}
87+
})
7688
finalSavedPaymentMethods->Array.sort(sortSavedPaymentMethods)
7789

7890
let paymentOrder = paymentMethodOrder->getOptionalArr->removeDuplicate
@@ -98,7 +110,13 @@ let make = (~cardProps, ~expiryProps, ~cvcProps, ~paymentType: CardThemeType.mod
98110
}
99111

100112
None
101-
}, (customerPaymentMethods, displaySavedPaymentMethods, optionAtomValue))
113+
}, (
114+
customerPaymentMethods,
115+
displaySavedPaymentMethods,
116+
optionAtomValue,
117+
isApplePayReady,
118+
isGPayReady,
119+
))
102120

103121
React.useEffect(() => {
104122
let defaultSelectedPaymentMethod = optionAtomValue.displayDefaultSavedPaymentIcon
@@ -344,7 +362,9 @@ let make = (~cardProps, ~expiryProps, ~cvcProps, ~paymentType: CardThemeType.mod
344362
</div>
345363
</RenderIf>
346364
<RenderIf condition={!showFields && displaySavedPaymentMethods}>
347-
<SavedMethods paymentToken setPaymentToken savedMethods loadSavedCards cvcProps paymentType sessions />
365+
<SavedMethods
366+
paymentToken setPaymentToken savedMethods loadSavedCards cvcProps paymentType sessions
367+
/>
348368
</RenderIf>
349369
<RenderIf
350370
condition={(paymentOptions->Array.length > 0 || walletOptions->Array.length > 0) &&

src/Utilities/ApplePayHelpers.res

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ let useHandleApplePayResponse = (
138138
~setApplePayClicked=_ => (),
139139
~syncPayment=() => (),
140140
~isInvokeSDKFlow=true,
141+
~isSavedMethodsFlow=false,
141142
) => {
142143
let options = Recoil.useRecoilValueFromAtom(RecoilAtoms.optionAtom)
143144
let {publishableKey} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys)
@@ -191,6 +192,9 @@ let useHandleApplePayResponse = (
191192
)
192193
} else if dict->Dict.get("showApplePayButton")->Option.isSome {
193194
setApplePayClicked(_ => false)
195+
if isSavedMethodsFlow {
196+
postFailedSubmitResponse(~errortype="server_error", ~message="Something went wrong")
197+
}
194198
} else if dict->Dict.get("applePaySyncPayment")->Option.isSome {
195199
syncPayment()
196200
}

src/Utilities/GooglePayHelpers.res

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ let processPayment = (
7878
)
7979
}
8080

81-
let useHandleGooglePayResponse = (~connectors, ~intent) => {
81+
let useHandleGooglePayResponse = (~connectors, ~intent, ~isSavedMethodsFlow=false) => {
8282
let options = Recoil.useRecoilValueFromAtom(RecoilAtoms.optionAtom)
8383
let {publishableKey} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys)
8484

@@ -123,6 +123,9 @@ let useHandleGooglePayResponse = (~connectors, ~intent) => {
123123
}
124124
if dict->Dict.get("gpayError")->Option.isSome {
125125
handlePostMessage([("fullscreen", false->JSON.Encode.bool)])
126+
if isSavedMethodsFlow {
127+
postFailedSubmitResponse(~errortype="server_error", ~message="Something went wrong")
128+
}
126129
}
127130
}
128131
Window.addEventListener("message", handle)

src/Utilities/PaymentHelpers.res

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,7 @@ let rec intentCall = (
558558
| (Applepay, false)
559559
| (Paypal, false) =>
560560
if !isPaymentSession {
561+
closePaymentLoaderIfAny()
561562
postSubmitResponse(~jsonData=data, ~url=url.href)
562563
} else if confirmParam.redirect === Some("always") {
563564
handleOpenUrl(url.href)
@@ -1560,4 +1561,3 @@ let paymentIntentForPaymentSession = (
15601561
(),
15611562
)
15621563
}
1563-

0 commit comments

Comments
 (0)