Workflow-Engine
/
web
/app
/components
/header
/account-setting
/model-provider-page
/model-modal
/Input.tsx
| import type { FC } from 'react' | |
| import { CheckCircle } from '@/app/components/base/icons/src/vender/solid/general' | |
| type InputProps = { | |
| value?: string | |
| onChange: (v: string) => void | |
| onFocus?: () => void | |
| placeholder?: string | |
| validated?: boolean | |
| className?: string | |
| disabled?: boolean | |
| type?: string | |
| min?: number | |
| max?: number | |
| } | |
| const Input: FC<InputProps> = ({ | |
| value, | |
| onChange, | |
| onFocus, | |
| placeholder, | |
| validated, | |
| className, | |
| disabled, | |
| type = 'text', | |
| min, | |
| max, | |
| }) => { | |
| const toLimit = (v: string) => { | |
| const minNum = parseFloat(`${min}`) | |
| const maxNum = parseFloat(`${max}`) | |
| if (!isNaN(minNum) && parseFloat(v) < minNum) { | |
| onChange(`${min}`) | |
| return | |
| } | |
| if (!isNaN(maxNum) && parseFloat(v) > maxNum) | |
| onChange(`${max}`) | |
| } | |
| return ( | |
| <div className='relative'> | |
| <input | |
| tabIndex={0} | |
| className={` | |
| block px-3 w-full h-9 bg-gray-100 text-sm rounded-lg border border-transparent | |
| appearance-none outline-none caret-primary-600 | |
| hover:border-[rgba(0,0,0,0.08)] hover:bg-gray-50 | |
| focus:bg-white focus:border-gray-300 focus:shadow-xs | |
| placeholder:text-sm placeholder:text-gray-400 | |
| ${validated && 'pr-[30px]'} | |
| ${className} | |
| `} | |
| placeholder={placeholder || ''} | |
| onChange={e => onChange(e.target.value)} | |
| onBlur={e => toLimit(e.target.value)} | |
| onFocus={onFocus} | |
| value={value} | |
| disabled={disabled} | |
| type={type} | |
| min={min} | |
| max={max} | |
| /> | |
| { | |
| validated && ( | |
| <div className='absolute top-2.5 right-2.5'> | |
| <CheckCircle className='w-4 h-4 text-[#039855]' /> | |
| </div> | |
| ) | |
| } | |
| </div> | |
| ) | |
| } | |
| export default Input | |