|
'use client' |
|
import type { FC } from 'react' |
|
import React, { useCallback } from 'react' |
|
|
|
type Props = { |
|
value: string | number |
|
onChange: (value: string | number) => void |
|
placeholder?: string |
|
isNumber?: boolean |
|
} |
|
|
|
const MIN_VALUE = 0 |
|
|
|
const Input: FC<Props> = ({ |
|
value, |
|
onChange, |
|
placeholder = '', |
|
isNumber = false, |
|
}) => { |
|
const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => { |
|
const value = e.target.value |
|
if (isNumber) { |
|
let numberValue = parseInt(value, 10) |
|
if (isNaN(numberValue)) { |
|
onChange('') |
|
return |
|
} |
|
if (numberValue < MIN_VALUE) |
|
numberValue = MIN_VALUE |
|
|
|
onChange(numberValue) |
|
return |
|
} |
|
onChange(value) |
|
}, [isNumber, onChange]) |
|
|
|
const otherOption = (() => { |
|
if (isNumber) { |
|
return { |
|
min: MIN_VALUE, |
|
} |
|
} |
|
return { |
|
|
|
} |
|
})() |
|
return ( |
|
<input |
|
type={isNumber ? 'number' : 'text'} |
|
{...otherOption} |
|
value={value} |
|
onChange={handleChange} |
|
className='flex h-9 w-full py-1 px-2 rounded-lg text-xs leading-normal bg-gray-100 caret-primary-600 hover:bg-gray-100 focus:ring-1 focus:ring-inset focus:ring-gray-200 focus-visible:outline-none focus:bg-gray-50 placeholder:text-gray-400' |
|
placeholder={placeholder} |
|
/> |
|
) |
|
} |
|
export default React.memo(Input) |
|
|