Skip to content

Commit bc60a59

Browse files
committed
feat: added get intent call for v2
1 parent 5d47be7 commit bc60a59

File tree

7 files changed

+104
-1
lines changed

7 files changed

+104
-1
lines changed

src/LoaderController.res

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ let make = (~children, ~paymentMode, ~setIntegrateErrorError, ~logger, ~initTime
1212
let (optionsPayment, setOptionsPayment) = Recoil.useRecoilState(optionAtom)
1313
let setPaymentManagementList = Recoil.useSetRecoilState(paymentManagementList)
1414
let setPaymentMethodsListV2 = Recoil.useSetRecoilState(paymentMethodsListV2)
15+
let setIntentList = Recoil.useSetRecoilState(intentList)
1516
let setSessionId = Recoil.useSetRecoilState(sessionId)
1617
let setBlockConfirm = Recoil.useSetRecoilState(isConfirmBlocked)
1718
let setCustomPodUri = Recoil.useSetRecoilState(customPodUri)
@@ -443,6 +444,11 @@ let make = (~children, ~paymentMode, ~setIntegrateErrorError, ~logger, ~initTime
443444
}
444445
}
445446
}
447+
if dict->getDictIsSome("getIntent") {
448+
let getIntentDict = dict->getJsonObjectFromDict("getIntent")->getDictFromJson
449+
let intentDetails = getIntentDict->UnifiedHelpersV2.createIntentDetails("response")
450+
setIntentList(_ => intentDetails)
451+
}
446452
if dict->getDictIsSome("paymentsListV2") {
447453
let paymentsListV2 = dict->getJsonObjectFromDict("paymentsListV2")
448454
let listDict = paymentsListV2->getDictFromJson

src/Payments/PreMountLoader.res

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,25 @@ let getMessageHandlerV2Elements = (
120120
~endpoint,
121121
)
122122

123+
let getIntentPromise = PaymentHelpersV2.fetchIntent(
124+
~clientSecret,
125+
~paymentId,
126+
~profileId,
127+
~publishableKey,
128+
~logger,
129+
~customPodUri,
130+
~endpoint,
131+
)
132+
123133
ev => {
124134
open Utils
125135
let dict = ev.data->safeParse->getDictFromJson
126136
if dict->isKeyPresentInDict("sendPaymentMethodsListV2Response") {
127137
paymentMethodsListPromise->sendPromiseData("payment_methods_list_v2")
128138
} else if dict->isKeyPresentInDict("sendSessionTokensResponse") {
129139
sessionTokensPromise->sendPromiseData("session_tokens")
140+
} else if dict->isKeyPresentInDict("sendGetIntentResponse") {
141+
getIntentPromise->sendPromiseData("get_intent_v2")
130142
}
131143
}
132144
}

src/Types/UnifiedPaymentsTypesV2.res

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,7 @@ type paymentListLookupNew = {
101101
walletsList: array<string>,
102102
otherPaymentList: array<string>,
103103
}
104+
105+
type intentCall = {paymentType: PaymentMethodsRecord.payment_type}
106+
107+
type intentLoadState = LoadingIntent | LoadedIntent(intentCall) | Error(JSON.t)

