-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathDebouncedNumberInputSNCF.tsx
70 lines (63 loc) · 1.63 KB
/
DebouncedNumberInputSNCF.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import React, { useEffect, useState } from 'react';
import InputSNCF from 'common/BootstrapSNCF/InputSNCF';
import { useDebouncedFunc } from 'utils/helpers';
type DebouncedNumberInputSNCFProps = {
input: number;
label: string;
setInput: (inputValue: number) => void;
debouncedDelay?: number;
id?: string;
max?: number;
min?: number;
sm?: boolean;
showFlex?: boolean;
};
const DebouncedNumberInputSNCF = ({
input,
label,
setInput,
debouncedDelay = 800,
id = '',
max,
min = 0,
sm = false,
showFlex = false,
}: DebouncedNumberInputSNCFProps) => {
const [value, setValue] = useState<number | null>(input);
useEffect(() => {
setValue(input);
}, [input]);
const checkChangedInput = (newValue: number | null) => {
if (
newValue !== null &&
newValue !== input &&
min <= newValue &&
(max === undefined || newValue <= max)
) {
setInput(newValue);
} else if (value === null && input !== 0) {
const previousValue = input;
setInput(previousValue);
}
};
useDebouncedFunc(value, debouncedDelay, checkChangedInput);
return (
<div className={`${showFlex && 'debounced-number-input'}`}>
<InputSNCF
type="number"
id={id}
isInvalid={value !== null && (value < min || (max !== undefined && max < value))}
label={label}
max={max}
min={min}
noMargin
onChange={(e) => {
setValue(e.target.value !== '' ? parseFloat(e.target.value) : null);
}}
value={value !== null ? value : ''}
sm={sm}
/>
</div>
);
};
export default React.memo(DebouncedNumberInputSNCF);