133 lines
6.5 KiB
JavaScript
133 lines
6.5 KiB
JavaScript
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = MotionThumb;
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
var _rcMotion = _interopRequireDefault(require("rc-motion"));
|
|
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
|
|
var _ref2 = require("rc-util/lib/ref");
|
|
var React = _interopRequireWildcard(require("react"));
|
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
var calcThumbStyle = function calcThumbStyle(targetElement) {
|
|
return targetElement ? {
|
|
left: targetElement.offsetLeft,
|
|
right: targetElement.parentElement.clientWidth - targetElement.clientWidth - targetElement.offsetLeft,
|
|
width: targetElement.clientWidth
|
|
} : null;
|
|
};
|
|
var toPX = function toPX(value) {
|
|
return value !== undefined ? "".concat(value, "px") : undefined;
|
|
};
|
|
function MotionThumb(props) {
|
|
var prefixCls = props.prefixCls,
|
|
containerRef = props.containerRef,
|
|
value = props.value,
|
|
getValueIndex = props.getValueIndex,
|
|
motionName = props.motionName,
|
|
onMotionStart = props.onMotionStart,
|
|
onMotionEnd = props.onMotionEnd,
|
|
direction = props.direction;
|
|
var thumbRef = React.useRef(null);
|
|
var _React$useState = React.useState(value),
|
|
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
|
|
prevValue = _React$useState2[0],
|
|
setPrevValue = _React$useState2[1];
|
|
|
|
// =========================== Effect ===========================
|
|
var findValueElement = function findValueElement(val) {
|
|
var _containerRef$current;
|
|
var index = getValueIndex(val);
|
|
var ele = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.querySelectorAll(".".concat(prefixCls, "-item"))[index];
|
|
return (ele === null || ele === void 0 ? void 0 : ele.offsetParent) && ele;
|
|
};
|
|
var _React$useState3 = React.useState(null),
|
|
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
|
|
prevStyle = _React$useState4[0],
|
|
setPrevStyle = _React$useState4[1];
|
|
var _React$useState5 = React.useState(null),
|
|
_React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
|
|
nextStyle = _React$useState6[0],
|
|
setNextStyle = _React$useState6[1];
|
|
(0, _useLayoutEffect.default)(function () {
|
|
if (prevValue !== value) {
|
|
var prev = findValueElement(prevValue);
|
|
var next = findValueElement(value);
|
|
var calcPrevStyle = calcThumbStyle(prev);
|
|
var calcNextStyle = calcThumbStyle(next);
|
|
setPrevValue(value);
|
|
setPrevStyle(calcPrevStyle);
|
|
setNextStyle(calcNextStyle);
|
|
if (prev && next) {
|
|
onMotionStart();
|
|
} else {
|
|
onMotionEnd();
|
|
}
|
|
}
|
|
}, [value]);
|
|
var thumbStart = React.useMemo(function () {
|
|
return direction === 'rtl' ? toPX(-(prevStyle === null || prevStyle === void 0 ? void 0 : prevStyle.right)) : toPX(prevStyle === null || prevStyle === void 0 ? void 0 : prevStyle.left);
|
|
}, [direction, prevStyle]);
|
|
var thumbActive = React.useMemo(function () {
|
|
return direction === 'rtl' ? toPX(-(nextStyle === null || nextStyle === void 0 ? void 0 : nextStyle.right)) : toPX(nextStyle === null || nextStyle === void 0 ? void 0 : nextStyle.left);
|
|
}, [direction, nextStyle]);
|
|
|
|
// =========================== Motion ===========================
|
|
var onAppearStart = function onAppearStart() {
|
|
return {
|
|
transform: "translateX(var(--thumb-start-left))",
|
|
width: "var(--thumb-start-width)"
|
|
};
|
|
};
|
|
var onAppearActive = function onAppearActive() {
|
|
return {
|
|
transform: "translateX(var(--thumb-active-left))",
|
|
width: "var(--thumb-active-width)"
|
|
};
|
|
};
|
|
var onVisibleChanged = function onVisibleChanged() {
|
|
setPrevStyle(null);
|
|
setNextStyle(null);
|
|
onMotionEnd();
|
|
};
|
|
|
|
// =========================== Render ===========================
|
|
// No need motion when nothing exist in queue
|
|
if (!prevStyle || !nextStyle) {
|
|
return null;
|
|
}
|
|
return /*#__PURE__*/React.createElement(_rcMotion.default, {
|
|
visible: true,
|
|
motionName: motionName,
|
|
motionAppear: true,
|
|
onAppearStart: onAppearStart,
|
|
onAppearActive: onAppearActive,
|
|
onVisibleChanged: onVisibleChanged
|
|
}, function (_ref, ref) {
|
|
var motionClassName = _ref.className,
|
|
motionStyle = _ref.style;
|
|
var mergedStyle = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, motionStyle), {}, {
|
|
'--thumb-start-left': thumbStart,
|
|
'--thumb-start-width': toPX(prevStyle === null || prevStyle === void 0 ? void 0 : prevStyle.width),
|
|
'--thumb-active-left': thumbActive,
|
|
'--thumb-active-width': toPX(nextStyle === null || nextStyle === void 0 ? void 0 : nextStyle.width)
|
|
});
|
|
|
|
// It's little ugly which should be refactor when @umi/test update to latest jsdom
|
|
var motionProps = {
|
|
ref: (0, _ref2.composeRef)(thumbRef, ref),
|
|
style: mergedStyle,
|
|
className: (0, _classnames.default)("".concat(prefixCls, "-thumb"), motionClassName)
|
|
};
|
|
if (process.env.NODE_ENV === 'test') {
|
|
motionProps['data-test-style'] = JSON.stringify(mergedStyle);
|
|
}
|
|
return /*#__PURE__*/React.createElement("div", motionProps);
|
|
});
|
|
} |