UNPKG

zarm

Version:

基于 React 的移动端UI库

146 lines (133 loc) 5.47 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } import { createBEM } from '@zarm-design/bem'; import * as React from 'react'; import { ConfigContext } from '../config-provider'; import Mask from '../mask'; import Transition from '../transition'; import Trigger from '../trigger'; import { renderToContainer } from '../utils/dom'; import { useLockScroll } from '../utils/hooks'; var TRANSITION_NAMES = { top: 'move-down', bottom: 'move-up', center: 'fade', left: 'move-left', right: 'move-right' }; var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) { var width = props.width, destroy = props.destroy, forceRender = props.forceRender, visible = props.visible, animationType = props.animationType, animationDuration = props.animationDuration, lockScroll = props.lockScroll, direction = props.direction, mask = props.mask, maskClassName = props.maskClassName, maskStyle = props.maskStyle, maskColor = props.maskColor, maskOpacity = props.maskOpacity, afterOpen = props.afterOpen, afterClose = props.afterClose, onOpen = props.onOpen, onClose = props.onClose, onMaskClick = props.onMaskClick, onEsc = props.onEsc, children = props.children; var _React$useContext = React.useContext(ConfigContext), prefixCls = _React$useContext.prefixCls, globalMountContainer = _React$useContext.mountContainer; var nodeRef = React.useRef(null); var maskRef = React.useRef(null); var bem = createBEM('popup', { prefixCls: prefixCls }); useLockScroll(visible && lockScroll); var handleEsc = React.useCallback(function () { onEsc === null || onEsc === void 0 ? void 0 : onEsc(); }, []); var handleClick = function handleClick(event) { var _maskRef$current; event.stopPropagation(); if (nodeRef.current !== event.target && nodeRef.current.contains(event.target)) { return; } (_maskRef$current = maskRef.current) === null || _maskRef$current === void 0 ? void 0 : _maskRef$current.click(); }; var transitionName = animationType !== null && animationType !== void 0 ? animationType : TRANSITION_NAMES[direction]; React.useImperativeHandle(ref, function () { return nodeRef.current; }); return /*#__PURE__*/React.createElement(Trigger, { visible: visible, onClose: handleEsc }, mask && /*#__PURE__*/React.createElement(Mask, { ref: maskRef, className: maskClassName, style: maskStyle, visible: visible, color: maskColor, opacity: maskOpacity, animationDuration: animationDuration, mountContainer: props.mountContainer, forceRender: forceRender, destroy: destroy, onClick: function onClick(e) { e.stopPropagation(); onMaskClick && onMaskClick(e); } }), /*#__PURE__*/React.createElement(Transition, { nodeRef: nodeRef, visible: visible, tranisitionName: "".concat(prefixCls, "-").concat(transitionName), duration: animationDuration, forceRender: forceRender, destroy: destroy, onEnter: function onEnter() { afterOpen === null || afterOpen === void 0 ? void 0 : afterOpen(); }, onEnterActive: function onEnterActive() { onOpen === null || onOpen === void 0 ? void 0 : onOpen(); }, onLeaveActive: function onLeaveActive() { onClose === null || onClose === void 0 ? void 0 : onClose(); }, onLeaveEnd: function onLeaveEnd() { afterClose === null || afterClose === void 0 ? void 0 : afterClose(); } }, function (_ref, setNodeRef) { var _props$mountContainer; var className = _ref.className, style = _ref.style; var display = style.display, restStyle = _objectWithoutProperties(style, ["display"]); return renderToContainer((_props$mountContainer = props.mountContainer) !== null && _props$mountContainer !== void 0 ? _props$mountContainer : globalMountContainer, /*#__PURE__*/React.createElement("div", { className: bem('wrapper', [{ center: direction === 'center' }, props.className]), style: _objectSpread(_objectSpread({}, props.style), {}, { display: display }), onClick: handleClick }, /*#__PURE__*/React.createElement("div", { ref: setNodeRef, className: bem([_defineProperty({}, "".concat(direction), !!direction), className]), style: _objectSpread(_objectSpread({}, restStyle), {}, { width: width }) }, children))); })); }); Popup.displayName = 'Popup'; Popup.defaultProps = { visible: false, mask: true, direction: 'bottom', destroy: true, lockScroll: true }; export default Popup;