UNPKG

@sms-frontend/components

Version:

SMS Design React UI Library.

195 lines (194 loc) 12.4 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var react_1 = __importStar(require("react")); var react_transition_group_1 = require("react-transition-group"); var react_focus_lock_1 = __importDefault(require("react-focus-lock")); var react_dom_1 = require("react-dom"); var IconClose_1 = __importDefault(require("../../icon/react-icon-cjs/IconClose")); var classNames_1 = __importDefault(require("../_util/classNames")); var Button_1 = __importDefault(require("../Button")); var Portal_1 = __importDefault(require("../Portal")); var ConfigProvider_1 = __importStar(require("../ConfigProvider")); var dom_1 = require("../_util/dom"); var icon_hover_1 = __importDefault(require("../_class/icon-hover")); var keycode_1 = require("../_util/keycode"); var is_1 = require("../_util/is"); var useOverflowHidden_1 = __importDefault(require("../_util/hooks/useOverflowHidden")); var useMergeProps_1 = __importDefault(require("../_util/hooks/useMergeProps")); var defaultProps = { placement: 'right', width: 250, height: 250, escToExit: true, mask: true, closable: true, maskClosable: true, mountOnEnter: true, getPopupContainer: function () { return document.body; }, }; function Drawer(baseProps, ref) { var _a, _b, _c; var context = (0, react_1.useContext)(ConfigProvider_1.ConfigContext); var locale = context.locale, getPrefixCls = context.getPrefixCls, componentConfig = context.componentConfig; var props = (0, useMergeProps_1.default)(baseProps, defaultProps, componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Drawer); var style = props.style, className = props.className, children = props.children, wrapClassName = props.wrapClassName, maskStyle = props.maskStyle, headerStyle = props.headerStyle, bodyStyle = props.bodyStyle, title = props.title, footer = props.footer, okText = props.okText, cancelText = props.cancelText, width = props.width, height = props.height, placement = props.placement, mask = props.mask, visible = props.visible, closable = props.closable, maskClosable = props.maskClosable, confirmLoading = props.confirmLoading, mountOnEnter = props.mountOnEnter, unmountOnExit = props.unmountOnExit, afterOpen = props.afterOpen, afterClose = props.afterClose, getPopupContainer = props.getPopupContainer, escToExit = props.escToExit, propGetChildrenPopupContainer = props.getChildrenPopupContainer, focusLock = props.focusLock, autoFocus = props.autoFocus, okButtonProps = props.okButtonProps, cancelButtonProps = props.cancelButtonProps; var drawerWrapperRef = (0, react_1.useRef)(null); var contentWrapperRef = (0, react_1.useRef)(null); var _d = __read((0, react_1.useState)(false), 2), shouldReComputeFixed = _d[0], setShouldReComputeFixed = _d[1]; var _e = __read((0, react_1.useState)(), 2), popupZIndex = _e[0], setPopupZIndex = _e[1]; var prefixCls = getPrefixCls('drawer'); // Record whether is exiting, to prevent `onCancel` being unnecessarily triggered when mask is clicked during the period. var inExit = (0, react_1.useRef)(false); // Record whether it's opened to avoid element shaking during animation caused by focus lock. var _f = __read((0, react_1.useState)(false), 2), isOpened = _f[0], setIsOpened = _f[1]; var getContainer = (0, react_1.useCallback)(function () { var container = getPopupContainer && getPopupContainer(); return ((0, react_dom_1.findDOMNode)(container) || document.body); }, [getPopupContainer]); var isFixed = (0, react_1.useMemo)(function () { return !dom_1.isServerRendering && getContainer() === document.body; }, [shouldReComputeFixed, getContainer]); (0, useOverflowHidden_1.default)(getContainer, { hidden: visible && mask }); (0, react_1.useImperativeHandle)(ref, function () { return drawerWrapperRef.current; }); (0, react_1.useEffect)(function () { // 初始就是展示,且设置了 getPopupContainer 时,组件挂载后重新执行下 isFixed 的计算逻辑,避免 getPopupContainer 返回的节点还未挂载,导致 isFixed 为true,样式表现错误的问题。 if (visible && props.getPopupContainer) { // Recompute `isFixed` to avoid style error resulting from truthy `isFixed` value due to the custom container dom is not mounted yet. setShouldReComputeFixed(true); } }, []); (0, react_1.useEffect)(function () { var _a; if (visible && popupZIndex === undefined) { if (drawerWrapperRef.current) { // Set zIndex for nested drawer components based on zIndex of wrapper var zIndex = +((_a = window.getComputedStyle(drawerWrapperRef.current, null)) === null || _a === void 0 ? void 0 : _a.zIndex); if (!isNaN(zIndex)) { setPopupZIndex(zIndex + 1); } } } }, [visible, popupZIndex]); (0, react_1.useEffect)(function () { var onKeyDown = function (e) { if (escToExit && e && e.key === keycode_1.Esc.key && props.onCancel) { props.onCancel(); } }; if (visible) { (0, dom_1.on)(document, 'keydown', onKeyDown); } return function () { (0, dom_1.off)(document, 'keydown', onKeyDown); }; }, [visible, escToExit]); var element = (react_1.default.createElement("div", { className: prefixCls + "-scroll" }, title !== null && (react_1.default.createElement("div", { className: prefixCls + "-header", style: headerStyle }, react_1.default.createElement("div", { className: prefixCls + "-header-title" }, title))), closable && (react_1.default.createElement(icon_hover_1.default, { onClick: props.onCancel, className: prefixCls + "-close-icon" }, react_1.default.createElement(IconClose_1.default, null))), react_1.default.createElement("div", { ref: contentWrapperRef, style: bodyStyle, className: (0, classNames_1.default)(prefixCls + "-content", (_a = {}, _a[prefixCls + "-content-nofooter"] = footer === null, _a[prefixCls + "-content-noheader"] = title === null, _a)) }, react_1.default.createElement(ConfigProvider_1.default, __assign({}, context, { zIndex: popupZIndex || 1050, getPopupContainer: function (node) { return typeof propGetChildrenPopupContainer === 'function' ? propGetChildrenPopupContainer(node) : contentWrapperRef.current; } }), children)), footer !== null && (footer ? (react_1.default.createElement("div", { className: prefixCls + "-footer" }, footer)) : (react_1.default.createElement("div", { className: prefixCls + "-footer" }, react_1.default.createElement(Button_1.default, __assign({ onClick: props.onCancel }, cancelButtonProps), cancelText || locale.Drawer.cancelText), react_1.default.createElement(Button_1.default, __assign({ type: "primary", loading: confirmLoading, onClick: props.onOk }, okButtonProps), okText || locale.Drawer.okText)))))); var globalFocusLockConfig = context.focusLock.drawer; var globalFocusLock = !!globalFocusLockConfig; var globalAutoFocus = (0, is_1.isObject)(globalFocusLockConfig) && globalFocusLockConfig.autoFocus; var innerFocusLock = focusLock !== undefined ? focusLock : globalFocusLock; var innerAutoFocus = autoFocus !== undefined ? autoFocus : globalAutoFocus; // Only enable FocusLock when drawer is fully opened, to avoid element shaking. var dom = innerFocusLock ? (react_1.default.createElement(react_focus_lock_1.default, { as: "span", disabled: !isOpened, autoFocus: innerAutoFocus }, element)) : (element); return (react_1.default.createElement(Portal_1.default, { forceRender: !mountOnEnter, visible: visible, getContainer: getPopupContainer }, react_1.default.createElement("div", { ref: drawerWrapperRef, className: (0, classNames_1.default)(prefixCls + "-wrapper", (_b = {}, _b[prefixCls + "-no-mask"] = !mask, _b[prefixCls + "-wrapper-hide"] = !visible, _b), wrapClassName), style: isFixed ? { position: 'fixed' } : { zIndex: 'inherit', position: 'absolute' } }, mask ? (react_1.default.createElement(react_transition_group_1.CSSTransition, { in: visible, appear: true, timeout: 300, classNames: "fadeInStandard", mountOnEnter: mountOnEnter, unmountOnExit: unmountOnExit }, react_1.default.createElement("div", { className: prefixCls + "-mask", style: maskStyle, onClick: function () { if (!inExit.current && maskClosable) { props.onCancel && props.onCancel(); } } }))) : null, react_1.default.createElement(react_transition_group_1.CSSTransition, { in: visible, appear: true, timeout: 300, classNames: { top: 'slideTop', bottom: 'slideBottom', left: 'slideLeft', right: 'slideRight', }[placement], mountOnEnter: mountOnEnter, unmountOnExit: unmountOnExit, onEnter: function (e) { e.parentNode.style.display = 'block'; }, onEntered: function () { setIsOpened(true); afterOpen && afterOpen(); }, onExit: function () { setIsOpened(false); inExit.current = true; }, onExited: function (e) { inExit.current = false; e.parentNode.style.display = ''; // don't set display='none' afterClose && afterClose(); } }, react_1.default.createElement("div", { className: (0, classNames_1.default)(prefixCls, className), style: Object.assign(placement === 'left' || placement === 'right' ? { width: width } : { height: height }, (_c = {}, _c[placement] = 0, _c), style) }, react_1.default.createElement("div", { className: prefixCls + "-inner" }, react_1.default.createElement(ConfigProvider_1.default, __assign({}, context, { zIndex: popupZIndex || 1050 }), dom))))))); } var DrawerComponent = react_1.default.forwardRef(Drawer); DrawerComponent.displayName = 'Drawer'; exports.default = DrawerComponent;