UNPKG

zmp-ui

Version:

Zalo Mini App framework

249 lines (248 loc) 9.47 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = void 0; var _clsx = _interopRequireDefault(require("clsx")); var _react = _interopRequireWildcard(require("react")); var _text = _interopRequireDefault(require("../text")); var _clamp = require("../../utils/clamp"); var _getPosition = require("../../utils/get-position"); var _class = require("../../utils/class"); var _useMergedState2 = _interopRequireDefault(require("../../hooks/useMergedState")); var _Track = _interopRequireDefault(require("./Track")); var _getChangeValue = require("../../utils/get-change-value"); var _Thumb = _interopRequireDefault(require("./Thumb")); 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 && Object.prototype.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 = function Slider(props) { var rawValue = props.value, defaultValue = props.defaultValue, name = props.name, label = props.label, showValue = props.showValue, renderValue = props.renderValue, prefix = props.prefix, suffix = props.suffix, _props$min = props.min, min = _props$min === void 0 ? 0 : _props$min, _props$max = props.max, max = _props$max === void 0 ? 100 : _props$max, _props$step = props.step, step = _props$step === void 0 ? 1 : _props$step, _props$minRange = props.minRange, minRange = _props$minRange === void 0 ? 1 : _props$minRange, _props$marks = props.marks, marks = _props$marks === void 0 ? false : _props$marks, onChange = props.onChange; var prefixCls = (0, _class.getPrefixCls)("slider"); var _useMergedState = (0, _useMergedState2["default"])(defaultValue || 0, { value: rawValue }), value = _useMergedState[0], setValue = _useMergedState[1]; var valueRender = (0, _react.useMemo)(function () { if (!showValue) return null; if (renderValue) { return renderValue(value); } return Array.isArray(value) ? value.join(" - ") : value; }, [value, showValue, renderValue]); var _useMemo = (0, _react.useMemo)(function () { if (!Array.isArray(value)) { return { offset: 0, position: (0, _getPosition.getPosition)({ min: min, max: max, value: value || 0 }) }; } var start = (0, _getPosition.getPosition)({ min: min, max: max, value: value[0] }); var end = (0, _getPosition.getPosition)({ min: min, max: max, value: value[1] }); return { offset: start, position: end - start }; }, [value, min, max]), offset = _useMemo.offset, position = _useMemo.position; var markList = (0, _react.useMemo)(function () { if (!marks) return undefined; if (marks !== true) return marks.map(function (mark) { return (0, _getPosition.getPosition)({ min: min, max: max, value: mark }); }); var stepCount = (max - min) / step; var list = []; for (var i = 0; i <= stepCount; i += 1) { var markValue = min + i * step; var markPosition = (0, _getPosition.getPosition)({ min: min, max: max, value: markValue }); list.push(markPosition); } return list; }, [marks, min, max, step]); var isSliding = (0, _react.useRef)(false); var frame = (0, _react.useRef)(0); var trackRef = (0, _react.useRef)(null); var thumbIndex = (0, _react.useRef)(0); var handleChange = function handleChange(_ref) { var x = _ref.x; var nextValue = (0, _getChangeValue.getChangeValue)({ value: x, min: min, max: max, step: step }); if (!Array.isArray(value)) { setValue(nextValue); onChange == null || onChange(nextValue); } else { var start = value[0], end = value[1]; if (thumbIndex.current === 0) { var endValue = (0, _clamp.clamp)(end - nextValue < minRange ? nextValue + step : end, min, max); if (endValue - nextValue < minRange) return; var newValue = [nextValue, endValue]; setValue(newValue); onChange == null || onChange(newValue); } else { var startValue = (0, _clamp.clamp)(nextValue - start < minRange ? nextValue - step : start, min, max); if (nextValue - startValue < minRange) return; var cloneValue = [startValue, nextValue]; setValue(cloneValue); onChange == null || onChange(cloneValue); } } }; var handleMove = function handleMove(_ref2, checkNearest) { var x = _ref2.x; cancelAnimationFrame(frame.current); frame.current = requestAnimationFrame(function () { if (trackRef.current) { var rect = trackRef.current.getBoundingClientRect(); if (rect.width && rect.height) { var tempX = (0, _clamp.clamp)((x - rect.left) / rect.width, 0, 1); if (checkNearest) { if (Array.isArray(value)) { var start = value[0], end = value[1]; var middle = (start + end) / 2; var nextValue = (0, _getChangeValue.getChangeValue)({ value: tempX, min: min, max: max, step: step }); thumbIndex.current = nextValue < middle ? 0 : 1; } else { thumbIndex.current = 0; } } handleChange({ x: tempX }); } } }); }; var handleMouseDown = function handleMouseDown(event) { isSliding.current = true; handleMove({ x: event.clientX, y: event.clientY }, true); }; var handleMouseMove = function handleMouseMove(e) { if (isSliding.current) { handleMove({ x: e.clientX, y: e.clientY }); } }; var handleMouseUp = function handleMouseUp() { isSliding.current = false; }; var handleTouchStart = function handleTouchStart(event) { isSliding.current = true; handleMove({ x: event.touches[0].clientX, y: event.touches[0].clientY }, true); }; var handleTouchMove = function handleTouchMove(e) { if (e.cancelable) e.preventDefault(); isSliding.current = true; handleMove({ x: e.touches[0].clientX, y: e.touches[0].clientY }); }; var handleTouchEnd = function handleTouchEnd() { isSliding.current = false; }; return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _clsx["default"])(prefixCls + "-wrapper") }, (label || showValue) && /*#__PURE__*/_react["default"].createElement("div", { className: (0, _clsx["default"])(prefixCls + "-header") }, /*#__PURE__*/_react["default"].createElement(_text["default"], { className: (0, _clsx["default"])(prefixCls + "-label") }, label), /*#__PURE__*/_react["default"].createElement(_text["default"], { size: "small", bold: true, className: (0, _clsx["default"])(prefixCls + "-value") }, valueRender)), /*#__PURE__*/_react["default"].createElement("div", { className: (0, _clsx["default"])(prefixCls + "-content") }, prefix && /*#__PURE__*/_react["default"].createElement("div", { className: (0, _clsx["default"])(prefixCls + "-prefix") }, prefix), /*#__PURE__*/_react["default"].createElement("div", { role: "presentation", className: (0, _clsx["default"])(prefixCls + "-handler"), onMouseDown: handleMouseDown, onMouseMove: handleMouseMove, onMouseUp: handleMouseUp, onTouchStart: handleTouchStart, onTouchMove: handleTouchMove, onTouchEnd: handleTouchEnd }, /*#__PURE__*/_react["default"].createElement(_Track["default"], { ref: trackRef, width: position, offset: offset, marks: markList }, Array.isArray(value) && /*#__PURE__*/_react["default"].createElement(_Thumb["default"], { position: offset }), /*#__PURE__*/_react["default"].createElement(_Thumb["default"], { position: offset + position }))), suffix && /*#__PURE__*/_react["default"].createElement("div", { className: (0, _clsx["default"])(prefixCls + "-suffix") }, suffix)), Array.isArray(value) ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("input", { type: "hidden", name: name ? name + "_from" : undefined, value: value[0] }), /*#__PURE__*/_react["default"].createElement("input", { type: "hidden", name: name ? name + "_to" : undefined, value: value[1] })) : /*#__PURE__*/_react["default"].createElement("input", { type: "hidden", name: name, value: value })); }; var _default = exports["default"] = Slider;