diff --git a/src/renderer/auth/components/Auth/Auth.js b/src/renderer/auth/components/Auth/Auth.js index c402e62af..cbd385a53 100644 --- a/src/renderer/auth/components/Auth/Auth.js +++ b/src/renderer/auth/components/Auth/Auth.js @@ -34,14 +34,18 @@ export default class Auth extends React.PureComponent { }; render() { - const { className, authenticated, onConfirm } = this.props; + const { className, authenticated, onConfirm, onCancel } = this.props; if (authenticated) { onConfirm(); } // TODO use renderHeader & renderFooter instead of AuthPanel + add SidePanel option - return {this.renderComponent()}; + return ( + + {this.renderComponent()} + + ); } renderComponent = () => { diff --git a/src/renderer/shared/components/Alert/Alert.js b/src/renderer/shared/components/Alert/Alert.js index 7de5b49d0..d2b537c91 100644 --- a/src/renderer/shared/components/Alert/Alert.js +++ b/src/renderer/shared/components/Alert/Alert.js @@ -13,7 +13,8 @@ export default class Alert extends React.PureComponent { children: node, title: string, confirmLabel: string, - onConfirm: func + onConfirm: func, + onCancel: func }; static defaultProps = { @@ -21,7 +22,8 @@ export default class Alert extends React.PureComponent { children: null, title: null, confirmLabel: 'OK', - onConfirm: noop + onConfirm: noop, + onCancel: noop }; componentDidMount() { @@ -29,10 +31,10 @@ export default class Alert extends React.PureComponent { } render() { - const { className, confirmLabel, onConfirm, children } = this.props; + const { className, confirmLabel, onConfirm, children, onCancel } = this.props; return ( - + {this.renderTitle()}
{children}
diff --git a/src/renderer/shared/components/Confirm/Confirm.js b/src/renderer/shared/components/Confirm/Confirm.js index b749cf14f..244045c77 100644 --- a/src/renderer/shared/components/Confirm/Confirm.js +++ b/src/renderer/shared/components/Confirm/Confirm.js @@ -47,6 +47,7 @@ export default class Confirm extends React.PureComponent { className={classNames(styles.confirm, className)} renderHeader={this.renderTitle} renderFooter={this.renderFooter} + handleClose={onCancel} >
{children}
diff --git a/src/renderer/shared/components/Modal/Modal.js b/src/renderer/shared/components/Modal/Modal.js index 30eb24f05..74ff342aa 100644 --- a/src/renderer/shared/components/Modal/Modal.js +++ b/src/renderer/shared/components/Modal/Modal.js @@ -4,6 +4,7 @@ import { string, func, node } from 'prop-types'; import { noop } from 'lodash'; import Portal from '../Portal'; +import OutSideClick from './OnClickOutside'; import styles from './Modal.scss'; export default class Modal extends React.PureComponent { @@ -11,26 +12,44 @@ export default class Modal extends React.PureComponent { className: string, children: node, renderHeader: func, - renderFooter: func + renderFooter: func, + handleClose: func }; static defaultProps = { className: null, children: null, renderHeader: noop, - renderFooter: noop + renderFooter: noop, + handleClose: noop }; + componentDidMount() { + document.addEventListener('keydown', this.escFunction); + } + + componentWillUnmount() { + document.removeEventListener('keydown', this.escFunction); + } + render() { return (
-
- {this.props.renderHeader()} - {this.props.children} - {this.props.renderFooter()} -
+ +
+ {this.props.renderHeader()} + {this.props.children} + {this.props.renderFooter()} +
+
); } + + escFunction = (event) => { + if (event.keyCode === 27) { + this.props.handleClose(); + } + }; } diff --git a/src/renderer/shared/components/Modal/OnClickOutside.js b/src/renderer/shared/components/Modal/OnClickOutside.js new file mode 100644 index 000000000..d7b1b3037 --- /dev/null +++ b/src/renderer/shared/components/Modal/OnClickOutside.js @@ -0,0 +1,40 @@ +import React from 'react'; +import { func, node } from 'prop-types'; + +export default class OnClickOutside extends React.PureComponent { + static propTypes = { + onClickOutside: func, + children: node + }; + + static defaultProps = { + onClickOutside: null, + children: null + }; + + componentDidMount() { + document.addEventListener('mousedown', this.handleClickOutside); + } + + componentWillUnmount() { + document.removeEventListener('mousedown', this.handleClickOutside); + } + + render() { + return
{this.props.children}
; + } + + handleClickOutside = (event) => { + if ( + this.wrapperRef && + !this.wrapperRef.contains(event.target) && + !event.target.outerHTML.toLowerCase().includes('toast') + ) { + this.props.onClickOutside(); + } + }; + + setWrapperRef = (el) => { + this.wrapperRef = el; + }; +} diff --git a/src/renderer/shared/components/NewWallet/NewWallet/NewWallet.js b/src/renderer/shared/components/NewWallet/NewWallet/NewWallet.js index bd43439a9..2f8f69688 100644 --- a/src/renderer/shared/components/NewWallet/NewWallet/NewWallet.js +++ b/src/renderer/shared/components/NewWallet/NewWallet/NewWallet.js @@ -38,6 +38,7 @@ export default class NewWallet extends React.PureComponent { className={classNames(styles.confirm, className)} renderHeader={this.renderTitle} renderFooter={this.renderFooter} + handleClose={onCancel} >