(
initial: number | null,
onChange: (value: number | null) => void,
id: any = ""
)
| 87 | const NumberRegex = /^-?\d*\.?\d?\d?$/; |
| 88 | const FormatNumber = (value: number | null) => (value !== null ? formatNumber(value, { separator: "" }) : ""); |
| 89 | export const useNumericInputHandler = ( |
| 90 | initial: number | null, |
| 91 | onChange: (value: number | null) => void, |
| 92 | id: any = "" |
| 93 | ) => { |
| 94 | const [text, setText] = useState(FormatNumber(initial)); |
| 95 | const { onTextChange, setValue } = useMemo( |
| 96 | () => ({ |
| 97 | onTextChange: handleTextFieldChange((raw) => { |
| 98 | const value = raw.replaceAll(/[^\-0-9\.]/g, ""); |
| 99 | if (NumberRegex.test(value)) { |
| 100 | setText(value); |
| 101 | onChange(value === "" ? null : +value); |
| 102 | } |
| 103 | }), |
| 104 | setValue: (value: number | null) => setText(FormatNumber(value)), |
| 105 | }), |
| 106 | [setText, onChange] |
| 107 | ); |
| 108 | useEffect(() => { |
| 109 | if (FormatNumber(initial) !== text) setText(FormatNumber(initial)); |
| 110 | // eslint-disable-next-line react-hooks/exhaustive-deps |
| 111 | }, [id]); |
| 112 | return { text, setText, setValue, onTextChange }; |
| 113 | }; |
| 114 | |
| 115 | export const useRefToValue = <T>(t: T) => { |
| 116 | const ref = useRef(t); |
no test coverage detected