import classNames from 'classnames'; import React from 'react'; import { defineMessages, useIntl } from 'react-intl'; import Icon from '../icon/icon'; import SvgIcon from '../icon/svg-icon'; import Tooltip from '../tooltip/tooltip'; const messages = defineMessages({ showPassword: { id: 'input.password.show_password', defaultMessage: 'Show password' }, hidePassword: { id: 'input.password.hide_password', defaultMessage: 'Hide password' }, }); interface IInput extends Pick, 'maxLength' | 'onChange' | 'onBlur' | 'type' | 'autoComplete' | 'autoCorrect' | 'autoCapitalize' | 'required' | 'disabled' | 'onClick' | 'readOnly' | 'min' | 'pattern'> { /** Put the cursor into the input on mount. */ autoFocus?: boolean, /** The initial text in the input. */ defaultValue?: string, /** Extra class names for the element. */ className?: string, /** Extra class names for the outer
element. */ outerClassName?: string, /** URL to the svg icon. Cannot be used with addon. */ icon?: string, /** Internal input name. */ name?: string, /** Text to display before a value is entered. */ placeholder?: string, /** Text in the input. */ value?: string | number, /** Change event handler for the input. */ onChange?: (event: React.ChangeEvent) => void, /** HTML input type. */ type?: 'text' | 'number' | 'email' | 'tel' | 'password', /** Whether to display the input in red. */ hasError?: boolean, /** An element to display as prefix to input. Cannot be used with icon. */ addon?: React.ReactElement, } /** Form input element. */ const Input = React.forwardRef( (props, ref) => { const intl = useIntl(); const { type = 'text', icon, className, outerClassName, hasError, addon, ...filteredProps } = props; const [revealed, setRevealed] = React.useState(false); const isPassword = type === 'password'; const togglePassword = React.useCallback(() => { setRevealed((prev) => !prev); }, []); return (
{icon ? (
) : null} {addon ? (
{addon}
) : null} {isPassword ? (
) : null}
); }, ); export default Input;