From 5541ced2f739b50f756aca6c45f18ce863c3c180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Feij=C3=B3?= Date: Sat, 23 Jul 2022 00:05:12 -0300 Subject: [PATCH] Refactors slider input range values calculation --- packages/ui/src/atoms/Slider/Slider.tsx | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/atoms/Slider/Slider.tsx b/packages/ui/src/atoms/Slider/Slider.tsx index 7dd74a5992..4039c005ae 100644 --- a/packages/ui/src/atoms/Slider/Slider.tsx +++ b/packages/ui/src/atoms/Slider/Slider.tsx @@ -82,6 +82,10 @@ const Slider = forwardRef( }, ref ) { + const widthPercent = useMemo( + () => (max.absolute - min.absolute) / 100, + [max.absolute, min.absolute] + ) const [minPercent, setMinPercent] = useState(() => percent(min.selected, min.absolute, max.absolute) ) @@ -90,21 +94,27 @@ const Slider = forwardRef( percent(max.selected, min.absolute, max.absolute) ) - const { minVal, maxVal } = useMemo(() => { - const widthPercent = (max.absolute - min.absolute) / 100 - - return { - minVal: Math.round(min.absolute + minPercent * widthPercent), - maxVal: Math.round(min.absolute + maxPercent * widthPercent), - } - }, [min, max, maxPercent, minPercent]) + const [minVal, setMinVal] = useState(() => + Math.round(min.absolute + minPercent * widthPercent) + ) + const [maxVal, setMaxVal] = useState(() => + Math.round(min.absolute + maxPercent * widthPercent) + ) useImperativeHandle(ref, () => ({ setSliderValues: (values: { min: number; max: number }) => { const sliderMinValue = Math.min(Number(values.min), maxVal) - const sliderMaxValue = Math.max(Number(values.max), minVal) - + setMinVal(sliderMinValue) setMinPercent(percent(sliderMinValue, min.absolute, max.absolute)) + + if (values.max > max.absolute) { + setMaxVal(max.absolute) + setMaxPercent(percent(max.absolute, min.absolute, max.absolute)) + return + } + + const sliderMaxValue = Math.max(Number(values.max), minVal) + setMaxVal(sliderMaxValue) setMaxPercent(percent(sliderMaxValue, min.absolute, max.absolute)) }, })) @@ -130,6 +140,7 @@ const Slider = forwardRef( onChange={(event) => { const minValue = Math.min(Number(event.target.value), maxVal) + setMinVal(minValue) setMinPercent(percent(minValue, min.absolute, max.absolute)) onChange?.({ min: minValue, max: maxVal }) }} @@ -152,6 +163,7 @@ const Slider = forwardRef( onChange={(event) => { const maxValue = Math.max(Number(event.target.value), minVal) + setMaxVal(maxValue) setMaxPercent(percent(maxValue, min.absolute, max.absolute)) onChange?.({ min: minVal, max: maxValue }) }}