You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
7.0 KiB
207 lines
7.0 KiB
"use strict";
|
|
|
|
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = void 0;
|
|
|
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
|
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
|
|
var React = _interopRequireWildcard(require("react"));
|
|
|
|
var _rcAlign = _interopRequireDefault(require("rc-align"));
|
|
|
|
var _rcMotion = _interopRequireDefault(require("rc-motion"));
|
|
|
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
|
|
var _useVisibleStatus3 = _interopRequireDefault(require("./useVisibleStatus"));
|
|
|
|
var _legacyUtil = require("../utils/legacyUtil");
|
|
|
|
var _useStretchStyle3 = _interopRequireDefault(require("./useStretchStyle"));
|
|
|
|
var PopupInner = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
var visible = props.visible,
|
|
prefixCls = props.prefixCls,
|
|
className = props.className,
|
|
style = props.style,
|
|
children = props.children,
|
|
zIndex = props.zIndex,
|
|
stretch = props.stretch,
|
|
destroyPopupOnHide = props.destroyPopupOnHide,
|
|
forceRender = props.forceRender,
|
|
align = props.align,
|
|
point = props.point,
|
|
getRootDomNode = props.getRootDomNode,
|
|
getClassNameFromAlign = props.getClassNameFromAlign,
|
|
onAlign = props.onAlign,
|
|
onMouseEnter = props.onMouseEnter,
|
|
onMouseLeave = props.onMouseLeave,
|
|
onMouseDown = props.onMouseDown,
|
|
onTouchStart = props.onTouchStart;
|
|
var alignRef = (0, React.useRef)();
|
|
var elementRef = (0, React.useRef)();
|
|
|
|
var _useState = (0, React.useState)(),
|
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
alignedClassName = _useState2[0],
|
|
setAlignedClassName = _useState2[1]; // ======================= Measure ========================
|
|
|
|
|
|
var _useStretchStyle = (0, _useStretchStyle3.default)(stretch),
|
|
_useStretchStyle2 = (0, _slicedToArray2.default)(_useStretchStyle, 2),
|
|
stretchStyle = _useStretchStyle2[0],
|
|
measureStretchStyle = _useStretchStyle2[1];
|
|
|
|
function doMeasure() {
|
|
if (stretch) {
|
|
measureStretchStyle(getRootDomNode());
|
|
}
|
|
} // ======================== Status ========================
|
|
|
|
|
|
var _useVisibleStatus = (0, _useVisibleStatus3.default)(visible, doMeasure),
|
|
_useVisibleStatus2 = (0, _slicedToArray2.default)(_useVisibleStatus, 2),
|
|
status = _useVisibleStatus2[0],
|
|
goNextStatus = _useVisibleStatus2[1]; // ======================== Aligns ========================
|
|
|
|
|
|
var prepareResolveRef = (0, React.useRef)(); // `target` on `rc-align` can accept as a function to get the bind element or a point.
|
|
// ref: https://www.npmjs.com/package/rc-align
|
|
|
|
function getAlignTarget() {
|
|
if (point) {
|
|
return point;
|
|
}
|
|
|
|
return getRootDomNode;
|
|
}
|
|
|
|
function forceAlign() {
|
|
var _alignRef$current;
|
|
|
|
(_alignRef$current = alignRef.current) === null || _alignRef$current === void 0 ? void 0 : _alignRef$current.forceAlign();
|
|
}
|
|
|
|
function onInternalAlign(popupDomNode, matchAlign) {
|
|
var nextAlignedClassName = getClassNameFromAlign(matchAlign);
|
|
|
|
if (alignedClassName !== nextAlignedClassName) {
|
|
setAlignedClassName(nextAlignedClassName);
|
|
}
|
|
|
|
if (status === 'align') {
|
|
// Repeat until not more align needed
|
|
if (alignedClassName !== nextAlignedClassName) {
|
|
Promise.resolve().then(function () {
|
|
forceAlign();
|
|
});
|
|
} else {
|
|
goNextStatus(function () {
|
|
var _prepareResolveRef$cu;
|
|
|
|
(_prepareResolveRef$cu = prepareResolveRef.current) === null || _prepareResolveRef$cu === void 0 ? void 0 : _prepareResolveRef$cu.call(prepareResolveRef);
|
|
});
|
|
}
|
|
|
|
onAlign === null || onAlign === void 0 ? void 0 : onAlign(popupDomNode, matchAlign);
|
|
}
|
|
} // ======================== Motion ========================
|
|
|
|
|
|
var motion = (0, _objectSpread2.default)({}, (0, _legacyUtil.getMotion)(props));
|
|
['onAppearEnd', 'onEnterEnd', 'onLeaveEnd'].forEach(function (eventName) {
|
|
var originHandler = motion[eventName];
|
|
|
|
motion[eventName] = function (element, event) {
|
|
goNextStatus();
|
|
return originHandler === null || originHandler === void 0 ? void 0 : originHandler(element, event);
|
|
};
|
|
});
|
|
|
|
function onShowPrepare() {
|
|
return new Promise(function (resolve) {
|
|
prepareResolveRef.current = resolve;
|
|
});
|
|
} // Go to stable directly when motion not provided
|
|
|
|
|
|
React.useEffect(function () {
|
|
if (!motion.motionName && status === 'motion') {
|
|
goNextStatus();
|
|
}
|
|
}, [motion.motionName, status]); // ========================= Refs =========================
|
|
|
|
React.useImperativeHandle(ref, function () {
|
|
return {
|
|
forceAlign: forceAlign,
|
|
getElement: function getElement() {
|
|
return elementRef.current;
|
|
}
|
|
};
|
|
}); // ======================== Render ========================
|
|
|
|
var mergedStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, stretchStyle), {}, {
|
|
zIndex: zIndex,
|
|
opacity: status === 'motion' || status === 'stable' || !visible ? undefined : 0,
|
|
pointerEvents: status === 'stable' ? undefined : 'none'
|
|
}, style); // Align status
|
|
|
|
var alignDisabled = true;
|
|
|
|
if ((align === null || align === void 0 ? void 0 : align.points) && (status === 'align' || status === 'stable')) {
|
|
alignDisabled = false;
|
|
}
|
|
|
|
var childNode = children; // Wrapper when multiple children
|
|
|
|
if (React.Children.count(children) > 1) {
|
|
childNode = /*#__PURE__*/React.createElement("div", {
|
|
className: "".concat(prefixCls, "-content")
|
|
}, children);
|
|
}
|
|
|
|
return /*#__PURE__*/React.createElement(_rcMotion.default, (0, _extends2.default)({
|
|
visible: visible,
|
|
ref: elementRef,
|
|
leavedClassName: "".concat(prefixCls, "-hidden")
|
|
}, motion, {
|
|
onAppearPrepare: onShowPrepare,
|
|
onEnterPrepare: onShowPrepare,
|
|
removeOnLeave: destroyPopupOnHide,
|
|
forceRender: forceRender
|
|
}), function (_ref, motionRef) {
|
|
var motionClassName = _ref.className,
|
|
motionStyle = _ref.style;
|
|
var mergedClassName = (0, _classnames.default)(prefixCls, className, alignedClassName, motionClassName);
|
|
return /*#__PURE__*/React.createElement(_rcAlign.default, {
|
|
target: getAlignTarget(),
|
|
key: "popup",
|
|
ref: alignRef,
|
|
monitorWindowResize: true,
|
|
disabled: alignDisabled,
|
|
align: align,
|
|
onAlign: onInternalAlign
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
ref: motionRef,
|
|
className: mergedClassName,
|
|
onMouseEnter: onMouseEnter,
|
|
onMouseLeave: onMouseLeave,
|
|
onMouseDownCapture: onMouseDown,
|
|
onTouchStartCapture: onTouchStart,
|
|
style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, motionStyle), mergedStyle)
|
|
}, childNode));
|
|
});
|
|
});
|
|
PopupInner.displayName = 'PopupInner';
|
|
var _default = PopupInner;
|
|
exports.default = _default; |