@@ -31,7 +31,6 @@ const MDBModal: React.FC<ModalProps> = ({
31
31
32
32
const modalInnerRef = useRef < HTMLElement > ( null ) ;
33
33
const modalReference = modalRef ? modalRef : modalInnerRef ;
34
-
35
34
const classes = clsx (
36
35
'modal' ,
37
36
staticModal && 'modal-static' ,
@@ -44,8 +43,10 @@ const MDBModal: React.FC<ModalProps> = ({
44
43
const backdropClasses = clsx ( 'modal-backdrop' , 'fade' , isOpenBackdrop && 'show' ) ;
45
44
46
45
const closeModal = useCallback ( ( ) => {
47
- setIsOpenModal ( false ) ;
48
- isOpenModal && onHide ?.( ) ;
46
+ setIsOpenModal ( ( isCurrentlyShown ) => {
47
+ isCurrentlyShown && onHide ?.( ) ;
48
+ return false ;
49
+ } ) ;
49
50
50
51
setTimeout ( ( ) => {
51
52
setIsOpenBackrop ( false ) ;
@@ -59,6 +60,10 @@ const MDBModal: React.FC<ModalProps> = ({
59
60
60
61
const handleClickOutside = useCallback (
61
62
( event : MouseEvent ) => {
63
+ if ( nonInvasive ) {
64
+ return ;
65
+ }
66
+
62
67
if ( isOpenModal && event . target === modalReference . current ) {
63
68
if ( ! staticBackdrop ) {
64
69
closeModal ( ) ;
@@ -71,7 +76,7 @@ const MDBModal: React.FC<ModalProps> = ({
71
76
}
72
77
}
73
78
} ,
74
- [ isOpenModal , modalReference , staticBackdrop , closeModal , onHidePrevented ]
79
+ [ isOpenModal , modalReference , staticBackdrop , closeModal , onHidePrevented , nonInvasive ]
75
80
) ;
76
81
77
82
const handleKeydown = useCallback (
@@ -177,16 +182,19 @@ const MDBModal: React.FC<ModalProps> = ({
177
182
} , [ show , closeModal , setShow , onShow ] ) ;
178
183
179
184
useEffect ( ( ) => {
180
- if ( ! nonInvasive ) {
181
- window . addEventListener ( 'click' , handleClickOutside ) ;
182
- window . addEventListener ( 'keydown' , handleKeydown ) ;
183
- }
185
+ const addMouseUpListener = ( e : MouseEvent ) => {
186
+ if ( ! ( e . target as HTMLElement ) . closest ( '.modal-dialog' ) ) {
187
+ window . addEventListener ( 'mouseup' , handleClickOutside , { once : true } ) ;
188
+ }
189
+ } ;
190
+ window . addEventListener ( 'mousedown' , addMouseUpListener ) ;
191
+ window . addEventListener ( 'keydown' , handleKeydown ) ;
184
192
185
193
return ( ) => {
186
- window . removeEventListener ( 'click ' , handleClickOutside ) ;
194
+ window . removeEventListener ( 'mousedown ' , addMouseUpListener ) ;
187
195
window . removeEventListener ( 'keydown' , handleKeydown ) ;
188
196
} ;
189
- } , [ handleKeydown , handleClickOutside , nonInvasive ] ) ;
197
+ } , [ handleKeydown , handleClickOutside ] ) ;
190
198
191
199
const appendToBodyTemplate = (
192
200
< >
@@ -224,7 +232,7 @@ const MDBModal: React.FC<ModalProps> = ({
224
232
{ children }
225
233
</ Tag >
226
234
{ ReactDOM . createPortal (
227
- backdrop && innerShow && ! nonInvasive && < div className = { backdropClasses } > </ div > ,
235
+ backdrop && innerShow && ! nonInvasive && < div onClick = { closeModal } className = { backdropClasses } > </ div > ,
228
236
document . body
229
237
) }
230
238
</ >
0 commit comments