src/Utilities/PaymentHelpersV2.res

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,3 +585,44 @@ let fetchSessions = (
585585
JSON.Encode.null->resolve
586586
})
587587
}
588+
589+
let fetchIntent = (
590+
~clientSecret,
591+
~publishableKey,
592+
~paymentId,
593+
~logger as _,
594+
~customPodUri,
595+
~endpoint,
596+
~profileId,
597+
) => {
598+
open Promise
599+
let baseHeaders = [
600+
("Content-Type", "application/json"),
601+
("x-profile-id", profileId),
602+
("Authorization", `publishable-key=${publishableKey},client-secret=${clientSecret}`),
603+
]
604+
605+
let headers = switch customPodUri {
606+
| value if value != "" => [...baseHeaders, ("x-feature", value)]
607+
| _ => baseHeaders
608+
}
609+
610+
let uri = `${endpoint}/v2/payments/${paymentId}/get-intent`
611+
fetchApi(uri, ~method=#GET, ~headers=headers->ApiEndpoint.addCustomPodHeader(~customPodUri))
612+
->then(resp => {
613+
if !(resp->Fetch.Response.ok) {
614+
resp
615+
->Fetch.Response.json
616+
->then(_ => {
617+
JSON.Encode.null->resolve
618+
})
619+
} else {
620+
Fetch.Response.json(resp)
621+
}
622+
})
623+
->catch(err => {
624+
let exceptionMessage = err->formatException
625+
Console.error2("Error ", exceptionMessage)
626+
JSON.Encode.null->resolve
627+
})
628+
}

src/Utilities/RecoilAtomsV2.res

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ let vaultMode = Recoil.atom("vaultMode", VaultHelpers.None)
44
let managePaymentMethod = Recoil.atom("managePaymentMethod", "")
55
let savedMethodsV2 = Recoil.atom("savedMethodsV2", [UnifiedHelpersV2.defaultCustomerMethods])
66
let paymentMethodsListV2 = Recoil.atom("paymentMethodsListV2", UnifiedPaymentsTypesV2.LoadingV2)
7+
let intentList = Recoil.atom("intentList", UnifiedPaymentsTypesV2.LoadingIntent)
78
let paymentMethodListValueV2 = Recoil.atom(
89
"paymentMethodListValueV2",
910
UnifiedHelpersV2.defaultPaymentsList,

src/Utilities/UnifiedHelpersV2.res

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,23 @@ let itemToPaymentDetails = cust => {
149149
}
150150
}
151151

152+
let itemToIntentObjMapper = dict => {
153+
{
154+
paymentType: getString(dict, "payment_type", "")->paymentTypeMapper,
155+
}
156+
}
157+
158+
let createIntentDetails = (dict, key) => {
159+
let intentDict =
160+
dict
161+
->Dict.get(key)
162+
->Option.flatMap(JSON.Decode.object)
163+
->Option.getOr(Dict.make())
164+
let response = intentDict->itemToIntentObjMapper
165+
166+
LoadedIntent(response)
167+
}
168+
152169
let defaultAddress = {
153170
city: "",
154171
country: "",

src/hyper-loader/Elements.res

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,24 @@ let make = (
216216
})
217217
}
218218

219+
let fetchIntent = (mountedIframeRef, componentType) => {
220+
Promise.make((resolve, _) => {
221+
let handleIntentLoaded = (event: Types.event) => {
222+
let json = event.data->anyTypeToJson
223+
let dict = json->getDictFromJson
224+
let isGetIntentData = dict->getString("data", "") === "get_intent_v2"
225+
if isGetIntentData {
226+
resolve()
227+
let msg = [("getIntent", json)]->Dict.fromArray
228+
mountedIframeRef->Window.iframePostMessage(msg)
229+
}
230+
}
231+
let msg = [("sendGetIntentResponse", true->JSON.Encode.bool)]->Dict.fromArray
232+
addSmartEventListener("message", handleIntentLoaded, `onGetIntentLoaded-${componentType}`)
233+
preMountLoaderIframeDiv->Window.iframePostMessage(msg)
234+
})
235+
}
236+
219237
let fetchPaymentsListV2 = (mountedIframeRef, componentType) => {
220238
Promise.make((resolve, _) => {
221239
let handlePaymentMethodsLoaded = (event: Types.event) => {
@@ -1389,7 +1407,11 @@ let make = (
13891407
),
13901408
sessionTokensPromise,
13911409
]
1392-
| V2 => [fetchPaymentsListV2(mountedIframeRef, componentType), sessionTokensPromise]
1410+
| V2 => [
1411+
fetchPaymentsListV2(mountedIframeRef, componentType),
1412+
sessionTokensPromise,
1413+
fetchIntent(mountedIframeRef, componentType),
1414+
]
13931415
}
13941416

13951417
Promise.all(promises)->then(_ => {

0 commit comments

Comments
 (0)