UNPKG

rsuite

Version:

A suite of react components

234 lines (195 loc) 9.64 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); exports.__esModule = true; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _taggedTemplateLiteralLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteralLoose")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _pick = _interopRequireDefault(require("lodash/pick")); var _on = _interopRequireDefault(require("dom-lib/on")); var _getAnimationEnd = _interopRequireDefault(require("dom-lib/getAnimationEnd")); var _Modal = _interopRequireWildcard(require("../Overlay/Modal")); var _Bounce = _interopRequireDefault(require("../Animation/Bounce")); var _utils = require("../utils"); var _ModalDialog = _interopRequireWildcard(require("./ModalDialog")); var _ModalContext = require("./ModalContext"); var _ModalBody = _interopRequireDefault(require("./ModalBody")); var _ModalHeader = _interopRequireDefault(require("./ModalHeader")); var _ModalTitle = _interopRequireDefault(require("./ModalTitle")); var _ModalFooter = _interopRequireDefault(require("./ModalFooter")); var _utils2 = require("./utils"); var _useUniqueId = _interopRequireDefault(require("../utils/useUniqueId")); var _deprecatePropType = _interopRequireDefault(require("../utils/deprecatePropType")); var _templateObject, _templateObject2; var modalSizes = ['xs', 'sm', 'md', 'lg', 'full']; var Modal = /*#__PURE__*/_react.default.forwardRef(function (props, ref) { var className = props.className, children = props.children, _props$classPrefix = props.classPrefix, classPrefix = _props$classPrefix === void 0 ? 'modal' : _props$classPrefix, dialogClassName = props.dialogClassName, backdropClassName = props.backdropClassName, _props$backdrop = props.backdrop, backdrop = _props$backdrop === void 0 ? true : _props$backdrop, dialogStyle = props.dialogStyle, _props$animation = props.animation, animation = _props$animation === void 0 ? _Bounce.default : _props$animation, open = props.open, _props$size = props.size, size = _props$size === void 0 ? 'sm' : _props$size, full = props.full, _props$dialogAs = props.dialogAs, Dialog = _props$dialogAs === void 0 ? _ModalDialog.default : _props$dialogAs, animationProps = props.animationProps, _props$animationTimeo = props.animationTimeout, animationTimeout = _props$animationTimeo === void 0 ? 300 : _props$animationTimeo, _props$overflow = props.overflow, overflow = _props$overflow === void 0 ? true : _props$overflow, _props$drawer = props.drawer, drawer = _props$drawer === void 0 ? false : _props$drawer, onClose = props.onClose, onEntered = props.onEntered, onEntering = props.onEntering, onExited = props.onExited, _props$role = props.role, role = _props$role === void 0 ? 'dialog' : _props$role, idProp = props.id, ariaLabelledby = props['aria-labelledby'], ariaDescribedby = props['aria-describedby'], rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["className", "children", "classPrefix", "dialogClassName", "backdropClassName", "backdrop", "dialogStyle", "animation", "open", "size", "full", "dialogAs", "animationProps", "animationTimeout", "overflow", "drawer", "onClose", "onEntered", "onEntering", "onExited", "role", "id", "aria-labelledby", "aria-describedby"]); var inClass = { in: open && !animation }; var _useClassNames = (0, _utils.useClassNames)(classPrefix), merge = _useClassNames.merge, prefix = _useClassNames.prefix; var _useState = (0, _react.useState)(false), shake = _useState[0], setShake = _useState[1]; var classes = merge(className, prefix(size, { full: full })); var dialogRef = (0, _react.useRef)(null); var transitionEndListener = (0, _react.useRef)(); // The style of the Modal body will be updated with the size of the window or container. var _useBodyStyles = (0, _utils2.useBodyStyles)(dialogRef, { overflow: overflow, drawer: drawer, prefix: prefix }), bodyStyles = _useBodyStyles[0], onChangeBodyStyles = _useBodyStyles[1], onDestroyEvents = _useBodyStyles[2]; var dialogId = (0, _useUniqueId.default)('dialog-', idProp); var modalContextValue = (0, _react.useMemo)(function () { return { dialogId: dialogId, onModalClose: onClose, getBodyStyles: function getBodyStyles() { return bodyStyles; }, isDrawer: drawer }; }, [dialogId, onClose, bodyStyles, drawer]); var handleExited = (0, _react.useCallback)(function (node) { var _transitionEndListene; onExited === null || onExited === void 0 ? void 0 : onExited(node); onDestroyEvents(); (_transitionEndListene = transitionEndListener.current) === null || _transitionEndListene === void 0 ? void 0 : _transitionEndListene.off(); transitionEndListener.current = null; }, [onDestroyEvents, onExited]); var handleEntered = (0, _react.useCallback)(function (node) { onEntered === null || onEntered === void 0 ? void 0 : onEntered(node); onChangeBodyStyles(); }, [onChangeBodyStyles, onEntered]); var handleEntering = (0, _react.useCallback)(function (node) { onEntering === null || onEntering === void 0 ? void 0 : onEntering(node); onChangeBodyStyles(true); }, [onChangeBodyStyles, onEntering]); var handleBackdropClick = (0, _react.useCallback)(function (e) { if (e.target !== e.currentTarget) { return; } // When the value of `backdrop` is `static`, a jitter animation will be added to the dialog when clicked. if (backdrop === 'static') { setShake(true); if (!transitionEndListener.current && dialogRef.current) { //fix: https://github.com/rsuite/rsuite/blob/a93d13c14fb20cc58204babe3331d3c3da3fe1fd/src/Modal/styles/index.less#L59 transitionEndListener.current = (0, _on.default)(dialogRef.current, (0, _getAnimationEnd.default)(), function () { setShake(false); }); } return; } onClose === null || onClose === void 0 ? void 0 : onClose(e); }, [backdrop, onClose]); var handleClick = (0, _react.useCallback)(function (e) { if (dialogRef.current && e.target !== dialogRef.current) { handleBackdropClick(e); } }, [handleBackdropClick]); (0, _utils.useWillUnmount)(function () { var _transitionEndListene2; (_transitionEndListene2 = transitionEndListener.current) === null || _transitionEndListene2 === void 0 ? void 0 : _transitionEndListene2.off(); }); return /*#__PURE__*/_react.default.createElement(_ModalContext.ModalContext.Provider, { value: modalContextValue }, /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, rest, { ref: ref, backdrop: backdrop, open: open, onClose: onClose, className: prefix(_templateObject || (_templateObject = (0, _taggedTemplateLiteralLoose2.default)(["wrapper"]))), onEntered: handleEntered, onEntering: handleEntering, onExited: handleExited, backdropClassName: merge(prefix(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteralLoose2.default)(["backdrop"]))), backdropClassName, inClass), containerClassName: prefix({ open: open, 'has-backdrop': backdrop }), transition: animation ? animation : undefined, animationProps: animationProps, dialogTransitionTimeout: animationTimeout, backdropTransitionTimeout: 150, onClick: backdrop ? handleClick : undefined }), function (transitionProps, transitionRef) { var transitionClassName = transitionProps.className, transitionRest = (0, _objectWithoutPropertiesLoose2.default)(transitionProps, ["className"]); return /*#__PURE__*/_react.default.createElement(Dialog, (0, _extends2.default)({ role: role, id: dialogId, "aria-labelledby": ariaLabelledby !== null && ariaLabelledby !== void 0 ? ariaLabelledby : dialogId + "-title", "aria-describedby": ariaDescribedby }, transitionRest, (0, _pick.default)(rest, Object.keys(_ModalDialog.modalDialogPropTypes)), { ref: (0, _utils.mergeRefs)(dialogRef, transitionRef), classPrefix: classPrefix, className: merge(classes, transitionClassName, prefix({ shake: shake })), dialogClassName: dialogClassName, dialogStyle: dialogStyle }), children); })); }); Modal.Body = _ModalBody.default; Modal.Header = _ModalHeader.default; Modal.Title = _ModalTitle.default; Modal.Footer = _ModalFooter.default; Modal.Dialog = _ModalDialog.default; Modal.displayName = 'Modal'; Modal.propTypes = (0, _extends2.default)({}, _Modal.modalPropTypes, { animation: _propTypes.default.any, animationTimeout: _propTypes.default.number, classPrefix: _propTypes.default.string, dialogClassName: _propTypes.default.string, size: _propTypes.default.oneOf(modalSizes), dialogStyle: _propTypes.default.object, dialogAs: _propTypes.default.elementType, full: (0, _deprecatePropType.default)(_propTypes.default.bool, 'Use size="full" instead.'), overflow: _propTypes.default.bool, drawer: _propTypes.default.bool }); var _default = Modal; exports.default = _default;