Skip to content

Commit 7c8f1df

Browse files
fix: premount loader race condition (#896)
Co-authored-by: Pritish Budhiraja <[email protected]>
1 parent 8e2c0c5 commit 7c8f1df

File tree

3 files changed

+615
-543
lines changed

3 files changed

+615
-543
lines changed

src/Payments/PreMountLoader.res

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,32 +10,38 @@ let sendPromiseData = (promise, key) => {
1010
executePromise()->ignore
1111
}
1212

13-
let useMessageHandler = getPromisesAndHandler => {
13+
let useMessageHandler = getMessageHandler => {
1414
React.useEffect(_ => {
15-
let (promises, messageHandler) = getPromisesAndHandler()
15+
let messageHandler = getMessageHandler()
16+
1617
let setupMessageListener = _ => {
17-
Utils.messageParentWindow([("preMountLoaderIframeMountedCallback", true->JSON.Encode.bool)])
1818
Window.addEventListener("message", messageHandler)
19+
Utils.messageParentWindow([("preMountLoaderIframeMountedCallback", true->JSON.Encode.bool)])
1920
}
2021

2122
let cleanupMessageListener = _ => {
22-
Utils.messageParentWindow([("preMountLoaderIframeUnMount", true->JSON.Encode.bool)])
2323
Window.removeEventListener("message", messageHandler)
24+
Utils.messageParentWindow([("preMountLoaderIframeUnMount", true->JSON.Encode.bool)])
2425
}
2526

26-
setupMessageListener()
27-
28-
let executeAllPromises = async () => {
29-
try {
30-
let _ = await Promise.all(promises)
31-
} catch {
32-
| error => Console.error2("Error in message handler:", error)
27+
let handleCleanUpEventListener = (ev: Window.event) => {
28+
open Utils
29+
let dict = ev.data->safeParse->getDictFromJson
30+
if dict->Dict.get("cleanUpPreMountLoaderIframe")->Option.isSome {
31+
cleanupMessageListener()
3332
}
34-
cleanupMessageListener()
3533
}
36-
executeAllPromises()->ignore
3734

38-
Some(cleanupMessageListener)
35+
Window.addEventListener("message", handleCleanUpEventListener)
36+
37+
setupMessageListener()
38+
39+
Some(
40+
() => {
41+
cleanupMessageListener()
42+
Window.removeEventListener("message", handleCleanUpEventListener)
43+
},
44+
)
3945
}, [])
4046
}
4147

@@ -87,8 +93,7 @@ module PreMountLoaderForElements = {
8793
}
8894
}
8995

90-
let promises = [paymentMethodsPromise, customerPaymentMethodsPromise, sessionTokensPromise]
91-
(promises, messageHandler)
96+
messageHandler
9297
})
9398

9499
React.null
@@ -114,8 +119,7 @@ module PreMountLoaderForPMMElements = {
114119
}
115120
}
116121

117-
let promises = [savedPaymentMethodsPromise]
118-
(promises, messageHandler)
122+
messageHandler
119123
})
120124

121125
React.null

0 commit comments

Comments
 (0)