From 17a254ee5e20aa24797368f4eda1c21ec6b107aa Mon Sep 17 00:00:00 2001 From: George Lima Date: Wed, 19 Dec 2018 15:35:39 -0300 Subject: [PATCH] feature: add closeOnBackdropClick and closeOnEsc props in modal --- app/components/modal.js | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/app/components/modal.js b/app/components/modal.js index 63493ef..c110779 100644 --- a/app/components/modal.js +++ b/app/components/modal.js @@ -22,7 +22,9 @@ const ChildrenWrapper = styled.div` type Props = { renderTrigger: (() => void) => Element<*>, - children: Element<*>, + children: (() => void) => Element<*>, + closeOnBackdropClick?: boolean, + closeOnEsc?: boolean, }; type State = { @@ -34,16 +36,29 @@ const modalRoot = document.getElementById('modal-root'); export class ModalComponent extends PureComponent { element = document.createElement('div'); + static defaultProps = { + closeOnBackdropClick: true, + closeOnEsc: true, + }; + state = { isVisible: false, }; componentDidMount() { - window.addEventListener('keydown', this.handleEscPress); + const { closeOnEsc } = this.props; + + if (closeOnEsc) { + window.addEventListener('keydown', this.handleEscPress); + } } componentWillUnmount() { - window.removeEventListener('keydown', this.handleEscPress); + const { closeOnEsc } = this.props; + + if (closeOnEsc) { + window.removeEventListener('keydown', this.handleEscPress); + } } handleEscPress = (event: Object) => { @@ -73,21 +88,25 @@ export class ModalComponent extends PureComponent { }; render() { - const { renderTrigger, children } = this.props; + const { renderTrigger, children, closeOnBackdropClick } = this.props; const { isVisible } = this.state; + const toggleVisibility = isVisible ? this.close : this.open; return ( - {renderTrigger(isVisible ? this.close : this.open)} + {renderTrigger(toggleVisibility)} {isVisible ? createPortal( { - if (event.target.id === 'modal-portal-wrapper') this.close(); + if ( + closeOnBackdropClick + && event.target.id === 'modal-portal-wrapper' + ) this.close(); }} > - {children} + {children(toggleVisibility)} , this.element, )