import React, { useCallback, useEffect, useState, useRef } from "react"; import PropTypes from "prop-types"; import "./multiRangeSlider.css"; const MultiRangeSlider = ({ min, max }) => { const [minVal, setMinVal] = useState(min); const [maxVal, setMaxVal] = useState(max); const minValRef = useRef(min); const maxValRef = useRef(max); const range = useRef(null); // Convert to percentage const getPercent = useCallback( value => Math.round(((value - min) / (max - min)) * 100), [min, max] ); // Set width of the range to decrease from the left side useEffect(() => { const minPercent = getPercent(minVal); const maxPercent = getPercent(maxValRef.current); if (range.current) { range.current.style.left = `${minPercent}%`; range.current.style.width = `${maxPercent - minPercent}%`; } }, [minVal, getPercent]); // Set width of the range to decrease from the right side useEffect(() => { const minPercent = getPercent(minValRef.current); const maxPercent = getPercent(maxVal); if (range.current) { range.current.style.width = `${maxPercent - minPercent}%`; } }, [maxVal, getPercent]); return (
{ const value = Math.min(Number(event.target.value), maxVal - 1); setMinVal(value); minValRef.current = value; }} className="thumb thumb--left" style={{ zIndex: minVal > max - 100 && "5" }} /> { const value = Math.max(Number(event.target.value), minVal + 1); setMaxVal(value); maxValRef.current = value; }} className="thumb thumb--right" />
{minVal}
{maxVal}
); }; MultiRangeSlider.propTypes = { min: PropTypes.number.isRequired, max: PropTypes.number.isRequired }; export default MultiRangeSlider;