UNPKG

gui-one-nutui-react-taro

Version:

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

470 lines (469 loc) 16.9 kB
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _regeneratorRuntime from "@babel/runtime/regenerator"; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } import React__default, { useState, useRef, useEffect, useCallback } from 'react'; import { u as useTouch } from './useTouch-a2ea68c6.js'; import { g as getRectByTaro } from './useClientRect-bf69d7b3.js'; import { T as Toast } from './toast.taro-86862dff.js'; import { u as useConfig } from './configprovider.taro-6c7b3056.js'; var defaultProps = { range: false, hiddenRange: false, hiddenTag: false, min: 0, max: 100, step: 1, modelValue: 0, vertical: false, marks: {} }; var startValue; var currentValue; var Range = function Range(props) { var _useConfig = useConfig(), locale = _useConfig.locale; var _defaultProps$props = _objectSpread(_objectSpread({}, defaultProps), props), className = _defaultProps$props.className, range = _defaultProps$props.range, disabled = _defaultProps$props.disabled, activeColor = _defaultProps$props.activeColor, inactiveColor = _defaultProps$props.inactiveColor, buttonColor = _defaultProps$props.buttonColor, hiddenRange = _defaultProps$props.hiddenRange, hiddenTag = _defaultProps$props.hiddenTag, modelValue = _defaultProps$props.modelValue, button = _defaultProps$props.button, vertical = _defaultProps$props.vertical, marks = _defaultProps$props.marks, change = _defaultProps$props.change, dragStart = _defaultProps$props.dragStart, dragEnd = _defaultProps$props.dragEnd, onChange = _defaultProps$props.onChange, onDragStart = _defaultProps$props.onDragStart, onDragEnd = _defaultProps$props.onDragEnd; var _defaultProps$props2 = _objectSpread(_objectSpread({}, defaultProps), props), min = _defaultProps$props2.min, max = _defaultProps$props2.max, step = _defaultProps$props2.step; min = Number(min); max = Number(max); step = Number(step); var _useState = useState(0), _useState2 = _slicedToArray(_useState, 2), buttonIndex = _useState2[0], SetButtonIndex = _useState2[1]; var _useState3 = useState(), _useState4 = _slicedToArray(_useState3, 2), initValue = _useState4[0], SetInitValue = _useState4[1]; var _useState5 = useState('start'), _useState6 = _slicedToArray(_useState5, 2), dragStatus = _useState6[0], SetDragStatus = _useState6[1]; var touch = useTouch(); var root = useRef(null); var _useState7 = useState([]), _useState8 = _slicedToArray(_useState7, 2), marksList = _useState8[0], SetMarksList = _useState8[1]; var _useState9 = useState(false), _useState10 = _slicedToArray(_useState9, 2), show = _useState10[0], SetShow = _useState10[1]; var _useState11 = useState(''), _useState12 = _slicedToArray(_useState11, 2), toastMsg = _useState12[0], SetToastMsg = _useState12[1]; var toastShow = function toastShow(msg) { SetToastMsg(msg); SetShow(true); }; useEffect(function () { if (modelValue) { if (!range && (modelValue < min || modelValue > max)) { SetInitValue(0); // Toast.text(`${modelValue} ${locale.range.rangeText}`) toastShow("".concat(modelValue, " ").concat(locale.range.rangeText)); return; } SetInitValue(modelValue); } }, [modelValue]); useEffect(function () { if (marks) { var marksKeys = Object.keys(marks); var list = marksKeys.map(parseFloat).sort(function (a, b) { return a - b; }).filter(function (point) { return point >= min && point <= max; }); SetMarksList(list); } }, [marks]); var scope = function scope() { return Number(max) - Number(min); }; var classes = useCallback(function () { var prefixCls = 'nut-range'; return [prefixCls, "".concat(disabled ? "".concat(prefixCls, "-disabled") : ''), "".concat(vertical ? "".concat(prefixCls, "-vertical") : ''), "".concat(!hiddenRange ? "".concat(prefixCls, "-show-number") : '')].filter(Boolean).join(' '); }, [disabled, vertical, hiddenRange]); var containerClasses = useCallback(function () { var prefixCls = 'nut-range-container'; return [prefixCls, "".concat(vertical ? "".concat(prefixCls, "-vertical") : ''), className].filter(Boolean).join(' '); }, [vertical, className]); var markClassName = useCallback(function (mark) { var classPrefix = 'nut-range-mark'; var lowerBound = Number(min); var upperBound = Number(max); if (range) { var _modelValue = _slicedToArray(modelValue, 2), left = _modelValue[0], right = _modelValue[1]; lowerBound = left; upperBound = right; } else { upperBound = modelValue; } var isActive = mark <= upperBound && mark >= lowerBound; return ["".concat(classPrefix, "-text"), "".concat(isActive ? "".concat(classPrefix, "-text-active") : '')].filter(Boolean).join(' '); }, [range, modelValue, min, max]); var _useState13 = useState(classes()), _useState14 = _slicedToArray(_useState13, 2), rangeName = _useState14[0], setRangeName = _useState14[1]; var _useState15 = useState(containerClasses()), _useState16 = _slicedToArray(_useState15, 2), containerName = _useState16[0], setContainerName = _useState16[1]; useEffect(function () { setRangeName(classes()); setContainerName(containerClasses()); }, [classes, containerClasses]); var wrapperStyle = function wrapperStyle() { return { background: inactiveColor }; }; var buttonStyle = function buttonStyle() { return { borderColor: buttonColor }; }; var isRange = function isRange(val) { return !!range && Array.isArray(val); }; var calcMainAxis = function calcMainAxis() { var modelVal = initValue || initValue === 0 ? initValue : modelValue; if (isRange(modelVal)) { return "".concat((modelVal[1] - modelVal[0]) * 100 / scope(), "%"); } return "".concat((modelVal - Number(min)) * 100 / scope(), "%"); }; var calcOffset = function calcOffset() { var modelVal = initValue || initValue === 0 ? initValue : modelValue; if (isRange(modelVal)) { return "".concat((modelVal[0] - Number(min)) * 100 / scope(), "%"); } return "0%"; }; var barStyle = function barStyle() { if (vertical) { return { height: calcMainAxis(), top: calcOffset(), background: activeColor, transition: dragStatus ? 'none' : undefined }; } return { width: calcMainAxis(), left: calcOffset(), background: activeColor, transition: dragStatus ? 'none' : undefined }; }; var marksStyle = function marksStyle(mark) { var style = { left: "".concat((mark - Number(min)) / scope() * 100, "%") }; if (vertical) { style = { top: "".concat((mark - Number(min)) / scope() * 100, "%") }; } return style; }; var tickStyle = function tickStyle(mark) { var lowerBound = Number(min); var upperBound = Number(max); if (range) { var _modelValue2 = _slicedToArray(modelValue, 2), left = _modelValue2[0], right = _modelValue2[1]; lowerBound = left; upperBound = right; } var isActive = mark <= upperBound && mark >= lowerBound; var style = { background: !isActive ? inactiveColor : activeColor }; return style; }; var format = function format(value) { value = Math.max(+min, Math.min(value, +max)); return Math.round(value / +step) * +step; }; var isSameValue = function isSameValue(newValue, oldValue) { return JSON.stringify(newValue) === JSON.stringify(oldValue); }; var handleOverlap = function handleOverlap(value) { if (value[0] > value[1]) { return value.slice(0).reverse(); } return value; }; var updateValue = function updateValue(value, end) { if (isRange(value)) { value = handleOverlap(value).map(format); } else { value = format(value); } var modelVal = initValue || initValue === 0 ? initValue : modelValue; if (!isSameValue(value, modelVal)) { SetInitValue(value); } if ((marks || end) && !isSameValue(value, startValue)) { change && change(value); onChange && onChange(value); } }; var click = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(event) { var rect, delta, total, value, _currentValue, _currentValue2, left, right, middle; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(disabled || !root.current)) { _context.next = 2; break; } return _context.abrupt("return"); case 2: SetDragStatus(''); _context.next = 5; return getRectByTaro(root.current); case 5: rect = _context.sent; delta = event.detail.x - rect.left; total = rect.width; if (vertical) { delta = event.detail.y - rect.top; total = rect.height; } value = Number(min) + delta / total * scope(); currentValue = initValue || initValue === 0 ? initValue : modelValue; if (isRange(currentValue)) { _currentValue = currentValue, _currentValue2 = _slicedToArray(_currentValue, 2), left = _currentValue2[0], right = _currentValue2[1]; middle = (left + right) / 2; if (value <= middle) { updateValue([value, right], true); } else { updateValue([left, value], true); } } else { updateValue(value, true); } case 12: case "end": return _context.stop(); } } }, _callee); })); return function click(_x) { return _ref.apply(this, arguments); }; }(); var _onTouchStart = function onTouchStart(event) { if (disabled) { return; } touch.start(event); currentValue = initValue || initValue === 0 ? initValue : modelValue; if (isRange(currentValue)) { startValue = currentValue.map(format); } else { startValue = format(currentValue); } SetDragStatus('start'); }; var _onTouchMove = /*#__PURE__*/function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(event) { var rect, delta, total, diff; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!(disabled || !root.current)) { _context2.next = 2; break; } return _context2.abrupt("return"); case 2: if (dragStatus === 'start') { dragStart && dragStart(); onDragStart && onDragStart(); } touch.move(event); SetDragStatus('draging'); _context2.next = 7; return getRectByTaro(root.current); case 7: rect = _context2.sent; delta = touch.deltaX; total = rect.width; diff = delta / total * scope(); if (vertical) { delta = touch.deltaY; total = rect.height; diff = delta / total * scope(); } if (isRange(startValue)) { currentValue[buttonIndex] = startValue[buttonIndex] + diff; } else { currentValue = startValue + diff; } updateValue(currentValue); case 14: case "end": return _context2.stop(); } } }, _callee2); })); return function onTouchMove(_x2) { return _ref2.apply(this, arguments); }; }(); var _onTouchEnd = function onTouchEnd(event) { if (disabled) { return; } if (dragStatus === 'draging') { updateValue(currentValue, true); dragEnd && dragEnd(); onDragEnd && onDragEnd(); } SetDragStatus(''); }; var curValue = function curValue(idx) { var modelVal = initValue || initValue === 0 ? initValue : modelValue; var value = typeof idx === 'number' ? modelVal[idx] : modelVal; return value; }; return React__default.createElement("div", { className: "".concat(containerName) }, !hiddenRange ? React__default.createElement("div", { className: "min" }, +min) : null, React__default.createElement("div", { ref: root, style: wrapperStyle(), className: "".concat(rangeName), onClick: function onClick(e) { click(e); } }, marksList.length > 0 ? React__default.createElement("div", { className: "nut-range-mark" }, marksList.map(function (marks) { return React__default.createElement("span", { key: marks, className: markClassName(marks), style: marksStyle(marks) }, marks, React__default.createElement("span", { className: "nut-range-tick", style: tickStyle(marks) })); })) : null, React__default.createElement("div", { className: "nut-range-bar", style: barStyle() }, range ? [0, 1].map(function (item, index) { return React__default.createElement("div", { role: "slider", key: index, className: "".concat(index === 0 ? 'nut-range-button-wrapper-left' : '', "\n ").concat(index === 1 ? 'nut-range-button-wrapper-right' : ''), tabIndex: disabled ? -1 : 0, "aria-valuemin": +min, "aria-valuenow": curValue(index), "aria-valuemax": +max, "aria-orientation": "horizontal", onTouchStart: function onTouchStart(e) { if (typeof index === 'number') { // 实时更新当前拖动的按钮索引 SetButtonIndex(index); } _onTouchStart(e); }, onTouchMove: function onTouchMove(e) { _onTouchMove(e); }, onTouchEnd: function onTouchEnd(e) { _onTouchEnd(); }, onTouchCancel: function onTouchCancel(e) { _onTouchEnd(); }, onClick: function onClick(e) { e.stopPropagation(); } }, button || React__default.createElement("div", { className: "nut-range-button", style: buttonStyle() }, !hiddenTag ? React__default.createElement("div", { className: "number" }, curValue(index)) : null)); }) : React__default.createElement("div", { role: "slider", className: "nut-range-button-wrapper", tabIndex: disabled ? -1 : 0, "aria-valuemin": +min, "aria-valuenow": curValue(), "aria-valuemax": +max, "aria-orientation": "horizontal", onTouchStart: function onTouchStart(e) { _onTouchStart(e); }, onTouchMove: function onTouchMove(e) { _onTouchMove(e); }, onTouchEnd: function onTouchEnd(e) { _onTouchEnd(); }, onTouchCancel: function onTouchCancel(e) { _onTouchEnd(); }, onClick: function onClick(e) { e.stopPropagation(); } }, button || React__default.createElement("div", { className: "nut-range-button", style: buttonStyle() }, !hiddenTag ? React__default.createElement("div", { className: "number" }, curValue()) : null)))), !hiddenRange ? React__default.createElement("div", { className: "max" }, +max) : null, React__default.createElement(Toast, { type: "text", visible: show, msg: toastMsg, onClose: function onClose() { SetShow(false); } })); }; Range.defaultProps = defaultProps; Range.displayName = 'NutRange'; export { Range as R };