UNPKG

@bee-design/ui

Version:

Bee Design React UI Library.

106 lines (105 loc) 4.56 kB
"use strict"; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); var number_precision_1 = require("number-precision"); var react_1 = require("react"); var is_1 = require("../../_util/is"); var utils_1 = require("../utils"); function useLegalValue(props) { var isRange = props.isRange, min = props.min, max = props.max, onlyMarkValue = props.onlyMarkValue, intervalConfigs = props.intervalConfigs, marks = props.marks; var getPrecisionValue = (0, react_1.useCallback)(function (val) { var _a = intervalConfigs.find(function (config) { return val >= config.begin && val <= config.end; }), begin = _a.begin, step = _a.step; var offsetVal = val - begin; var stepNum = Math.round(offsetVal / step); var precision = (0, utils_1.getPrecision)(step); var currentIntervalPrecision = parseFloat((0, number_precision_1.times)(step, stepNum).toFixed(precision)); return (0, number_precision_1.plus)(begin, currentIntervalPrecision); }, [intervalConfigs]); // 在只允许选择 marks 中的值的时候,找到离value最接近的值 var getMarkValue = (0, react_1.useCallback)(function (val) { if (!(0, is_1.isObject)(marks) || (0, is_1.isEmptyObject)(marks)) { console.warn('marks must be an object when onlyMarkValue is true'); return min; } if (marks[val]) { return val; } var keys = Object.keys(marks); var diffs = keys.map(function (x) { return Math.abs(val - parseFloat(x)); }); var minIndex = diffs.indexOf(Math.min.apply(null, diffs)); return parseFloat(keys[minIndex]); }, [marks, min]); // 判断值是否在[min, max]区间内,并且满足步长或是标签值 var getLegalValue = (0, react_1.useCallback)(function (val) { if ((0, is_1.isUndefined)(val)) return min; if (val <= min) return min; if (val >= max) return max; if (onlyMarkValue) return getMarkValue(val); return getPrecisionValue(val); }, [getMarkValue, getPrecisionValue, max, min, onlyMarkValue]); var isLegalValue = (0, react_1.useCallback)(function (val) { return getLegalValue(val) === val; }, [getLegalValue]); // 获取合法的 range value var getLegalRangeValue = (0, react_1.useCallback)(function (val) { var _a = __read([min, min], 2), beginVal = _a[0], endVal = _a[1]; if (isRange) { if ((0, is_1.isArray)(val)) { beginVal = getLegalValue(val[0]); endVal = getLegalValue(val[1]); } else { console.error('value must be an array when range is true'); } } else if ((0, is_1.isNumber)(val)) { endVal = getLegalValue(val); } else { console.error('value must be a number when range is false'); } return [beginVal, endVal]; }, [getLegalValue, isRange, min]); var getNextMarkValue = (0, react_1.useCallback)(function (value, type) { // arrow Left or arrowRight var multi = type === 'subtraction' ? -1 : 1; var newValue = (0, number_precision_1.plus)(value, multi * props.step); if (props.onlyMarkValue) { var markKeys = Object.keys(props.marks); var currentIndex = markKeys.findIndex(function (key) { return Number(key) === value; }); newValue = markKeys[currentIndex + multi] !== undefined ? Number(markKeys[currentIndex + multi]) : value; } return newValue; }, [props.marks, props.onlyMarkValue, props.step]); return { getLegalRangeValue: getLegalRangeValue, getLegalValue: getLegalValue, isLegalValue: isLegalValue, getNextMarkValue: getNextMarkValue, }; } exports.default = useLegalValue;