Skip to content

Commit 5ba0113

Browse files
authored
Merge pull request #24 from kuroppe1819/feature/close-on-overlay-click
add option that don't close on overlay click.
2 parents 4af9ca5 + e08309e commit 5ba0113

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { useModal } from 'react-hooks-use-modal';
1212
const App = () => {
1313
const [Modal, open, close, isOpen] = useModal('root', {
1414
preventScroll: true,
15+
closeOnOverlayClick: false;
1516
});
1617
return (
1718
<div>
@@ -32,7 +33,7 @@ render(<App />, document.getElementById('root'));
3233
3334
## Syntax
3435
35-
### [ModalComponent, openFunc, closeFunc, isOpenBool] = useModal(domNode?, { preventScroll? })
36+
### [ModalComponent, openFunc, closeFunc, isOpenBool] = useModal(domNode?, { preventScroll?, closeOnOverlayClick? })
3637
3738
`ModalComponent`
3839
Modal component that displays children in the screen center.
@@ -56,6 +57,10 @@ You can specify the output destination domNode with this argument
5657
Optional to prevent scrolling while modal is open.
5758
Default value is false.
5859
60+
`closeOnOverlayClick`
61+
Optional to close modal when click the overlay.
62+
Default value is true.
63+
5964
## Demo
6065
6166
https://microcmsio.github.io/react-hooks-use-modal/

examples/src/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const modalStyle: React.CSSProperties = {
1111
const App = () => {
1212
const [Modal, open, close, isOpen] = useModal('root', {
1313
preventScroll: true,
14+
closeOnOverlayClick: false,
1415
});
1516
return (
1617
<div>

src/index.tsx

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import disableScroll from 'disable-scroll';
55
export interface ModalProps {
66
children: React.ReactNode;
77
isOpen: boolean;
8-
close: () => void;
8+
onOverlayClick: React.MouseEventHandler<HTMLDivElement>;
99
elementId: 'root' | string;
1010
};
1111

1212
export interface ModalOptions {
1313
preventScroll?: boolean;
14+
closeOnOverlayClick?: boolean;
1415
};
1516

1617
export type UseModal = (
@@ -35,7 +36,7 @@ const wrapperStyle: React.CSSProperties = {
3536
zIndex: 1000,
3637
};
3738

38-
const maskStyle: React.CSSProperties = {
39+
const overlayStyle: React.CSSProperties = {
3940
position: 'fixed',
4041
top: 0,
4142
left: 0,
@@ -50,21 +51,21 @@ const containerStyle: React.CSSProperties = {
5051
zIndex: 100001,
5152
};
5253

53-
const Modal: React.FC<ModalProps> = ({ children, isOpen = false, close, elementId = 'root' }) => {
54+
const Modal: React.FC<ModalProps> = ({ children, isOpen = false, onOverlayClick, elementId = 'root' }) => {
5455
if (isOpen === false) {
5556
return null;
5657
}
5758
return createPortal(
5859
<div style={wrapperStyle}>
59-
<div style={maskStyle} onClick={close} />
60+
<div style={overlayStyle} onClick={onOverlayClick} />
6061
<div style={containerStyle}>{children}</div>
6162
</div>,
6263
document.getElementById(elementId) as HTMLElement
6364
);
6465
};
6566

6667
export const useModal: UseModal = (elementId = 'root', options = {}) => {
67-
const { preventScroll = false } = options;
68+
const { preventScroll = false, closeOnOverlayClick = true } = options;
6869
const [isOpen, setOpen] = useState<boolean>(false);
6970
const open = useCallback(() => {
7071
setOpen(true);
@@ -78,11 +79,17 @@ export const useModal: UseModal = (elementId = 'root', options = {}) => {
7879
disableScroll.off();
7980
}
8081
}, [setOpen, preventScroll]);
82+
const onOverlayClick = useCallback((event: React.MouseEvent<HTMLDivElement>) => {
83+
event.stopPropagation();
84+
if (closeOnOverlayClick) {
85+
close();
86+
}
87+
}, [closeOnOverlayClick, close]);
8188

8289
const ModalWrapper = useCallback(
8390
({ children }) => {
8491
return (
85-
<Modal isOpen={isOpen} close={close} elementId={elementId}>
92+
<Modal isOpen={isOpen} onOverlayClick={onOverlayClick} elementId={elementId}>
8693
{children}
8794
</Modal>
8895
);

0 commit comments

Comments
 (0)