UNPKG

wix-style-react

Version:
271 lines (218 loc) • 11.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactModal = _interopRequireDefault(require("react-modal")); var _X = _interopRequireDefault(require("wix-ui-icons-common/X")); var _defaultTo = _interopRequireDefault(require("lodash/defaultTo")); var _ModalSt = require("./Modal.st.css"); var _constants = require("./constants"); var _ZIndex = require("../ZIndex"); var _context = require("../FontUpgrade/context"); var _FontUpgrade = _interopRequireDefault(require("../FontUpgrade")); var _ThemeProviderConsumerBackwardCompatible = require("../ThemeProvider/ThemeProviderConsumerBackwardCompatible"); var _uniqueId = _interopRequireDefault(require("lodash/uniqueId")); function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } var Modal = /*#__PURE__*/function (_React$PureComponent) { (0, _inherits2["default"])(Modal, _React$PureComponent); var _super = _createSuper(Modal); function Modal(props) { var _this; (0, _classCallCheck2["default"])(this, Modal); _this = _super.call(this, props); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "handleOverlayClick", function (event) { var _this$props = _this.props, shouldCloseOnOverlayClick = _this$props.shouldCloseOnOverlayClick, onRequestClose = _this$props.onRequestClose; if (shouldCloseOnOverlayClick && event.target.id === _this.CHILDREN_WRAPPER_DIV_ID && onRequestClose) { onRequestClose(); } }); (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "renderCloseButton", function () { return /*#__PURE__*/_react["default"].createElement("div", { onClick: _this.props.onRequestClose, className: _ModalSt.classes.closeButton, "data-hook": "modal-close-button" }, /*#__PURE__*/_react["default"].createElement(_X["default"], { size: "18px" })); }); _this.CHILDREN_WRAPPER_DIV_ID = (0, _uniqueId["default"])('wsr-modal'); return _this; } (0, _createClass2["default"])(Modal, [{ key: "render", value: function render() { var _this2 = this; var _this$props2 = this.props, dataHook = _this$props2.dataHook, horizontalPosition = _this$props2.horizontalPosition, verticalPosition = _this$props2.verticalPosition, height = _this$props2.height, scrollableContent = _this$props2.scrollableContent, borderRadius = _this$props2.borderRadius, zIndex = _this$props2.zIndex, scrollable = _this$props2.scrollable, isOpen = _this$props2.isOpen, shouldCloseOnOverlayClick = _this$props2.shouldCloseOnOverlayClick, shouldDisplayCloseButton = _this$props2.shouldDisplayCloseButton, onRequestClose = _this$props2.onRequestClose, onAfterOpen = _this$props2.onAfterOpen, contentLabel = _this$props2.contentLabel, closeTimeoutMS = _this$props2.closeTimeoutMS, children = _this$props2.children, appElement = _this$props2.appElement, overlayPosition = _this$props2.overlayPosition, parentSelector = _this$props2.parentSelector, screen = _this$props2.screen; var maxHeight = this.props.maxHeight; var justifyContent = _constants.flexPositions[horizontalPosition]; var alignItems = _constants.flexPositions[verticalPosition]; maxHeight = scrollableContent && maxHeight === 'auto' ? '100vh' : maxHeight; var modalStyles = { overlay: { // Overriding defaults position: overlayPosition, top: 0, left: 0, right: 0, bottom: 0, zIndex: (0, _defaultTo["default"])(zIndex, (0, _ZIndex.ZIndex)('Modal')), backgroundColor: null, // null disables the property, use css instead // Overriding defaults - END display: 'flex', justifyContent: justifyContent, alignItems: alignItems, overflowY: scrollable ? 'auto' : 'hidden' }, content: { // Overriding defaults border: 'none', overflowY: scrollableContent ? 'auto' : 'initial', overflowX: scrollableContent ? 'hidden' : 'initial', height: height, maxHeight: maxHeight, width: '100%', WebkitOverflowScrolling: 'touch', outline: 'none', borderRadius: borderRadius, padding: '0px', // Overriding defaults - END backgroundColor: 'transparent', marginBottom: '0px', position: 'relative' } }; if (appElement) { _reactModal["default"].setAppElement(appElement); } else { _reactModal["default"].setAppElement('body'); } return /*#__PURE__*/_react["default"].createElement("div", { "data-hook": dataHook }, /*#__PURE__*/_react["default"].createElement(_context.FontUpgradeContext.Consumer, null, function (_ref) { var active = _ref.active; return /*#__PURE__*/_react["default"].createElement(_ThemeProviderConsumerBackwardCompatible.ThemeProviderConsumerBackwardCompatible, null, function (_ref2) { var themeClassName = _ref2.className; return /*#__PURE__*/_react["default"].createElement(_reactModal["default"], { portalClassName: (0, _ModalSt.st)(_ModalSt.classes.root, { scrollable: scrollable }, "portal portal-".concat(dataHook), themeClassName), isOpen: isOpen, shouldCloseOnOverlayClick: shouldCloseOnOverlayClick, onRequestClose: onRequestClose, onAfterOpen: onAfterOpen, style: modalStyles, className: _ModalSt.classes.modal, contentLabel: contentLabel, closeTimeoutMS: closeTimeoutMS, parentSelector: parentSelector }, /*#__PURE__*/_react["default"].createElement(_FontUpgrade["default"], { active: !!active }, isOpen && shouldDisplayCloseButton && _this2.renderCloseButton(), /*#__PURE__*/_react["default"].createElement("div", { "data-scrollable": scrollable || null, id: _this2.CHILDREN_WRAPPER_DIV_ID, className: (0, _ModalSt.st)(_ModalSt.classes.childrenContainer, { screen: screen }), onClick: _this2.handleOverlayClick }, children))); }); })); } }]); return Modal; }(_react["default"].PureComponent); (0, _defineProperty2["default"])(Modal, "propTypes", { /** Applied as data-hook HTML attribute that can be used to create driver in testing */ dataHook: _propTypes["default"].string, /** Controls if modal is open or closed */ isOpen: _propTypes["default"].bool.isRequired, /** Border radius of modal */ borderRadius: _propTypes["default"].number, /** a11y: The value of contentLabel is set as an aria-label on the modal element. This helps assistive technology, like screen readers, to add a label to an element that would otherwise be anonymous */ contentLabel: _propTypes["default"].string, /** Renders modal content */ children: _propTypes["default"].any, /** Controls z-index of the modal overlay */ zIndex: _propTypes["default"].number, /** Enables to close modal when mouse clicked on overlay area */ shouldCloseOnOverlayClick: _propTypes["default"].bool, /** Displays a close button on the top right corner of the overlay */ shouldDisplayCloseButton: _propTypes["default"].bool, /** Callback that will be executed when the modal is requested to be closed, prior to actually closing */ onRequestClose: _propTypes["default"].func, /** Callback that will be executed after the modal has been opened */ onAfterOpen: _propTypes["default"].func, /** Horizontal position of the modal */ horizontalPosition: _propTypes["default"].oneOf(['start', 'center', 'end']), /** Vertical position of the modal */ verticalPosition: _propTypes["default"].oneOf(['start', 'center', 'end']), /** Number indicating the milliseconds to wait before closing the modal */ closeTimeoutMS: _propTypes["default"].number, /** Specifies if modal portal supports scroll */ scrollable: _propTypes["default"].bool, /** Specifies if modal content should become scrollable when modal size will fit the window */ scrollableContent: _propTypes["default"].bool, /** Sets the maximum height for a scrollable content */ maxHeight: _propTypes["default"].string, /** Sets the height for modal's content container */ height: _propTypes["default"].string, /** css position of the modal overlay */ overlayPosition: _propTypes["default"].oneOf(['static', 'relative', 'absolute', 'fixed', 'sticky']), /** A function that returns a DOM element on which the modal should be appended to */ parentSelector: _propTypes["default"].func, /** Selector specifying where to apply the aria-hidden attribute */ appElement: _propTypes["default"].string, /** Specifies minimum spacing between full viewport and modal content */ screen: _propTypes["default"].oneOf(['full', 'desktop', 'mobile']) }); (0, _defineProperty2["default"])(Modal, "defaultProps", { borderRadius: 0, shouldCloseOnOverlayClick: false, shouldDisplayCloseButton: false, horizontalPosition: 'center', verticalPosition: 'center', closeTimeoutMS: 500, scrollable: true, scrollableContent: false, height: '100%', maxHeight: 'auto', overlayPosition: 'fixed', screen: 'full' }); var _default = Modal; exports["default"] = _default;