UNPKG

zarm

Version:

基于 React 的移动端UI库

247 lines (204 loc) 8.94 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _bem = require("@zarm-design/bem"); var _react2 = require("@use-gesture/react"); var _isPlainObject = _interopRequireDefault(require("lodash/isPlainObject")); var _events = _interopRequireDefault(require("../utils/events")); var _tooltip = _interopRequireDefault(require("../tooltip")); var _ensureValuePrecision = _interopRequireDefault(require("./utils/ensureValuePrecision")); var _getValue = _interopRequireDefault(require("./utils/getValue")); var _configProvider = require("../config-provider"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) { if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } } return n.default = e, t && t.set(e, n), n; } var Slider = /*#__PURE__*/_react.default.forwardRef(function (props, ref) { var _React$useContext = _react.default.useContext(_configProvider.ConfigContext), prefixCls = _React$useContext.prefixCls; var bem = (0, _bem.createBEM)('slider', { prefixCls: prefixCls }); var className = props.className, disabled = props.disabled, min = props.min, max = props.max, vertical = props.vertical, showMark = props.showMark, value = props.value, marks = props.marks, onChange = props.onChange, onSlideChange = props.onSlideChange, defaultValue = props.defaultValue, style = props.style; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), tooltip = _useState2[0], setTooltip = _useState2[1]; var _React$useState = _react.default.useState((0, _getValue.default)(props, 0)), _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2), currentValue = _React$useState2[0], setCurrentValue = _React$useState2[1]; var lineRef = _react.default.useRef(null); var getMaxOffset = function getMaxOffset() { var _lineRef$current; var divRect = lineRef === null || lineRef === void 0 ? void 0 : (_lineRef$current = lineRef.current) === null || _lineRef$current === void 0 ? void 0 : _lineRef$current.getBoundingClientRect(); return (vertical ? divRect === null || divRect === void 0 ? void 0 : divRect.height : divRect === null || divRect === void 0 ? void 0 : divRect.width) || 0; }; var getOffsetByValue = function getOffsetByValue(val) { var maxOffset = getMaxOffset(); var range = max - min; return vertical ? maxOffset * ((max - val) / range) : maxOffset * ((val - min) / range); }; var getValueByOffset = function getValueByOffset(offset) { var maxOffset = getMaxOffset(); var percent = offset / maxOffset; var val = vertical ? (1 - percent) * (max - min) + min : Math.round(min + (max - min) * percent); return (0, _ensureValuePrecision.default)(val, props); }; var offsetStart = (0, _react.useRef)(0); (0, _react.useEffect)(function () { var val = (0, _getValue.default)({ defaultValue: defaultValue, value: value }, 0); setCurrentValue(val); }, [defaultValue, value]); var trackClick = (0, _react.useCallback)(function (event) { event.stopPropagation(); if (disabled) return; var line = lineRef.current; if (!line) return; var _line$getBoundingClie = line.getBoundingClientRect(), left = _line$getBoundingClie.left, top = _line$getBoundingClie.top; var offset = vertical ? event.clientY - top : event.clientX - left; var current = getValueByOffset(offset); current = Math.min(max, Math.max(min, current)); setCurrentValue(current); if (typeof onChange === 'function') { onChange(current); } }, [onChange, max, min]); var bind = (0, _react2.useDrag)(function (state) { var offsetX = state.xy[0] - state.initial[0], offsetY = state.xy[1] - state.initial[1]; state.event.stopPropagation(); if (state.first) { offsetStart.current = getOffsetByValue(currentValue); setTooltip(true); } var offset = vertical ? offsetY : offsetX; offset += offsetStart.current; var maxOffset = getMaxOffset(); offset = Math.min(maxOffset, Math.max(offset, 0)); var current = getValueByOffset(offset); setCurrentValue(current); if (state.dragging && !state.first) { onSlideChange === null || onSlideChange === void 0 ? void 0 : onSlideChange(current); } if (state.last) { setTooltip(false); onChange === null || onChange === void 0 ? void 0 : onChange(currentValue); } }, { enabled: !props.disabled, axis: vertical ? 'y' : 'x', pointer: { touch: true }, preventDefault: !_events.default.supportsPassiveEvents }); var renderMark = function renderMark() { var isEmptyMarks = !(0, _isPlainObject.default)(marks) || JSON.stringify(marks) === '{}'; if (showMark && isEmptyMarks) { console.error('请输入有效的 marks'); return null; } // 判断是否为空对象 if (isEmptyMarks) { return null; } var markKeys = Object.keys(marks || {}); var lineDot = markKeys.map(function (item) { var dotStyle = bem('dot', [{ active: currentValue >= +item }]); var markStyle = (0, _defineProperty2.default)({}, "".concat(vertical ? 'bottom' : 'left'), "".concat(item, "%")); return /*#__PURE__*/_react.default.createElement("span", { key: item, className: dotStyle, style: markStyle }); }); if (!showMark) { return lineDot; } var marksElement = markKeys.map(function (item) { var markStyle = (0, _defineProperty2.default)({}, "".concat(vertical ? 'bottom' : 'left'), "".concat(item, "%")); return /*#__PURE__*/_react.default.createElement("span", { key: item, className: bem('mark'), style: markStyle }, marks === null || marks === void 0 ? void 0 : marks[+item]); }); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, lineDot, /*#__PURE__*/_react.default.createElement("div", { className: bem('marks') }, marksElement)); }; var cls = bem([{ disabled: disabled, vertical: vertical, marked: showMark }, className]); var ratio = (currentValue - min) / (max - min); var offset = "".concat(ratio * 100, "%"); var knobStyle = (0, _defineProperty2.default)({}, "".concat(vertical ? 'bottom' : 'left'), offset || 0); var lineBg = (0, _defineProperty2.default)({}, "".concat(vertical ? 'height' : 'width'), offset || 0); return /*#__PURE__*/_react.default.createElement("div", { className: cls, ref: ref, style: style }, /*#__PURE__*/_react.default.createElement("div", { className: bem('content') }, /*#__PURE__*/_react.default.createElement("div", { className: bem('line'), ref: lineRef, onClick: trackClick }, /*#__PURE__*/_react.default.createElement("div", { className: bem('line__bg'), style: lineBg }), renderMark()), /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({ className: bem('knob'), role: "slider", "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": value, "aria-orientation": vertical ? 'vertical' : 'horizontal', style: knobStyle }, bind()), /*#__PURE__*/_react.default.createElement(_tooltip.default, { trigger: "manual", arrowPointAtCenter: true, visible: tooltip, content: currentValue }, /*#__PURE__*/_react.default.createElement("div", { className: bem('knob__shadow') }))))); }); Slider.displayName = 'Slider'; Slider.defaultProps = { disabled: false, showMark: false, vertical: false, step: 1, min: 0, max: 100, marks: {} }; var _default = Slider; exports.default = _default;