UNPKG

@evg-b/evg-ui

Version:

EVG-UI library inspired by Material Design.

116 lines (102 loc) 3.44 kB
import _extends from '@babel/runtime/helpers/extends'; import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties'; import React, { useEffect } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import '@babel/runtime/helpers/slicedToArray'; import withStyles from '../styles/withStyles.js'; import '@babel/runtime/helpers/construct'; import '@babel/runtime/helpers/toConsumableArray'; import '@babel/runtime/helpers/defineProperty'; import '@babel/runtime/helpers/classCallCheck'; import '@babel/runtime/helpers/createClass'; import { createPortal } from 'react-dom'; var styles = { base: { position: 'fixed', zIndex: 9999, right: 0, bottom: 0, top: 0, left: 0, display: 'flex', justifyContent: 'center', alignItems: 'center', overscrollBehavior: 'contain' } }; /** * Это окно, которое блокирует работу пользователя с родительским приложением до тех пор, пока пользователь это окно не закроет. * Подходит для создания диалогов и лайтбоксов. */ var Modal = /*#__PURE__*/React.forwardRef(function Modal(props, ref) { var classes = props.classes, className = props.className, children = props.children, _props$component = props.component, Component = _props$component === void 0 ? 'div' : _props$component, open = props.open, onClose = props.onClose, isEsc = props.isEsc, otherProps = _objectWithoutProperties(props, ["classes", "className", "children", "component", "open", "onClose", "isEsc"]); var Close = function Close(e) { if (e.target === e.currentTarget && open) { onClose && onClose(); } }; var CloseESC = function CloseESC(e) { e.preventDefault(); if (isEsc && 'Escape' === e.key && open) { onClose && onClose(); } }; useEffect(function () { window.addEventListener('keyup', CloseESC); return function () { return window.removeEventListener('keyup', CloseESC); }; }); return open ? /*#__PURE__*/createPortal( /*#__PURE__*/React.createElement(Component, _extends({ ref: ref, className: classNames(classes.base, className), onClick: Close }, otherProps), children), document.body) : null; }); Modal.propTypes = { /** * Это контент между открывающим и закрывающим тегом компонента. */ children: PropTypes.node, /** * Объект содержит jss стили компонента. */ classes: PropTypes.object, /** * Чтобы указать CSS классы, используйте этот атрибут. */ className: PropTypes.string, /** * Корневой узел. Это HTML элемент или компонент. */ component: PropTypes.elementType, /** * Если true, modal открыт. */ open: PropTypes.bool, /** * onClose() вызывается при попытки закрыть modal. */ onClose: PropTypes.func, /** * Если true, modal закрывается клавишей Esc. */ isEsc: PropTypes.bool }; Modal.defaultProps = { open: false, component: 'div', isEsc: true }; Modal.displayName = 'ModalEVG'; var Modal$1 = withStyles(styles)(Modal); export default Modal$1;