index.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  4. Object.defineProperty(exports, "__esModule", {
  5. value: true
  6. });
  7. exports.default = void 0;
  8. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  9. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  10. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  11. var _classnames = _interopRequireDefault(require("classnames"));
  12. var _rcMotion = _interopRequireDefault(require("rc-motion"));
  13. var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer"));
  14. var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
  15. var _ref2 = require("rc-util/lib/ref");
  16. var React = _interopRequireWildcard(require("react"));
  17. var _Arrow = _interopRequireDefault(require("./Arrow"));
  18. var _Mask = _interopRequireDefault(require("./Mask"));
  19. var _PopupContent = _interopRequireDefault(require("./PopupContent"));
  20. var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
  21. var popup = props.popup,
  22. className = props.className,
  23. prefixCls = props.prefixCls,
  24. style = props.style,
  25. target = props.target,
  26. _onVisibleChanged = props.onVisibleChanged,
  27. open = props.open,
  28. keepDom = props.keepDom,
  29. fresh = props.fresh,
  30. onClick = props.onClick,
  31. mask = props.mask,
  32. arrow = props.arrow,
  33. arrowPos = props.arrowPos,
  34. align = props.align,
  35. motion = props.motion,
  36. maskMotion = props.maskMotion,
  37. forceRender = props.forceRender,
  38. getPopupContainer = props.getPopupContainer,
  39. autoDestroy = props.autoDestroy,
  40. Portal = props.portal,
  41. zIndex = props.zIndex,
  42. onMouseEnter = props.onMouseEnter,
  43. onMouseLeave = props.onMouseLeave,
  44. onPointerEnter = props.onPointerEnter,
  45. onPointerDownCapture = props.onPointerDownCapture,
  46. ready = props.ready,
  47. offsetX = props.offsetX,
  48. offsetY = props.offsetY,
  49. offsetR = props.offsetR,
  50. offsetB = props.offsetB,
  51. onAlign = props.onAlign,
  52. onPrepare = props.onPrepare,
  53. stretch = props.stretch,
  54. targetWidth = props.targetWidth,
  55. targetHeight = props.targetHeight;
  56. var childNode = typeof popup === 'function' ? popup() : popup;
  57. // We can not remove holder only when motion finished.
  58. var isNodeVisible = open || keepDom;
  59. // ======================= Container ========================
  60. var getPopupContainerNeedParams = (getPopupContainer === null || getPopupContainer === void 0 ? void 0 : getPopupContainer.length) > 0;
  61. var _React$useState = React.useState(!getPopupContainer || !getPopupContainerNeedParams),
  62. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  63. show = _React$useState2[0],
  64. setShow = _React$useState2[1];
  65. // Delay to show since `getPopupContainer` need target element
  66. (0, _useLayoutEffect.default)(function () {
  67. if (!show && getPopupContainerNeedParams && target) {
  68. setShow(true);
  69. }
  70. }, [show, getPopupContainerNeedParams, target]);
  71. // ========================= Render =========================
  72. if (!show) {
  73. return null;
  74. }
  75. // >>>>> Offset
  76. var AUTO = 'auto';
  77. var offsetStyle = {
  78. left: '-1000vw',
  79. top: '-1000vh',
  80. right: AUTO,
  81. bottom: AUTO
  82. };
  83. // Set align style
  84. if (ready || !open) {
  85. var _experimental;
  86. var points = align.points;
  87. var dynamicInset = align.dynamicInset || ((_experimental = align._experimental) === null || _experimental === void 0 ? void 0 : _experimental.dynamicInset);
  88. var alignRight = dynamicInset && points[0][1] === 'r';
  89. var alignBottom = dynamicInset && points[0][0] === 'b';
  90. if (alignRight) {
  91. offsetStyle.right = offsetR;
  92. offsetStyle.left = AUTO;
  93. } else {
  94. offsetStyle.left = offsetX;
  95. offsetStyle.right = AUTO;
  96. }
  97. if (alignBottom) {
  98. offsetStyle.bottom = offsetB;
  99. offsetStyle.top = AUTO;
  100. } else {
  101. offsetStyle.top = offsetY;
  102. offsetStyle.bottom = AUTO;
  103. }
  104. }
  105. // >>>>> Misc
  106. var miscStyle = {};
  107. if (stretch) {
  108. if (stretch.includes('height') && targetHeight) {
  109. miscStyle.height = targetHeight;
  110. } else if (stretch.includes('minHeight') && targetHeight) {
  111. miscStyle.minHeight = targetHeight;
  112. }
  113. if (stretch.includes('width') && targetWidth) {
  114. miscStyle.width = targetWidth;
  115. } else if (stretch.includes('minWidth') && targetWidth) {
  116. miscStyle.minWidth = targetWidth;
  117. }
  118. }
  119. if (!open) {
  120. miscStyle.pointerEvents = 'none';
  121. }
  122. return /*#__PURE__*/React.createElement(Portal, {
  123. open: forceRender || isNodeVisible,
  124. getContainer: getPopupContainer && function () {
  125. return getPopupContainer(target);
  126. },
  127. autoDestroy: autoDestroy
  128. }, /*#__PURE__*/React.createElement(_Mask.default, {
  129. prefixCls: prefixCls,
  130. open: open,
  131. zIndex: zIndex,
  132. mask: mask,
  133. motion: maskMotion
  134. }), /*#__PURE__*/React.createElement(_rcResizeObserver.default, {
  135. onResize: onAlign,
  136. disabled: !open
  137. }, function (resizeObserverRef) {
  138. return /*#__PURE__*/React.createElement(_rcMotion.default, (0, _extends2.default)({
  139. motionAppear: true,
  140. motionEnter: true,
  141. motionLeave: true,
  142. removeOnLeave: false,
  143. forceRender: forceRender,
  144. leavedClassName: "".concat(prefixCls, "-hidden")
  145. }, motion, {
  146. onAppearPrepare: onPrepare,
  147. onEnterPrepare: onPrepare,
  148. visible: open,
  149. onVisibleChanged: function onVisibleChanged(nextVisible) {
  150. var _motion$onVisibleChan;
  151. motion === null || motion === void 0 || (_motion$onVisibleChan = motion.onVisibleChanged) === null || _motion$onVisibleChan === void 0 || _motion$onVisibleChan.call(motion, nextVisible);
  152. _onVisibleChanged(nextVisible);
  153. }
  154. }), function (_ref, motionRef) {
  155. var motionClassName = _ref.className,
  156. motionStyle = _ref.style;
  157. var cls = (0, _classnames.default)(prefixCls, motionClassName, className);
  158. return /*#__PURE__*/React.createElement("div", {
  159. ref: (0, _ref2.composeRef)(resizeObserverRef, ref, motionRef),
  160. className: cls,
  161. style: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({
  162. '--arrow-x': "".concat(arrowPos.x || 0, "px"),
  163. '--arrow-y': "".concat(arrowPos.y || 0, "px")
  164. }, offsetStyle), miscStyle), motionStyle), {}, {
  165. boxSizing: 'border-box',
  166. zIndex: zIndex
  167. }, style),
  168. onMouseEnter: onMouseEnter,
  169. onMouseLeave: onMouseLeave,
  170. onPointerEnter: onPointerEnter,
  171. onClick: onClick,
  172. onPointerDownCapture: onPointerDownCapture
  173. }, arrow && /*#__PURE__*/React.createElement(_Arrow.default, {
  174. prefixCls: prefixCls,
  175. arrow: arrow,
  176. arrowPos: arrowPos,
  177. align: align
  178. }), /*#__PURE__*/React.createElement(_PopupContent.default, {
  179. cache: !open && !fresh
  180. }, childNode));
  181. });
  182. }));
  183. });
  184. if (process.env.NODE_ENV !== 'production') {
  185. Popup.displayName = 'Popup';
  186. }
  187. var _default = exports.default = Popup;