import React, { ChangeEvent, useEffect, useState } from 'react'; interface MultiRangeFilterProps { min: number; max: number; selectedMin: number; selectedMax: number; valueFormatter: (value: number) => string; onChange: (min: number, max: number) => void; } const MultiRangeFilter: React.FC = ({ min, max, selectedMin, selectedMax, valueFormatter, onChange }) => { const [isDragging, setIsDragging] = useState(false); const [leftPercentage, setLeftPercentage] = useState(0); const [rightPercentage, setRightPercentage] = useState(0); const [minVal, setMinVal] = useState(min); const [maxVal, setMaxVal] = useState(max); const minGap = 5; useEffect(() => { setSliderTrack(); }, [minVal, maxVal]); const slideMin = (e: ChangeEvent) => { const value = parseInt(e.target.value, 10); if (value >= min && selectedMax - value >= minGap) { setMinVal(value); } }; const slideMax = (e: ChangeEvent) => { const value = parseInt(e.target.value, 10); if (value <= max && value - selectedMin >= minGap) { setMaxVal(value); } }; const setSliderTrack = () => { const range = document.querySelector('.slider-track'); if (range) { const minPercent = ((minVal - min) / (max - min)) * 100; const maxPercent = ((maxVal - min) / (max - min)) * 100; setLeftPercentage(minPercent); setRightPercentage(100 - maxPercent); } }; const startDrag = () => { setIsDragging(true); }; const stopDrag = () => { setIsDragging(false); onChange(minVal, maxVal); }; return (
{valueFormatter(min)}
{valueFormatter(max)}
{isDragging &&
{valueFormatter(minVal)}
} {isDragging &&
{valueFormatter(maxVal)}
}
); }; export default MultiRangeFilter;