import React, { FormEvent, InputHTMLAttributes, useEffect, useState, } from 'react' import TextInput from './Input' interface NumberInputProps extends InputHTMLAttributes { value: string allowFloat?: boolean onValue?: (val: string) => void } const NumberInput = React.forwardRef( (props: NumberInputProps, forwardedRef) => { const { value, allowFloat, onValue, ...itemProps } = props const [innerValue, setInnerValue] = useState(value) useEffect(() => { setInnerValue(value) }, [value]) const handleOnInput = (evt: FormEvent) => { const target = evt.target as HTMLInputElement let val = target.value if (allowFloat) { val = val.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1') onValue?.(val) } else { val = val.replace(/\D/g, '') onValue?.(val) } setInnerValue(val) } return ( ) } ) NumberInput.defaultProps = { allowFloat: false, } export default NumberInput