12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- '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) // integer only
- 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)
|