2
0
Files
bot/apps/builder/components/shared/SmartNumberInput.tsx

53 lines
1.4 KiB
TypeScript
Raw Normal View History

2021-12-23 13:49:24 +01:00
import {
NumberInputProps,
NumberInput,
NumberInputField,
NumberInputStepper,
NumberIncrementStepper,
NumberDecrementStepper,
} from '@chakra-ui/react'
2022-03-09 15:12:00 +01:00
import { useEffect, useState } from 'react'
import { useDebounce } from 'use-debounce'
2021-12-23 13:49:24 +01:00
export const SmartNumberInput = ({
value,
2021-12-23 13:49:24 +01:00
onValueChange,
...props
}: {
value?: number
2022-01-08 07:40:55 +01:00
onValueChange: (value?: number) => void
2021-12-23 13:49:24 +01:00
} & NumberInputProps) => {
const [currentValue, setCurrentValue] = useState(value?.toString() ?? '')
2022-03-09 15:12:00 +01:00
const [valueToReturn, setValueToReturn] = useState<number | undefined>(
parseFloat(currentValue)
)
const [debouncedValue] = useDebounce(
valueToReturn,
process.env.NEXT_PUBLIC_E2E_TEST ? 0 : 1000
)
useEffect(() => {
onValueChange(debouncedValue)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [debouncedValue])
2021-12-23 13:49:24 +01:00
const handleValueChange = (value: string) => {
setCurrentValue(value)
2021-12-23 13:49:24 +01:00
if (value.endsWith('.') || value.endsWith(',')) return
2022-03-09 15:12:00 +01:00
if (value === '') return setValueToReturn(undefined)
2021-12-23 13:49:24 +01:00
const newValue = parseFloat(value)
if (isNaN(newValue)) return
2022-03-09 15:12:00 +01:00
setValueToReturn(newValue)
}
2021-12-23 13:49:24 +01:00
return (
<NumberInput onChange={handleValueChange} value={currentValue} {...props}>
2021-12-23 13:49:24 +01:00
<NumberInputField />
<NumberInputStepper>
<NumberIncrementStepper />
<NumberDecrementStepper />
</NumberInputStepper>
</NumberInput>
)
}