@@ -14,6 +14,15 @@ interface EmbedCheckoutMessageClose {
14
14
event : 'close'
15
15
}
16
16
17
+ /**
18
+ * Message sent to the parent window when the checkout is confirmed.
19
+ *
20
+ * At that point, the parent window shouldn't allow to close the checkout.
21
+ */
22
+ interface EmbedCheckoutMessageConfirmed {
23
+ event : 'confirmed'
24
+ }
25
+
17
26
/**
18
27
* Message sent to the parent window when the checkout is successfully completed.
19
28
*
@@ -31,6 +40,7 @@ interface EmbedCheckoutMessageSuccess {
31
40
type EmbedCheckoutMessage =
32
41
| EmbedCheckoutMessageLoaded
33
42
| EmbedCheckoutMessageClose
43
+ | EmbedCheckoutMessageConfirmed
34
44
| EmbedCheckoutMessageSuccess
35
45
36
46
const isEmbedCheckoutMessage = (
@@ -46,16 +56,19 @@ class EmbedCheckout {
46
56
private iframe : HTMLIFrameElement
47
57
private loader : HTMLDivElement
48
58
private loaded : boolean
59
+ private closable : boolean
49
60
private eventTarget : EventTarget
50
61
51
62
public constructor ( iframe : HTMLIFrameElement , loader : HTMLDivElement ) {
52
63
this . iframe = iframe
53
64
this . loader = loader
54
65
this . loaded = false
66
+ this . closable = true
55
67
this . eventTarget = new EventTarget ( )
56
68
this . initWindowListener ( )
57
69
this . addEventListener ( 'loaded' , this . loadedListener . bind ( this ) )
58
70
this . addEventListener ( 'close' , this . closeListener . bind ( this ) )
71
+ this . addEventListener ( 'confirmed' , this . confirmedListener . bind ( this ) )
59
72
this . addEventListener ( 'success' , this . successListener . bind ( this ) )
60
73
}
61
74
@@ -206,6 +219,11 @@ class EmbedCheckout {
206
219
listener : ( event : CustomEvent < EmbedCheckoutMessageClose > ) => void ,
207
220
options ?: AddEventListenerOptions | boolean ,
208
221
) : void
222
+ public addEventListener (
223
+ type : 'confirmed' ,
224
+ listener : ( event : CustomEvent < EmbedCheckoutMessageConfirmed > ) => void ,
225
+ options ?: AddEventListenerOptions | boolean ,
226
+ ) : void
209
227
public addEventListener (
210
228
type : 'success' ,
211
229
listener : ( event : CustomEvent < EmbedCheckoutMessageSuccess > ) => void ,
@@ -233,6 +251,10 @@ class EmbedCheckout {
233
251
type : 'close' ,
234
252
listener : ( event : CustomEvent < EmbedCheckoutMessageClose > ) => void ,
235
253
) : void
254
+ public removeEventListener (
255
+ type : 'confirmed' ,
256
+ listener : ( event : CustomEvent < EmbedCheckoutMessageConfirmed > ) => void ,
257
+ ) : void
236
258
public removeEventListener (
237
259
type : 'success' ,
238
260
listener : ( event : CustomEvent < EmbedCheckoutMessageSuccess > ) => void ,
@@ -276,7 +298,23 @@ class EmbedCheckout {
276
298
if ( event . defaultPrevented ) {
277
299
return
278
300
}
279
- this . close ( )
301
+ if ( this . closable ) {
302
+ this . close ( )
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Default listener for the `confirmed` event.
308
+ *
309
+ * This listener will set a flag to prevent the parent window from closing the embedded checkout.
310
+ */
311
+ private confirmedListener (
312
+ event : CustomEvent < EmbedCheckoutMessageConfirmed > ,
313
+ ) : void {
314
+ if ( event . defaultPrevented ) {
315
+ return
316
+ }
317
+ this . closable = false
280
318
}
281
319
282
320
/**
@@ -290,6 +328,7 @@ class EmbedCheckout {
290
328
if ( event . defaultPrevented ) {
291
329
return
292
330
}
331
+ this . closable = true
293
332
if ( event . detail . redirect ) {
294
333
window . location . href = event . detail . successURL
295
334
}
0 commit comments