import type { ChangeEvent } from 'react'; import type { FC } from '../../lib/teact/teact'; import { memo, useLayoutEffect, useMemo, useRef, } from '../../lib/teact/teact'; import buildClassName from '../../util/buildClassName'; import styles from './RangeSliderWithMarks.module.scss'; export type OwnProps = { marks: number[]; onChange: (value: number) => void; rangeCount: number; }; const RangeSliderWithMarks: FC = ({ marks, onChange, rangeCount }) => { const sliderRef = useRef(); const rangeCountIndex = useMemo(() => marks.indexOf(rangeCount), [marks, rangeCount]); const rangeValue = useMemo(() => { return marks.indexOf(rangeCount).toString(); }, [marks, rangeCount]); useLayoutEffect(() => { if (sliderRef.current) { const fillPercentage = (rangeCountIndex / (marks.length - 1)) * 100; const thumbOffset = fillPercentage / 2; sliderRef.current.style.setProperty('--fill-percentage', `${fillPercentage}%`); sliderRef.current.style.setProperty('--thumb-offset', `${thumbOffset}%`); } }, [rangeCountIndex, marks]); const handleChange = (event: ChangeEvent) => { const index = parseInt(event.target.value, 10); const newValue = marks[index]; onChange(newValue); }; return (
{marks.map((mark, index) => { const isFilled = index <= rangeCountIndex; return (
); })}
{marks.map((mark) => (
{mark}
))}
); }; export default memo(RangeSliderWithMarks);