amis-rpc-design/node_modules/@rc-component/trigger/es/Popup/index.js
2023-10-07 19:42:30 +08:00

185 lines
6.3 KiB
JavaScript

import _extends from "@babel/runtime/helpers/esm/extends";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import classNames from 'classnames';
import CSSMotion from 'rc-motion';
import ResizeObserver from 'rc-resize-observer';
import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
import { composeRef } from "rc-util/es/ref";
import * as React from 'react';
import Arrow from "./Arrow";
import Mask from "./Mask";
import PopupContent from "./PopupContent";
var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
var popup = props.popup,
className = props.className,
prefixCls = props.prefixCls,
style = props.style,
target = props.target,
_onVisibleChanged = props.onVisibleChanged,
open = props.open,
keepDom = props.keepDom,
fresh = props.fresh,
onClick = props.onClick,
mask = props.mask,
arrow = props.arrow,
arrowPos = props.arrowPos,
align = props.align,
motion = props.motion,
maskMotion = props.maskMotion,
forceRender = props.forceRender,
getPopupContainer = props.getPopupContainer,
autoDestroy = props.autoDestroy,
Portal = props.portal,
zIndex = props.zIndex,
onMouseEnter = props.onMouseEnter,
onMouseLeave = props.onMouseLeave,
onPointerEnter = props.onPointerEnter,
ready = props.ready,
offsetX = props.offsetX,
offsetY = props.offsetY,
offsetR = props.offsetR,
offsetB = props.offsetB,
onAlign = props.onAlign,
onPrepare = props.onPrepare,
stretch = props.stretch,
targetWidth = props.targetWidth,
targetHeight = props.targetHeight;
var childNode = typeof popup === 'function' ? popup() : popup;
// We can not remove holder only when motion finished.
var isNodeVisible = open || keepDom;
// ======================= Container ========================
var getPopupContainerNeedParams = (getPopupContainer === null || getPopupContainer === void 0 ? void 0 : getPopupContainer.length) > 0;
var _React$useState = React.useState(!getPopupContainer || !getPopupContainerNeedParams),
_React$useState2 = _slicedToArray(_React$useState, 2),
show = _React$useState2[0],
setShow = _React$useState2[1];
// Delay to show since `getPopupContainer` need target element
useLayoutEffect(function () {
if (!show && getPopupContainerNeedParams && target) {
setShow(true);
}
}, [show, getPopupContainerNeedParams, target]);
// ========================= Render =========================
if (!show) {
return null;
}
// >>>>> Offset
var AUTO = 'auto';
var offsetStyle = {
left: '-1000vw',
top: '-1000vh',
right: AUTO,
bottom: AUTO
};
// Set align style
if (ready || !open) {
var _experimental;
var points = align.points;
var dynamicInset = align.dynamicInset || ((_experimental = align._experimental) === null || _experimental === void 0 ? void 0 : _experimental.dynamicInset);
var alignRight = dynamicInset && points[0][1] === 'r';
var alignBottom = dynamicInset && points[0][0] === 'b';
if (alignRight) {
offsetStyle.right = offsetR;
offsetStyle.left = AUTO;
} else {
offsetStyle.left = offsetX;
offsetStyle.right = AUTO;
}
if (alignBottom) {
offsetStyle.bottom = offsetB;
offsetStyle.top = AUTO;
} else {
offsetStyle.top = offsetY;
offsetStyle.bottom = AUTO;
}
}
// >>>>> Misc
var miscStyle = {};
if (stretch) {
if (stretch.includes('height') && targetHeight) {
miscStyle.height = targetHeight;
} else if (stretch.includes('minHeight') && targetHeight) {
miscStyle.minHeight = targetHeight;
}
if (stretch.includes('width') && targetWidth) {
miscStyle.width = targetWidth;
} else if (stretch.includes('minWidth') && targetWidth) {
miscStyle.minWidth = targetWidth;
}
}
if (!open) {
miscStyle.pointerEvents = 'none';
}
return /*#__PURE__*/React.createElement(Portal, {
open: forceRender || isNodeVisible,
getContainer: getPopupContainer && function () {
return getPopupContainer(target);
},
autoDestroy: autoDestroy
}, /*#__PURE__*/React.createElement(Mask, {
prefixCls: prefixCls,
open: open,
zIndex: zIndex,
mask: mask,
motion: maskMotion
}), /*#__PURE__*/React.createElement(ResizeObserver, {
onResize: onAlign,
disabled: !open
}, function (resizeObserverRef) {
return /*#__PURE__*/React.createElement(CSSMotion, _extends({
motionAppear: true,
motionEnter: true,
motionLeave: true,
removeOnLeave: false,
forceRender: forceRender,
leavedClassName: "".concat(prefixCls, "-hidden")
}, motion, {
onAppearPrepare: onPrepare,
onEnterPrepare: onPrepare,
visible: open,
onVisibleChanged: function onVisibleChanged(nextVisible) {
var _motion$onVisibleChan;
motion === null || motion === void 0 ? void 0 : (_motion$onVisibleChan = motion.onVisibleChanged) === null || _motion$onVisibleChan === void 0 ? void 0 : _motion$onVisibleChan.call(motion, nextVisible);
_onVisibleChanged(nextVisible);
}
}), function (_ref, motionRef) {
var motionClassName = _ref.className,
motionStyle = _ref.style;
var cls = classNames(prefixCls, motionClassName, className);
return /*#__PURE__*/React.createElement("div", {
ref: composeRef(resizeObserverRef, ref, motionRef),
className: cls,
style: _objectSpread(_objectSpread(_objectSpread(_objectSpread({
'--arrow-x': "".concat(arrowPos.x || 0, "px"),
'--arrow-y': "".concat(arrowPos.y || 0, "px")
}, offsetStyle), miscStyle), motionStyle), {}, {
boxSizing: 'border-box',
zIndex: zIndex
}, style),
onMouseEnter: onMouseEnter,
onMouseLeave: onMouseLeave,
onPointerEnter: onPointerEnter,
onClick: onClick
}, arrow && /*#__PURE__*/React.createElement(Arrow, {
prefixCls: prefixCls,
arrow: arrow,
arrowPos: arrowPos,
align: align
}), /*#__PURE__*/React.createElement(PopupContent, {
cache: !open && !fresh
}, childNode));
});
}));
});
if (process.env.NODE_ENV !== 'production') {
Popup.displayName = 'Popup';
}
export default Popup;