import { ChangeEvent } from 'react'; import React, { FC, useCallback, useMemo, memo, } from '../../lib/teact/teact'; import buildClassName from '../../util/buildClassName'; import useLang from '../../hooks/useLang'; import './RangeSlider.scss'; type OwnProps = { options?: string[]; range?: { min: number; max: number; step?: number }; label?: string; value: number; disabled?: boolean; onChange: (value: number) => void; }; const RangeSlider: FC = ({ options, range, label, value, disabled, onChange, }) => { const lang = useLang(); const handleChange = useCallback((event: ChangeEvent) => { onChange(Number(event.currentTarget.value)); }, [onChange]); const className = buildClassName( 'RangeSlider', disabled && 'disabled', ); const trackWidth = useMemo(() => { if (options) { return (value / (options.length - 1)) * 100; } else if (range) { const possibleValuesLength = (range.max - range.min) / (range.step || 1); return ((value - range.min) / possibleValuesLength) * 100; } return 0; }, [value, options, range]); const [min, max, step] = useMemo(() => { if (options) { return [0, options.length - 1, 1]; } else if (range) { return [range.min, range.max, range.step || 1]; } return [0, 0, 0]; }, [range, options]); return (
{label && (
{label} {range && ( {value} )}
)}
{options && (
{options.map((option, index) => (
onChange(index)} > {option}
))}
)}
); }; export default memo(RangeSlider);