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, onPointerDownCapture = props.onPointerDownCapture, 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 || (_motion$onVisibleChan = motion.onVisibleChanged) === null || _motion$onVisibleChan === 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, onPointerDownCapture: onPointerDownCapture }, 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;