2021-12-23 13:49:24 +01:00
|
|
|
import {
|
|
|
|
NumberInputProps,
|
|
|
|
NumberInput,
|
|
|
|
NumberInputField,
|
|
|
|
NumberInputStepper,
|
|
|
|
NumberIncrementStepper,
|
|
|
|
NumberDecrementStepper,
|
|
|
|
} from '@chakra-ui/react'
|
|
|
|
import { useState, useEffect } from 'react'
|
|
|
|
|
|
|
|
export const SmartNumberInput = ({
|
|
|
|
initialValue,
|
|
|
|
onValueChange,
|
|
|
|
...props
|
|
|
|
}: {
|
2022-01-08 07:40:55 +01:00
|
|
|
initialValue?: number
|
|
|
|
onValueChange: (value?: number) => void
|
2021-12-23 13:49:24 +01:00
|
|
|
} & NumberInputProps) => {
|
2022-01-08 07:40:55 +01:00
|
|
|
const [value, setValue] = useState(initialValue?.toString() ?? '')
|
2021-12-23 13:49:24 +01:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (value.endsWith('.') || value.endsWith(',')) return
|
2022-01-08 07:40:55 +01:00
|
|
|
if (value === '') onValueChange(undefined)
|
2021-12-23 13:49:24 +01:00
|
|
|
const newValue = parseFloat(value)
|
|
|
|
if (isNaN(newValue)) return
|
|
|
|
onValueChange(newValue)
|
|
|
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
|
|
}, [value])
|
|
|
|
|
|
|
|
return (
|
|
|
|
<NumberInput onChange={setValue} value={value} {...props}>
|
|
|
|
<NumberInputField />
|
|
|
|
<NumberInputStepper>
|
|
|
|
<NumberIncrementStepper />
|
|
|
|
<NumberDecrementStepper />
|
|
|
|
</NumberInputStepper>
|
|
|
|
</NumberInput>
|
|
|
|
)
|
|
|
|
}
|