@@ -5,12 +5,13 @@ import disableScroll from 'disable-scroll';
5
5
export interface ModalProps {
6
6
children : React . ReactNode ;
7
7
isOpen : boolean ;
8
- close : ( ) => void ;
8
+ onOverlayClick : React . MouseEventHandler < HTMLDivElement > ;
9
9
elementId : 'root' | string ;
10
10
} ;
11
11
12
12
export interface ModalOptions {
13
13
preventScroll ?: boolean ;
14
+ closeOnOverlayClick ?: boolean ;
14
15
} ;
15
16
16
17
export type UseModal = (
@@ -35,7 +36,7 @@ const wrapperStyle: React.CSSProperties = {
35
36
zIndex : 1000 ,
36
37
} ;
37
38
38
- const maskStyle : React . CSSProperties = {
39
+ const overlayStyle : React . CSSProperties = {
39
40
position : 'fixed' ,
40
41
top : 0 ,
41
42
left : 0 ,
@@ -50,21 +51,21 @@ const containerStyle: React.CSSProperties = {
50
51
zIndex : 100001 ,
51
52
} ;
52
53
53
- const Modal : React . FC < ModalProps > = ( { children, isOpen = false , close , elementId = 'root' } ) => {
54
+ const Modal : React . FC < ModalProps > = ( { children, isOpen = false , onOverlayClick , elementId = 'root' } ) => {
54
55
if ( isOpen === false ) {
55
56
return null ;
56
57
}
57
58
return createPortal (
58
59
< div style = { wrapperStyle } >
59
- < div style = { maskStyle } onClick = { close } />
60
+ < div style = { overlayStyle } onClick = { onOverlayClick } />
60
61
< div style = { containerStyle } > { children } </ div >
61
62
</ div > ,
62
63
document . getElementById ( elementId ) as HTMLElement
63
64
) ;
64
65
} ;
65
66
66
67
export const useModal : UseModal = ( elementId = 'root' , options = { } ) => {
67
- const { preventScroll = false } = options ;
68
+ const { preventScroll = false , closeOnOverlayClick = true } = options ;
68
69
const [ isOpen , setOpen ] = useState < boolean > ( false ) ;
69
70
const open = useCallback ( ( ) => {
70
71
setOpen ( true ) ;
@@ -78,11 +79,17 @@ export const useModal: UseModal = (elementId = 'root', options = {}) => {
78
79
disableScroll . off ( ) ;
79
80
}
80
81
} , [ setOpen , preventScroll ] ) ;
82
+ const onOverlayClick = useCallback ( ( event : React . MouseEvent < HTMLDivElement > ) => {
83
+ event . stopPropagation ( ) ;
84
+ if ( closeOnOverlayClick ) {
85
+ close ( ) ;
86
+ }
87
+ } , [ closeOnOverlayClick , close ] ) ;
81
88
82
89
const ModalWrapper = useCallback (
83
90
( { children } ) => {
84
91
return (
85
- < Modal isOpen = { isOpen } close = { close } elementId = { elementId } >
92
+ < Modal isOpen = { isOpen } onOverlayClick = { onOverlayClick } elementId = { elementId } >
86
93
{ children }
87
94
</ Modal >
88
95
) ;
0 commit comments