@@ -6,19 +6,20 @@ import ReactDOM from 'react-dom';
6
6
const MDBModal : React . FC < ModalProps > = ( {
7
7
animationDirection,
8
8
appendToBody,
9
- backdrop,
9
+ backdrop = true ,
10
10
children,
11
11
className,
12
- closeOnEsc,
12
+ closeOnEsc = true ,
13
13
setShow,
14
- leaveHiddenModal,
14
+ leaveHiddenModal = true ,
15
15
modalRef,
16
16
onHide,
17
17
onHidePrevented,
18
18
onShow,
19
19
show,
20
20
staticBackdrop,
21
- tag : Tag ,
21
+ nonInvasive = false ,
22
+ tag : Tag = 'div' ,
22
23
...props
23
24
} ) => {
24
25
const [ isOpenBackdrop , setIsOpenBackrop ] = useState ( show ) ;
@@ -37,6 +38,7 @@ const MDBModal: React.FC<ModalProps> = ({
37
38
animationDirection ,
38
39
'fade' ,
39
40
isOpenModal && 'show' ,
41
+ isOpenBackdrop && nonInvasive && 'modal-non-invasive-show' ,
40
42
className
41
43
) ;
42
44
const backdropClasses = clsx ( 'modal-backdrop' , 'fade' , isOpenBackdrop && 'show' ) ;
@@ -47,7 +49,7 @@ const MDBModal: React.FC<ModalProps> = ({
47
49
48
50
setTimeout ( ( ) => {
49
51
setIsOpenBackrop ( false ) ;
50
- setShow && setShow ( false ) ;
52
+ setShow ?. ( false ) ;
51
53
} , 150 ) ;
52
54
setTimeout ( ( ) => {
53
55
setInnerShow ( false ) ;
@@ -56,7 +58,7 @@ const MDBModal: React.FC<ModalProps> = ({
56
58
} , [ onHide , setShow ] ) ;
57
59
58
60
const handleClickOutside = useCallback (
59
- ( event : any ) => {
61
+ ( event : MouseEvent ) => {
60
62
if ( isOpenModal && event . target === modalReference . current ) {
61
63
if ( ! staticBackdrop ) {
62
64
closeModal ( ) ;
@@ -100,10 +102,10 @@ const MDBModal: React.FC<ModalProps> = ({
100
102
useEffect ( ( ) => {
101
103
const focusable = modalReference . current ?. querySelectorAll (
102
104
'button, a, input, select, textarea, [tabindex]'
103
- ) as any as Array < HTMLElement > ;
105
+ ) as NodeListOf < HTMLElement > ;
104
106
105
107
const filtered = Array . from ( focusable )
106
- . filter ( ( el : any ) => el . tabIndex !== - 1 )
108
+ . filter ( ( el ) => el . tabIndex !== - 1 )
107
109
. sort ( ( a , b ) => {
108
110
if ( a . tabIndex === b . tabIndex ) {
109
111
return 0 ;
@@ -140,7 +142,7 @@ const MDBModal: React.FC<ModalProps> = ({
140
142
141
143
const hasVScroll = window . innerWidth > document . documentElement . clientWidth && window . innerWidth >= 576 ;
142
144
143
- if ( innerShow && hasVScroll ) {
145
+ if ( innerShow && hasVScroll && ! nonInvasive ) {
144
146
const scrollbarWidth = getScrollbarWidth ( ) ;
145
147
document . body . classList . add ( 'modal-open' ) ;
146
148
document . body . style . overflow = 'hidden' ;
@@ -156,7 +158,7 @@ const MDBModal: React.FC<ModalProps> = ({
156
158
document . body . style . overflow = '' ;
157
159
document . body . style . paddingRight = '' ;
158
160
} ;
159
- } , [ innerShow ] ) ;
161
+ } , [ innerShow , nonInvasive ] ) ;
160
162
161
163
useEffect ( ( ) => {
162
164
if ( show ) {
@@ -167,22 +169,24 @@ const MDBModal: React.FC<ModalProps> = ({
167
169
} , 0 ) ;
168
170
setTimeout ( ( ) => {
169
171
setIsOpenModal ( true ) ;
170
- setShow && setShow ( true ) ;
172
+ setShow ?. ( true ) ;
171
173
} , 150 ) ;
172
174
} else {
173
175
closeModal ( ) ;
174
176
}
175
177
} , [ show , closeModal , setShow , onShow ] ) ;
176
178
177
179
useEffect ( ( ) => {
178
- window . addEventListener ( 'click' , handleClickOutside ) ;
179
- window . addEventListener ( 'keydown' , handleKeydown ) ;
180
+ if ( ! nonInvasive ) {
181
+ window . addEventListener ( 'click' , handleClickOutside ) ;
182
+ window . addEventListener ( 'keydown' , handleKeydown ) ;
183
+ }
180
184
181
185
return ( ) => {
182
186
window . removeEventListener ( 'click' , handleClickOutside ) ;
183
187
window . removeEventListener ( 'keydown' , handleKeydown ) ;
184
188
} ;
185
- } , [ handleKeydown , handleClickOutside ] ) ;
189
+ } , [ handleKeydown , handleClickOutside , nonInvasive ] ) ;
186
190
187
191
const appendToBodyTemplate = (
188
192
< >
@@ -192,12 +196,15 @@ const MDBModal: React.FC<ModalProps> = ({
192
196
< Tag
193
197
className = { classes }
194
198
ref = { modalReference }
195
- style = { { display : innerShow || show ? 'block' : 'none' } }
199
+ style = { { display : innerShow || show ? 'block' : 'none' , pointerEvents : nonInvasive ? 'none' : 'initial' } }
196
200
{ ...props }
197
201
>
198
202
{ children }
199
203
</ Tag >
200
- { ReactDOM . createPortal ( backdrop && innerShow && < div className = { backdropClasses } > </ div > , document . body ) }
204
+ { ReactDOM . createPortal (
205
+ backdrop && innerShow && ! nonInvasive && < div className = { backdropClasses } > </ div > ,
206
+ document . body
207
+ ) }
201
208
</ > ,
202
209
document . body
203
210
) }
@@ -211,18 +218,21 @@ const MDBModal: React.FC<ModalProps> = ({
211
218
< Tag
212
219
className = { classes }
213
220
ref = { modalReference }
214
- style = { { display : innerShow || show ? 'block' : 'none' } }
221
+ style = { { display : innerShow || show ? 'block' : 'none' , pointerEvents : nonInvasive ? 'none' : 'initial' } }
215
222
{ ...props }
216
223
>
217
224
{ children }
218
225
</ Tag >
219
- { ReactDOM . createPortal ( backdrop && innerShow && < div className = { backdropClasses } > </ div > , document . body ) }
226
+ { ReactDOM . createPortal (
227
+ backdrop && innerShow && ! nonInvasive && < div className = { backdropClasses } > </ div > ,
228
+ document . body
229
+ ) }
220
230
</ >
221
231
) }
222
232
</ >
223
233
) ;
224
234
225
235
return < > { appendToBody ? appendToBodyTemplate : modalTemplate } </ > ;
226
236
} ;
227
- MDBModal . defaultProps = { tag : 'div' , backdrop : true , closeOnEsc : true , leaveHiddenModal : true } ;
237
+
228
238
export default MDBModal ;
0 commit comments