1
- import React , { forwardRef , useCallback , useEffect , useMemo } from 'react' ;
1
+ import React , { forwardRef , useCallback , useEffect , useMemo , useRef } from 'react' ;
2
2
import { View } from 'react-native' ;
3
3
import PropTypes from 'prop-types' ;
4
4
import ReactNativeModal from 'react-native-modal' ;
@@ -14,6 +14,7 @@ import variables from '../../styles/variables';
14
14
import CONST from '../../CONST' ;
15
15
import ComposerFocusManager from '../../libs/ComposerFocusManager' ;
16
16
import useNativeDriver from '../../libs/useNativeDriver' ;
17
+ import usePrevious from '../../hooks/usePrevious' ;
17
18
18
19
const propTypes = {
19
20
...modalPropTypes ,
@@ -55,6 +56,9 @@ function BaseModal({
55
56
56
57
const safeAreaInsets = useSafeAreaInsets ( ) ;
57
58
59
+ const isVisibleRef = useRef ( isVisible ) ;
60
+ const wasVisible = usePrevious ( isVisible ) ;
61
+
58
62
/**
59
63
* Hides modal
60
64
* @param {Boolean } [callHideCallback=true] Should we call the onModalHide callback
@@ -76,20 +80,25 @@ function BaseModal({
76
80
) ;
77
81
78
82
useEffect ( ( ) => {
79
- Modal . willAlertModalBecomeVisible ( isVisible ) ;
80
-
81
- // To handle closing any modal already visible when this modal is mounted, i.e. PopoverReportActionContextMenu
82
- Modal . setCloseModal ( isVisible ? onClose : null ) ;
83
- } , [ isVisible , onClose ] ) ;
83
+ isVisibleRef . current = isVisible ;
84
+ if ( isVisible ) {
85
+ Modal . willAlertModalBecomeVisible ( true ) ;
86
+ // To handle closing any modal already visible when this modal is mounted, i.e. PopoverReportActionContextMenu
87
+ Modal . setCloseModal ( onClose ) ;
88
+ } else if ( wasVisible && ! isVisible ) {
89
+ Modal . willAlertModalBecomeVisible ( false ) ;
90
+ Modal . setCloseModal ( null ) ;
91
+ }
92
+ } , [ isVisible , wasVisible , onClose ] ) ;
84
93
85
94
useEffect (
86
95
( ) => ( ) => {
87
96
// Only trigger onClose and setModalVisibility if the modal is unmounting while visible.
88
- if ( isVisible ) {
89
- hideModal ( true ) ;
90
- Modal . willAlertModalBecomeVisible ( false ) ;
97
+ if ( ! isVisibleRef . current ) {
98
+ return ;
91
99
}
92
-
100
+ hideModal ( true ) ;
101
+ Modal . willAlertModalBecomeVisible ( false ) ;
93
102
// To prevent closing any modal already unmounted when this modal still remains as visible state
94
103
Modal . setCloseModal ( null ) ;
95
104
} ,
0 commit comments