UNPKG

@nutui/nutui-react-taro

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

569 lines (568 loc) 24.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Range", { enumerable: true, get: function() { return Range; } }); var _interop_require_default = require("@swc/helpers/_/_interop_require_default"); var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard"); var _async_to_generator = require("@swc/helpers/_/_async_to_generator"); var _define_property = require("@swc/helpers/_/_define_property"); var _object_spread = require("@swc/helpers/_/_object_spread"); var _object_spread_props = require("@swc/helpers/_/_object_spread_props"); var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array"); var _ts_generator = require("@swc/helpers/_/_ts_generator"); var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react")); var _classnames = /*#__PURE__*/ _interop_require_default._(require("classnames")); var _components = require("@tarojs/components"); var _taro = require("@tarojs/taro"); var _pxtransform = require("../../utils/taro/px-transform"); var _usetouch = require("../../hooks/use-touch"); var _typings = require("../../utils/typings"); var _usepropsvalue = require("../../hooks/use-props-value"); var _getrect = require("../../utils/taro/get-rect"); var _index = require("../configprovider/index"); var _platform = require("../../utils/taro/platform"); var _mergeprops = require("../../utils/merge-props"); var defaultProps = (0, _object_spread_props._)((0, _object_spread._)({}, _typings.ComponentDefaults), { range: false, min: 0, max: 100, step: 1, vertical: false, marks: {} }); var isHm = (0, _platform.harmony)(); var classPrefix = 'nut-range'; var verticalClassPrefix = "".concat(classPrefix, "-vertical"); var isSameValue = function isSameValue(newValue, oldValue) { return JSON.stringify(newValue) === JSON.stringify(oldValue); }; var handleOverlap = function handleOverlap(value) { return value[0] > value[1] ? value.slice(0).reverse() : value; }; var Range = function Range(props) { var rtl = (0, _index.useRtl)(); var _mergeProps = (0, _mergeprops.mergeProps)(defaultProps, props), className = _mergeProps.className, style = _mergeProps.style, range = _mergeProps.range, disabled = _mergeProps.disabled, button = _mergeProps.button, vertical = _mergeProps.vertical, marks = _mergeProps.marks, minDescription = _mergeProps.minDescription, maxDescription = _mergeProps.maxDescription, currentDescription = _mergeProps.currentDescription, min = _mergeProps.min, max = _mergeProps.max, step = _mergeProps.step, value = _mergeProps.value, defaultValue = _mergeProps.defaultValue, onChange = _mergeProps.onChange, onStart = _mergeProps.onStart, onEnd = _mergeProps.onEnd; var rtlClassPrefix = (0, _react.useMemo)(function() { return "rtl-".concat(vertical ? verticalClassPrefix : classPrefix); }, [ vertical ]); var buttonRef = (0, _react.useRef)(0); var dragStatusRef = (0, _react.useRef)('start'); var touch = (0, _usetouch.useTouch)(); var root = (0, _react.useRef)(null); var rootRect = (0, _react.useRef)(null); var _useState = (0, _sliced_to_array._)((0, _react.useState)([]), 2), marksList = _useState[0], setMarksList = _useState[1]; var _useState1 = (0, _sliced_to_array._)((0, _react.useState)(0), 2), startValue = _useState1[0], setStartValue = _useState1[1]; var scope = (0, _react.useMemo)(function() { if (max < min || max === min) { console.log('max 的值需要大于 min的值'); } return max - min; }, [ max, min ]); var handleChange = function handleChange(value) { onChange && onChange(value); }; var _usePropsValue = (0, _sliced_to_array._)((0, _usepropsvalue.usePropsValue)({ value: value, defaultValue: defaultValue, finalValue: 0, onChange: handleChange }), 2), innerValue = _usePropsValue[0], setInnerValue = _usePropsValue[1]; var exactValueRef = (0, _react.useRef)(value || defaultValue || 0); var marksRef = (0, _react.useRef)({}); (0, _react.useEffect)(function() { if (marks) { if (Array.isArray(marks)) { var list = marks.sort(function(a, b) { return a.value - b.value; }).filter(function(point) { return point.value >= min && point.value <= max; }); setMarksList(list.map(function(mark) { return mark.value; })); list.forEach(function(mark) { marksRef.current[mark.value] = mark.label !== undefined ? mark.label : mark.value; }); } else { var marksKeys = Object.keys(marks); var list1 = marksKeys.map(parseFloat).sort(function(a, b) { return a - b; }).filter(function(point) { return point >= min && point <= max; }); setMarksList(list1); } } }, [ marks, max, min ]); var _obj; var classes = (0, _classnames.default)(classPrefix, (_obj = {}, (0, _define_property._)(_obj, "".concat(classPrefix, "-disabled"), disabled), (0, _define_property._)(_obj, verticalClassPrefix, vertical), (0, _define_property._)(_obj, "".concat(classPrefix, "-native"), isHm), _obj)); var _obj1; var containerClasses = (0, _classnames.default)("".concat(classPrefix, "-container"), (_obj1 = {}, (0, _define_property._)(_obj1, "".concat(classPrefix, "-container-native"), isHm), (0, _define_property._)(_obj1, "".concat(verticalClassPrefix, "-container"), vertical), _obj1), className); var markClassName = (0, _react.useCallback)(function(mark) { var classPrefix = 'nut-range-mark'; var verticalClassPrefix = 'nut-range-vertical-mark'; var lowerBound = min; var upperBound = max; if (range && Array.isArray(innerValue)) { lowerBound = innerValue[0]; upperBound = innerValue[1]; } else { upperBound = innerValue; } var isActive = mark <= upperBound && mark >= lowerBound; var _$classNames = [ "".concat(classPrefix, "-text-wrapper"), "".concat(isActive ? "".concat(classPrefix, "-text-wrapper-active") : '') ]; if (vertical) { _$classNames.push("".concat(verticalClassPrefix, "-text-wrapper")); isActive && _$classNames.push("".concat(verticalClassPrefix, "-text-wrapper-active")); } if (rtl) { _$classNames.push("".concat(rtlClassPrefix, "-mark-text-wrapper")); } return _$classNames.join(' '); }, [ min, max, range, innerValue, vertical, rtl, rtlClassPrefix ]); var isRange = (0, _react.useCallback)(function(val) { return !!range && Array.isArray(val); }, [ range ]); var calcMainAxis = (0, _react.useMemo)(function() { var modelVal = innerValue; return isRange(modelVal) ? "".concat((modelVal[1] - modelVal[0]) * 100 / scope, "%") : "".concat((modelVal - min) * 100 / scope, "%"); }, [ innerValue, isRange, min, scope ]); var calcOffset = (0, _react.useMemo)(function() { var modelVal = innerValue; return isRange(modelVal) ? "".concat((modelVal[0] - min) * 100 / scope, "%") : '0%'; }, [ innerValue, isRange, min, scope ]); var barStyle = (0, _react.useMemo)(function() { if (vertical) { return { height: calcMainAxis, top: calcOffset, transition: dragStatusRef.current ? 'none' : undefined }; } var dir = rtl ? 'right' : 'left'; var _obj; return _obj = { width: calcMainAxis }, (0, _define_property._)(_obj, dir, calcOffset), (0, _define_property._)(_obj, "transition", dragStatusRef.current ? 'none' : undefined), _obj; }, [ calcMainAxis, calcOffset, rtl, vertical ]); var marksStyle = (0, _react.useCallback)(function(mark) { var dir = rtl ? 'right' : 'left'; var style = (0, _define_property._)({}, dir, "".concat((mark - min) / scope * 100, "%")); if (vertical) { style = { top: "".concat((mark - min) / scope * 100, "%") }; } return style; }, [ min, rtl, scope, vertical ]); var tickClass = (0, _react.useCallback)(function(mark) { if (range && Array.isArray(innerValue)) { return mark <= innerValue[1] && mark >= innerValue[0]; } return mark <= innerValue; }, [ innerValue, range ]); var format = (0, _react.useCallback)(function(value) { value = Math.max(+min, Math.min(value, +max)); return Math.round(value / +step) * +step; }, [ max, min, step ]); var updateValue = (0, _react.useCallback)(function(value, end) { if (isRange(value)) { value = handleOverlap(value).map(format); } else { value = format(value); } if (!isSameValue(value, innerValue)) { setInnerValue(value); } end && onEnd && onEnd(value); }, [ innerValue, format, isRange, onEnd, setInnerValue ]); var handleClick = (0, _react.useCallback)(function(event) { return (0, _async_to_generator._)(function() { var _event_detail, rect, _event_detail_x, x, delta, total, _event_detail1, _event_detail_y, y, value, _innerValue, left, right, middle; return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: if (disabled || !root.current) return [ 2 ]; // TODO 鸿蒙获取clientX的数据有误,windowX 也变成了 undefined。暂不支持,待上游支持。 if (isHm) return [ 2 ]; dragStatusRef.current = ''; return [ 4, (0, _getrect.getRectInMultiPlatform)(root.current) ]; case 1: rect = _state.sent(); x = (_event_detail_x = (_event_detail = event.detail) === null || _event_detail === void 0 ? void 0 : _event_detail.x) !== null && _event_detail_x !== void 0 ? _event_detail_x : event.clientX; if (isHm) x = parseFloat((0, _pxtransform.pxTransform)(event.windowX || x)); delta = x - rect.left; total = rect.width; if (vertical) { ; ; y = (_event_detail_y = (_event_detail1 = event.detail) === null || _event_detail1 === void 0 ? void 0 : _event_detail1.y) !== null && _event_detail_y !== void 0 ? _event_detail_y : event.clientY; if (isHm) y = parseFloat((0, _pxtransform.pxTransform)(event.windowY || y)); delta = y - rect.top; total = rect.height; } value = min + delta / total * scope; exactValueRef.current = innerValue; if (isRange(innerValue)) { _innerValue = (0, _sliced_to_array._)(innerValue, 2), left = _innerValue[0], right = _innerValue[1]; middle = (left + right) / 2; if (value <= middle) { updateValue([ value, right ], true); } else { updateValue([ left, value ], true); } } else { updateValue(value, true); } return [ 2 ]; } }); })(); }, [ innerValue, disabled, isRange, min, scope, updateValue, vertical ]); (0, _taro.useReady)(function() { var getRootRect = function getRootRect() { return (0, _async_to_generator._)(function() { var rect; return (0, _ts_generator._)(this, function(_state) { switch(_state.label){ case 0: if (!root.current) return [ 3, 2 ]; return [ 4, (0, _getrect.getRectInMultiPlatform)(root.current) ]; case 1: rect = _state.sent(); rootRect.current = rect; _state.label = 2; case 2: return [ 2 ]; } }); })(); }; (0, _taro.nextTick)(function() { getRootRect(); }); }); var onTouchStart = (0, _react.useCallback)(function(event) { if (disabled) return; touch.start(event); exactValueRef.current = innerValue; if (isRange(innerValue)) { setStartValue(innerValue.map(format)); } else { setStartValue(format(innerValue)); } dragStatusRef.current = 'start'; }, [ innerValue, disabled, format, isRange, touch ]); var onTouchMove = (0, _react.useCallback)(function(event) { return (0, _async_to_generator._)(function() { var handleMove; return (0, _ts_generator._)(this, function(_state) { // @TODO RN、鸿蒙端垂直滑动时,页面会一同滑动,待解决 if (disabled || !root.current) return [ 2 ]; if (dragStatusRef.current === 'start') { onStart && onStart(); dragStatusRef.current = 'draging'; } touch.move(event); handleMove = function handleMove() { return (0, _async_to_generator._)(function() { var delta, total, diff, newValue; return (0, _ts_generator._)(this, function(_state) { if (!rootRect.current) return [ 2 ]; delta = isHm ? parseFloat((0, _pxtransform.pxTransform)(touch.deltaX.current)) : touch.deltaX.current; total = rootRect.current.width; diff = delta / total * scope; diff = rtl ? -diff : diff; if (vertical) { delta = isHm ? parseFloat((0, _pxtransform.pxTransform)(touch.deltaY.current)) : touch.deltaY.current; total = rootRect.current.height; diff = delta / total * scope; } newValue = startValue + diff; if (isRange(startValue)) { newValue = exactValueRef.current.slice(); newValue[buttonRef.current] = startValue[buttonRef.current] + diff; } exactValueRef.current = newValue; updateValue(newValue); return [ 2 ]; }); })(); }; requestAnimationFrame(handleMove); return [ 2 ]; }); })(); }, [ disabled, isRange, onStart, rtl, scope, startValue, touch, updateValue, vertical ]); var onTouchEnd = (0, _react.useCallback)(function() { if (disabled) return; if (dragStatusRef.current === 'draging') { updateValue(innerValue, true); } dragStatusRef.current = ''; }, [ innerValue, disabled, updateValue ]); var curValue = (0, _react.useCallback)(function(idx) { var modelVal = innerValue; var value = typeof idx === 'number' ? modelVal[idx] : modelVal; return value; }, [ innerValue ]); var buttonNumberTransform = (0, _react.useMemo)(function() { return vertical ? 'translate(100%, -50%)' : 'translate(-50%, -100%)'; }, [ vertical ]); var renderButton = (0, _react.useCallback)(function(index) { var _obj, _obj1; return /*#__PURE__*/ _react.default.createElement(_react.default.Fragment, null, button || /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)("".concat(classPrefix, "-button"), (_obj = {}, (0, _define_property._)(_obj, "".concat(verticalClassPrefix, "-button"), vertical), (0, _define_property._)(_obj, "".concat(rtlClassPrefix, "-button"), rtl), _obj)), style: { transform: 'translate(-50%, -50%)' } }, currentDescription !== null && /*#__PURE__*/ _react.default.createElement(_components.Text, { className: (0, _classnames.default)("".concat(classPrefix, "-button-number"), (_obj1 = {}, (0, _define_property._)(_obj1, "".concat(verticalClassPrefix, "-button-number"), vertical), (0, _define_property._)(_obj1, "".concat(rtlClassPrefix, "-button-number"), rtl), _obj1)), style: { transform: buttonNumberTransform } }, currentDescription ? currentDescription(curValue(index)) : curValue(index)))); }, [ button, buttonNumberTransform, curValue, currentDescription, rtl, rtlClassPrefix, vertical ]); var renderMarks = (0, _react.useCallback)(function() { if (marksList.length <= 0) return null; var _obj; var markcls = (0, _classnames.default)("".concat(classPrefix, "-mark"), (_obj = {}, (0, _define_property._)(_obj, "".concat(verticalClassPrefix, "-mark"), vertical), (0, _define_property._)(_obj, "".concat(rtlClassPrefix, "-mark"), rtl), (0, _define_property._)(_obj, "".concat(vertical ? verticalClassPrefix : classPrefix, "-mark-hm"), isHm), _obj)); var textcls = (0, _classnames.default)("".concat(classPrefix, "-mark-text"), (0, _define_property._)({}, "".concat(verticalClassPrefix, "-mark-text"), vertical)); return /*#__PURE__*/ _react.default.createElement(_components.View, { className: markcls }, marksList.map(function(mark) { var _obj; return /*#__PURE__*/ _react.default.createElement(_components.View, { key: mark, className: markClassName(mark), style: marksStyle(mark) }, /*#__PURE__*/ _react.default.createElement(_components.Text, { className: textcls }, Array.isArray(marks) ? marksRef.current[mark] : marks[mark]), /*#__PURE__*/ _react.default.createElement(_components.View, { className: (0, _classnames.default)("".concat(vertical ? verticalClassPrefix : classPrefix, "-tick"), (_obj = {}, (0, _define_property._)(_obj, "".concat(vertical ? verticalClassPrefix : classPrefix, "-tick-active"), tickClass(mark)), (0, _define_property._)(_obj, "".concat(rtlClassPrefix, "-tick"), rtl), _obj)) })); })); }, [ markClassName, marks, marksList, marksStyle, rtl, rtlClassPrefix, tickClass, vertical ]); var renderRangeButton = (0, _react.useCallback)(function() { return [ 0, 1 ].map(function(_, index) { var suffix = index === 0 ? 'left' : 'right'; var _obj; var cls = (0, _classnames.default)("".concat(classPrefix, "-button-wrapper-").concat(suffix), (_obj = {}, (0, _define_property._)(_obj, "".concat(verticalClassPrefix, "-button-wrapper-").concat(suffix), vertical), (0, _define_property._)(_obj, "".concat(rtlClassPrefix, "-button-wrapper-").concat(suffix), rtl), _obj)); return /*#__PURE__*/ _react.default.createElement(_components.View, { key: index, className: cls, style: { transform: 'translate(-50%, -50%)' }, onTouchStart: function onTouchStart1(e) { buttonRef.current = index; onTouchStart(e); }, onTouchMove: onTouchMove, onTouchEnd: onTouchEnd, onTouchCancel: onTouchEnd, onClick: function onClick(e) { return e.stopPropagation(); } }, renderButton(index)); }); }, [ onTouchEnd, onTouchMove, onTouchStart, renderButton, vertical, rtl, rtlClassPrefix ]); var renderSingleButton = (0, _react.useCallback)(function() { return /*#__PURE__*/ _react.default.createElement(_components.View, { catchMove: true, className: (0, _classnames.default)("".concat(classPrefix, "-button-wrapper"), (0, _define_property._)({}, "".concat(verticalClassPrefix, "-button-wrapper"), vertical)), style: { transform: 'translate(-50%, -50%)' }, onTouchStart: onTouchStart, onTouchMove: onTouchMove, onTouchEnd: onTouchEnd, onTouchCancel: onTouchEnd, onClick: function onClick(e) { return e.stopPropagation(); } }, renderButton()); }, [ onTouchEnd, onTouchMove, onTouchStart, renderButton, vertical ]); var renderButtonWrapper = (0, _react.useCallback)(function() { return /*#__PURE__*/ _react.default.createElement(_components.View, { className: "".concat(classPrefix, "-bar ").concat(isHm ? '' : "".concat(classPrefix, "-bar-animate"), "}"), style: barStyle }, range ? renderRangeButton() : renderSingleButton()); }, [ renderRangeButton, renderSingleButton, range, barStyle ]); return /*#__PURE__*/ _react.default.createElement(_components.View, { className: containerClasses, style: style }, minDescription !== null && /*#__PURE__*/ _react.default.createElement(_components.Text, { className: "".concat(classPrefix, "-min") }, minDescription || min), /*#__PURE__*/ _react.default.createElement(_components.View, { ref: root, className: classes, onClick: handleClick }, renderMarks(), renderButtonWrapper()), maxDescription !== null && /*#__PURE__*/ _react.default.createElement(_components.Text, { className: "".concat(classPrefix, "-max") }, maxDescription || max)); }; Range.displayName = 'NutRange';