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