4
4
ComponentDidAppearEvent ,
5
5
ComponentDidDisappearEvent ,
6
6
CommandCompletedEvent ,
7
+ ScreenPoppedEvent ,
7
8
ModalDismissedEvent ,
8
9
BottomTabSelectedEvent ,
9
10
NavigationButtonPressedEvent ,
@@ -18,6 +19,7 @@ import {
18
19
useNavigationCommand ,
19
20
useNavigationCommandComplete ,
20
21
useNavigationModalDismiss ,
22
+ useNavigationScreenPop ,
21
23
useNavigationBottomTabSelect ,
22
24
useNavigationButtonPress ,
23
25
useNavigationSearchBarUpdate ,
@@ -385,6 +387,97 @@ describe('useNavigationCommandComplete', () => {
385
387
} )
386
388
} )
387
389
390
+ describe ( 'useNavigationScreenPop' , ( ) => {
391
+ let triggerEvent : ( event : ScreenPoppedEvent ) => void
392
+ let mockRemoveSubscription : ( ) => void
393
+ let mockHandler : ( ) => void
394
+
395
+ beforeEach ( ( ) => {
396
+ mockHandler = jest . fn ( ( ) => { } )
397
+ mockRemoveSubscription = jest . fn ( )
398
+
399
+ Navigation . events = jest . fn ( ) . mockReturnValue ( {
400
+ registerScreenPoppedListener : jest . fn ( callback => {
401
+ triggerEvent = callback
402
+
403
+ return { remove : mockRemoveSubscription }
404
+ } ) ,
405
+ } )
406
+ } )
407
+
408
+ it ( 'should remove the event listener on unmount' , ( ) => {
409
+ const { result, unmount } = renderHook ( ( ) => {
410
+ useNavigationScreenPop ( ( ) => { } )
411
+ } )
412
+
413
+ unmount ( )
414
+
415
+ expect ( mockRemoveSubscription ) . toBeCalledTimes ( 1 )
416
+
417
+ expect ( result . current ) . toBeUndefined ( )
418
+ expect ( result . error ) . toBeUndefined ( )
419
+ } )
420
+
421
+ it ( 'should never call the handler if no event was triggered' , ( ) => {
422
+ const { result } = renderHook ( ( ) => {
423
+ useNavigationScreenPop ( ( ) => { } )
424
+ } )
425
+
426
+ expect ( mockHandler ) . toBeCalledTimes ( 0 )
427
+
428
+ expect ( result . current ) . toBeUndefined ( )
429
+ expect ( result . error ) . toBeUndefined ( )
430
+ } )
431
+
432
+ it ( 'should call handler twice when componentId is not provided' , ( ) => {
433
+ const { result } = renderHook ( ( ) => {
434
+ useNavigationScreenPop ( mockHandler )
435
+ } )
436
+
437
+ const event1 = { componentId : 'COMPONENT_ID_1' }
438
+ triggerEvent ( event1 )
439
+
440
+ const event2 = { componentId : 'COMPONENT_ID_2' }
441
+ triggerEvent ( event2 )
442
+
443
+ expect ( mockHandler ) . toBeCalledTimes ( 2 )
444
+ expect ( mockHandler ) . toHaveBeenNthCalledWith ( 1 , event1 )
445
+ expect ( mockHandler ) . toHaveBeenNthCalledWith ( 2 , event2 )
446
+
447
+ expect ( result . current ) . toBeUndefined ( )
448
+ expect ( result . error ) . toBeUndefined ( )
449
+ } )
450
+
451
+ it ( 'should call handler once if componentId provided' , ( ) => {
452
+ const { result } = renderHook ( ( ) => {
453
+ useNavigationScreenPop ( mockHandler , 'COMPONENT_ID_1' )
454
+ } )
455
+
456
+ const event = { componentId : 'COMPONENT_ID_1' }
457
+ triggerEvent ( event )
458
+
459
+ expect ( mockHandler ) . toBeCalledTimes ( 1 )
460
+ expect ( mockHandler ) . toBeCalledWith ( event )
461
+
462
+ expect ( result . current ) . toBeUndefined ( )
463
+ expect ( result . error ) . toBeUndefined ( )
464
+ } )
465
+
466
+ it ( 'should never call the handler if componentId does not match' , ( ) => {
467
+ const { result } = renderHook ( ( ) => {
468
+ useNavigationScreenPop ( mockHandler , 'COMPONENT_ID_1' )
469
+ } )
470
+
471
+ const event = { componentId : 'COMPONENT_ID_2' }
472
+ triggerEvent ( event )
473
+
474
+ expect ( mockHandler ) . toBeCalledTimes ( 0 )
475
+
476
+ expect ( result . current ) . toBeUndefined ( )
477
+ expect ( result . error ) . toBeUndefined ( )
478
+ } )
479
+ } )
480
+
388
481
describe ( 'useNavigationModalDismiss' , ( ) => {
389
482
let triggerEvent : ( event : ModalDismissedEvent ) => void
390
483
let mockRemoveSubscription : ( ) => void
0 commit comments