-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathSpeedInput.tsx
42 lines (34 loc) · 1.22 KB
/
SpeedInput.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
import React, { type InputHTMLAttributes, useEffect, useState } from 'react';
import { isNumber } from 'lodash';
import { kmhToMs, msToKmh } from 'utils/physics';
function msToKmhString(msSpeed: number | undefined): string {
return isNumber(msSpeed) ? msToKmh(msSpeed).toFixed(2) : '';
}
type SpeedInputProps = {
msSpeed: number | undefined;
onChange: (newMsSpeed: number | undefined) => void;
} & Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange' | 'type'>;
const SpeedInput = ({ msSpeed, onChange, ...attrs }: SpeedInputProps) => {
const [kmhSpeed, setKmhSpeed] = useState<string>(msToKmhString(msSpeed));
useEffect(() => {
const newKmhSpeed = msToKmhString(msSpeed);
if (+newKmhSpeed !== +kmhSpeed) setKmhSpeed(newKmhSpeed);
}, [msSpeed]);
return (
<input
min={1}
step={0.1}
{...attrs}
type="number"
value={kmhSpeed}
onChange={(e) => {
const inputValue = e.target.value;
setKmhSpeed(inputValue);
const newKmhSpeed = parseFloat(inputValue);
const newMsSpeed = Number.isNaN(newKmhSpeed) ? undefined : kmhToMs(newKmhSpeed);
if (newMsSpeed !== msSpeed) onChange(newMsSpeed);
}}
/>
);
};
export default SpeedInput;