@@ -3,15 +3,25 @@ open Utils
3
3
let make = () => {
4
4
let logger = OrcaLogger .make ()
5
5
6
- let mountToInnerHTML = innerHTML => {
7
- let ele = Window .querySelector ("#threeDsInvisibleIframe" )
8
- switch ele -> Nullable .toOption {
9
- | Some (elem ) => elem -> Window .innerHTML (innerHTML )
10
- | None =>
11
- Console .warn (
12
- "INTEGRATION ERROR: Div does not seem to exist on which threeDSMethod is to be mounted" ,
13
- )
14
- }
6
+ let (stateMetadata , setStateMetadata ) = React .useState (_ => Dict .make ()-> JSON .Encode .object )
7
+
8
+ let handleLoaded = _ev => {
9
+ stateMetadata -> Utils .getDictFromJson -> Dict .set ("3dsMethodComp" , "Y" -> JSON .Encode .string )
10
+ let metadataDict = stateMetadata -> JSON .Decode .object -> Option .getOr (Dict .make ())
11
+ let iframeId = metadataDict -> getString ("iframeId" , "" )
12
+ LoggerUtils .handleLogging (
13
+ ~optLogger = Some (logger ),
14
+ ~eventName = THREE_DS_METHOD_RESULT ,
15
+ ~value = "Y" ,
16
+ ~paymentMethod = "CARD" ,
17
+ (),
18
+ )
19
+ handlePostMessage ([
20
+ ("fullscreen" , true -> JSON .Encode .bool ),
21
+ ("param" , ` 3dsAuth`-> JSON .Encode .string ),
22
+ ("iframeId" , iframeId -> JSON .Encode .string ),
23
+ ("metadata" , stateMetadata ),
24
+ ])
15
25
}
16
26
17
27
React .useEffect0 (() => {
@@ -21,6 +31,7 @@ let make = () => {
21
31
let dict = json -> Utils .getDictFromJson
22
32
if dict -> Dict .get ("fullScreenIframeMounted" )-> Option .isSome {
23
33
let metadata = dict -> getJsonObjectFromDict ("metadata" )
34
+ setStateMetadata (_ => metadata )
24
35
let metaDataDict = metadata -> JSON .Decode .object -> Option .getOr (Dict .make ())
25
36
let threeDsDataDict =
26
37
metaDataDict
@@ -42,74 +53,65 @@ let make = () => {
42
53
-> Option .getOr (Dict .make ()-> JSON .Encode .object )
43
54
let paymentIntentId = metaDataDict -> Utils .getString ("paymentIntentId" , "" )
44
55
let publishableKey = metaDataDict -> Utils .getString ("publishableKey" , "" )
45
- let iframeId = metaDataDict -> getString ("iframeId" , "" )
46
56
47
57
logger .setClientSecret (paymentIntentId )
48
58
logger .setMerchantId (publishableKey )
49
59
50
- open Promise
51
- PaymentHelpers .threeDsMethod (threeDsUrl , threeDsMethodData , ~optLogger = Some (logger ))
52
- -> then (res => {
53
- if res == "" {
54
- Exn .raiseError ("Empty response from threeDsMethod" )-> reject
55
- } else {
56
- LoggerUtils .handleLogging (
57
- ~optLogger = Some (logger ),
58
- ~eventName = THREE_DS_METHOD_RESULT ,
59
- ~value = "Y" ,
60
- ~paymentMethod = "CARD" ,
61
- (),
62
- )
63
- mountToInnerHTML (res )
64
- metadata -> Utils .getDictFromJson -> Dict .set ("3dsMethodComp" , "Y" -> JSON .Encode .string )
65
- handlePostMessage ([
66
- ("fullscreen" , true -> JSON .Encode .bool ),
67
- ("param" , ` 3dsAuth`-> JSON .Encode .string ),
68
- ("iframeId" , iframeId -> JSON .Encode .string ),
69
- ("metadata" , metadata ),
70
- ])
71
- resolve (res )
72
- }
73
- })
74
- -> catch (err => {
75
- let exceptionMessage = err -> Utils .formatException
76
- metadata -> Utils .getDictFromJson -> Dict .set ("3dsMethodComp" , "N" -> JSON .Encode .string )
77
- handlePostMessage ([
78
- ("fullscreen" , true -> JSON .Encode .bool ),
79
- ("param" , ` 3dsAuth`-> JSON .Encode .string ),
80
- ("iframeId" , iframeId -> JSON .Encode .string ),
81
- ("metadata" , metadata ),
82
- ])
60
+ let iframeId = metaDataDict -> getString ("iframeId" , "" )
61
+
62
+ let handleFailureScenarios = value => {
83
63
LoggerUtils .handleLogging (
84
64
~optLogger = Some (logger ),
85
65
~eventName = THREE_DS_METHOD_RESULT ,
86
- ~value = exceptionMessage -> JSON . stringify ,
66
+ ~value ,
87
67
~paymentMethod = "CARD" ,
88
68
~logType = ERROR ,
89
69
(),
90
70
)
91
- reject (err )
92
- })
93
- -> ignore
71
+ metadata -> Utils .getDictFromJson -> Dict .set ("3dsMethodComp" , "N" -> JSON .Encode .string )
72
+ handlePostMessage ([
73
+ ("fullscreen" , true -> JSON .Encode .bool ),
74
+ ("param" , ` 3dsAuth`-> JSON .Encode .string ),
75
+ ("iframeId" , iframeId -> JSON .Encode .string ),
76
+ ("metadata" , stateMetadata ),
77
+ ])
78
+ }
94
79
95
- let headersDict =
96
- metaDataDict
97
- -> getJsonObjectFromDict ("headers" )
98
- -> JSON .Decode .object
99
- -> Option .getOr (Dict .make ())
100
- let headers = Dict .make ()
80
+ let ele = Window .querySelector ("#threeDsInvisibleDiv" )
101
81
102
- headersDict
103
- -> Dict .toArray
104
- -> Array .forEach (entries => {
105
- let (x , val ) = entries
106
- Dict .set (headers , x , val -> JSON .Decode .string -> Option .getOr ("" ))
107
- })
82
+ switch ele -> Nullable .toOption {
83
+ | Some (elem ) => {
84
+ let form = elem -> makeForm (threeDsUrl , "threeDsHiddenPostMethod" )
85
+ let input = Types .createElement ("input" )
86
+ input .name = encodeURIComponent ("threeDSMethodData" )
87
+ let threeDsMethodStr = threeDsMethodData -> JSON .Decode .string -> Option .getOr ("" )
88
+ input .value = encodeURIComponent (threeDsMethodStr )
89
+ form .target = "threeDsInvisibleIframe"
90
+ form .appendChild (input )
91
+ try {
92
+ form .submit ()
93
+ } catch {
94
+ | err => {
95
+ let exceptionMessage = err -> Utils .formatException -> JSON .stringify
96
+ handleFailureScenarios (exceptionMessage )
97
+ }
98
+ }
99
+ }
100
+ | None => handleFailureScenarios ("Unable to Locate threeDsInvisibleDiv" )
101
+ }
108
102
}
109
103
}
110
104
Window .addEventListener ("message" , handle )
111
105
Some (() => {Window .removeEventListener ("message" , handle )})
112
106
})
113
107
114
- <div id = "threeDsInvisibleIframe" className = "bg-black-100 h-96" />
108
+ <>
109
+ <div id = "threeDsInvisibleDiv" className = "hidden" />
110
+ <iframe
111
+ id = "threeDsInvisibleIframe"
112
+ name = "threeDsInvisibleIframe"
113
+ className = "h-96 invisible"
114
+ onLoad = handleLoaded
115
+ />
116
+ </>
115
117
}
0 commit comments