Skip to content

Commit 545f64a

Browse files
committedApr 9, 2024·
Fix slider NaN issue (validate inputs before updating slider)
1 parent 44dd59c commit 545f64a

File tree

1 file changed

+49
-15
lines changed

1 file changed

+49
-15
lines changed
 

‎src/features/collections/CollectionDetail.tsx

+49-15
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useParams, useNavigate, useLocation } from 'react-router-dom';
22
import { getCollection, getMatch } from '../../common/api/collectionsApi';
33
import { usePageTitle } from '../layout/layoutSlice';
44
import styles from './Collections.module.scss';
5-
import { useEffect, useMemo, useRef, useState } from 'react';
5+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
66
import { DataProduct } from './DataProduct';
77
import {
88
countDecimals,
@@ -608,6 +608,7 @@ const DateRangeFilterControls = ({
608608
} = useForm({
609609
defaultValues: { min: defMin, max: defMax },
610610
reValidateMode: 'onChange',
611+
shouldFocusError: false,
611612
});
612613
const values = getValues();
613614
const { error: minError } = getFieldState('min', formState);
@@ -643,6 +644,18 @@ const DateRangeFilterControls = ({
643644
}
644645
});
645646

647+
const validateMin = useCallback(
648+
(value: string, max: string) =>
649+
parseDate(value) <= parseDate(max) && !Number.isNaN(parseDate(value)),
650+
[]
651+
);
652+
653+
const validateMax = useCallback(
654+
(value: string, min: string) =>
655+
parseDate(value) >= parseDate(min) && !Number.isNaN(parseDate(value)),
656+
[]
657+
);
658+
646659
const submit = handleSubmit(() => {
647660
setFilterRange(0)();
648661
});
@@ -656,9 +669,13 @@ const DateRangeFilterControls = ({
656669
});
657670

658671
useEffect(() => {
659-
//Set slider position from values
660-
setSliderPosition([values.min, values.max]);
661-
}, [values.min, values.max]);
672+
//Set slider position from values, if valid
673+
if (
674+
validateMin(values.min, values.max) &&
675+
validateMax(values.max, values.min)
676+
)
677+
setSliderPosition([values.min, values.max]);
678+
}, [values.min, values.max, validateMin, validateMax]);
662679

663680
const [filterMin, filterMax] = [filter.min_value, filter.max_value];
664681
useEffect(() => {
@@ -676,7 +693,7 @@ const DateRangeFilterControls = ({
676693
<TextField
677694
{...register('min', {
678695
valueAsDate: true,
679-
validate: (value) => parseDate(value) < parseDate(values.max),
696+
validate: (value) => validateMin(value, values.max),
680697
onBlur: submit,
681698
onChange: debounceSubmit,
682699
})}
@@ -687,7 +704,7 @@ const DateRangeFilterControls = ({
687704
<TextField
688705
{...register('max', {
689706
valueAsDate: true,
690-
validate: (value) => parseDate(value) > parseDate(values.min),
707+
validate: (value) => validateMax(value, values.min),
691708
onBlur: submit,
692709
onChange: debounceSubmit,
693710
})}
@@ -749,6 +766,7 @@ const RangeFilterControls = ({
749766
} = useForm({
750767
defaultValues: { min: defMin, max: defMax },
751768
reValidateMode: 'onChange',
769+
shouldFocusError: false,
752770
});
753771
const values = getValues();
754772
const { error: minError } = getFieldState('min', formState);
@@ -784,6 +802,22 @@ const RangeFilterControls = ({
784802
}
785803
});
786804

805+
const validateMin = useCallback(
806+
(value: number, max: number) =>
807+
value <= max &&
808+
(filter.type === 'float' || Number.isInteger(value)) &&
809+
!Number.isNaN(value),
810+
[filter.type]
811+
);
812+
813+
const validateMax = useCallback(
814+
(value: number, min: number) =>
815+
value >= min &&
816+
(filter.type === 'float' || Number.isInteger(value)) &&
817+
!Number.isNaN(value),
818+
[filter.type]
819+
);
820+
787821
const submit = handleSubmit(() => {
788822
setFilterRange(0)();
789823
});
@@ -797,9 +831,13 @@ const RangeFilterControls = ({
797831
});
798832

799833
useEffect(() => {
800-
//Set slider position from values
801-
setSliderPosition([values.min, values.max]);
802-
}, [values.min, values.max]);
834+
//Set slider position from values, if valid
835+
if (
836+
validateMin(values.min, values.max) &&
837+
validateMax(values.max, values.min)
838+
)
839+
setSliderPosition([values.min, values.max]);
840+
}, [values.min, values.max, validateMin, validateMax]);
803841

804842
const [filterMin, filterMax] = [filter.min_value, filter.max_value];
805843
useEffect(() => {
@@ -824,9 +862,7 @@ const RangeFilterControls = ({
824862
<TextField
825863
{...register('min', {
826864
valueAsNumber: true,
827-
validate: (value) =>
828-
value < values.max &&
829-
(filter.type === 'float' || Number.isInteger(value)),
865+
validate: (value) => validateMin(value, values.max),
830866
onChange: debounceSubmit,
831867
onBlur: submit,
832868
})}
@@ -837,9 +873,7 @@ const RangeFilterControls = ({
837873
<TextField
838874
{...register('max', {
839875
valueAsNumber: true,
840-
validate: (value) =>
841-
value > values.min &&
842-
(filter.type === 'float' || Number.isInteger(value)),
876+
validate: (value) => validateMax(value, values.min),
843877
onChange: debounceSubmit,
844878
onBlur: submit,
845879
})}

0 commit comments

Comments
 (0)
Please sign in to comment.