UNPKG

@arco-design/web-react

Version:

Arco Design React UI Library.

128 lines (127 loc) 5.45 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 react_1 = require("react"); var is_1 = require("../../_util/is"); var utils_1 = require("../utils"); function getIntervals(nums) { if (nums.length < 2) { return []; } var result = []; for (var i = 1; i < nums.length; i++) { var begin = nums[i - 1]; var end = nums[i]; result.push([begin, end]); } return result; } function useInterval(props) { var _a = props.marks, marks = _a === void 0 ? {} : _a, getIntervalConfig = props.getIntervalConfig, max = props.max, min = props.min; var _b = (0, react_1.useMemo)(function () { var markKeys = Object.keys(marks) .filter(function (key) { return (0, is_1.isNumber)(+key) && +key >= min && +key <= max; }) .sort(function (a, b) { return (+a > +b ? 1 : -1); }); var markList = markKeys.map(function (key) { return ({ key: key, content: marks[key] }); }); var markValues = markKeys.map(function (key) { return +key; }); // 如果没有传入marks,那么就等于只有一个区间,就是 [min,max] if (markValues.length === 0) { markValues = [min, max]; } else { if (markValues[0] > min) { markValues.unshift(min); // 传入了 marks 需要显示首尾断点 markList.unshift({ key: "" + min, content: '' }); } if (markValues.slice(-1)[0] < max) { markValues.push(max); markList.push({ key: "" + max, content: '' }); } } var markIntervals = getIntervals(markValues); return { markIntervals: markIntervals, markList: markList }; }, [marks, min, max]), markIntervals = _b.markIntervals, markList = _b.markList; var intervalConfigs = (0, react_1.useMemo)(function () { if (!(0, is_1.isFunction)(getIntervalConfig)) { return [{ begin: min, end: max, step: props.step, beginOffset: 0, endOffset: 1, width: 1 }]; } var getStepAndWidth = function (_a, index) { var _b = __read(_a, 2), begin = _b[0], end = _b[1]; var config = { step: props.step, width: 0 }; var customConfig = getIntervalConfig([begin, end], index) || {}; var step = customConfig.step; var width = (0, utils_1.rateToFloat)(customConfig.width); // 如果用户传入了step if ((0, is_1.isNumber)(step) && step) { config.step = step; } // 用户传入了width if ((0, is_1.isNumber)(width) && width) { config.width = width; } return config; }; var remainWidth = 1; var remainLen = max - min; var stepAndWidthConfig = markIntervals.map(function (_a, index) { var _b = __read(_a, 2), begin = _b[0], end = _b[1]; var stepAndWidth = getStepAndWidth([begin, end], index); var width = stepAndWidth.width; // 主要是计算出剩余的 width 和 剩余的长度 if (width) { width = Math.min(remainWidth, width); var len = end - begin; remainLen -= len; remainWidth -= width; } return { width: width, step: stepAndWidth.step }; }); // 所有区间都有自定义宽度但仍有剩余的时候,最后一个区间的宽度需要校准 if (stepAndWidthConfig.every(function (_a) { var width = _a.width; return width; }) && remainWidth) { var lastIntervalConfig = stepAndWidthConfig[markIntervals.length - 1]; lastIntervalConfig.width += remainWidth; } var allConfigs = []; markIntervals.forEach(function (_a, index) { var _b = __read(_a, 2), begin = _b[0], end = _b[1]; var _c = stepAndWidthConfig[index], step = _c.step, width = _c.width; var config = { begin: begin, end: end, step: step, beginOffset: 0, endOffset: 0, width: width }; // 用户没有配置 width,按照区间长度来分配剩余的width if (!config.width) { config.width = remainWidth * ((end - begin) / remainLen); } var prevIndex = allConfigs.length - 1; // 当前区间的 beginOffset 是前一个区间的 endOffset if (allConfigs[prevIndex]) { config.beginOffset = allConfigs[prevIndex].endOffset; } config.endOffset = Math.min(1, config.beginOffset + config.width); allConfigs.push(config); }); return allConfigs; }, [getIntervalConfig, markIntervals, max, min, props.step]); return { intervalConfigs: intervalConfigs, markList: markList, }; } exports.default = useInterval;