UNPKG

@yandex/ui

Version:

Yandex UI components

86 lines (85 loc) 3.34 kB
import { __read } from "tslib"; import { useCallback, useState } from 'react'; import { Direction } from 'react-range'; /** * Возвращает позицию элемента Range. * * @param values - Текущее значение слайдера * @param min - Минимальное значение слайдера * @param max - Максимальное значение слайдера */ export function getRangePosition(values, min, max, reverse) { var positions = values.map(function (value) { return ((value - min) / (max - min)) * 100; }); // TODO: Необходим рефакторинг. if (values.length === 1) { if (reverse) { return { left: 100 - positions[positions.length - 1] + "%", right: '0%' }; } return { left: '0%', right: 100 - positions[positions.length - 1] + "%" }; } if (reverse) { return { left: 100 - positions[positions.length - 1] + "%", right: positions[0] + "%" }; } return { left: positions[0] + "%", right: 100 - positions[positions.length - 1] + "%" }; } /** * Возвращает список пометок на линии. * * @param min - Минимальное значение слайдера * @param max - Максимальное значение слайдера * @param step - Шаг смещения бегунка */ export function getTicks(min, max, step) { // Добавляем единицу чтобы учесть нулевую позицию. var ticksLength = (max - min) / step + 1; return Array.from({ length: ticksLength }).map(function (_, idx) { return min + step * idx; }); } /** * Нормализует значения в пределах диапазона. * * @param values - Текущее значение слайдера * @param min - Минимальное значение слайдера * @param max - Максимальное значение слайдера */ export function normalizeValue(values, min, max) { if (values.length === 0 || values.length > 2) { throw new RangeError('Свойство "value" должно принимать одно или два значения.'); } return values.map(function (value) { if (value > max) return max; if (value < min) return min; return value; }); } /** * Возвращает направление слайдера. * * @param vertical - Вертикальное положение слайдера * @param reverse - Обратное направление слайдера */ export function getDirection(vertical, reverse) { if (vertical && reverse) return Direction.Down; if (vertical && !reverse) return Direction.Up; if (!vertical && reverse) return Direction.Left; return Direction.Right; } /** * Реакт-хук состояния для компонента Slider. * * @experimental * * @example * * const state = useSliderState({ value: [10] }) * return <Slider {...state} /> */ export function useSliderState(options) { var _a = __read(useState(options.value), 2), value = _a[0], setValue = _a[1]; var onInput = useCallback(function (_, nextValue) { return setValue(nextValue); }, []); return { onInput: onInput, value: value }; }