| | '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) |
| |
|