import React, { forwardRef, InputHTMLAttributes, ReactNode, useMemo } from 'react'; import { type TStyle, useClassnames } from '../../hooks/use-classnames'; import style from './index.module.pcss'; type TNative = InputHTMLAttributes; export interface IProps { /** * Если параметр `id` не указан, то компонент будет создан без уникального идентификатора. */ readonly id?: TNative['id'], /** * Параметр `onChange` предназначен для обработки события изменения содержимого поля ввода текста. */ readonly onChange?: TNative['onChange'], /** * Параметр `onBlur` определяет функцию обратного вызова, которая будет вызвана, когда элемент теряет фокус (когда пользователь переключается на другой элемент на странице). */ readonly onBlur?: TNative['onBlur'], /** * Параметр `onFocus` определяет функцию обратного вызова, которая будет вызываться при фокусировке на элементе `input`. */ readonly onFocus?: TNative['onFocus'], /** * Параметр `autoFocus` определяет, следует ли автоматически устанавливать фокус на элемент, когда компонент монтируется. */ readonly autoFocus?: TNative['autoFocus'], /** * Параметр `tabIndex` указывает порядковый номер элемента при переходе по клавише `Tab`. Это позволяет управлять табуляцией на странице и устанавливать последовательность перехода фокуса между элементами при нажатии на клавишу `Tab`. */ readonly tabIndex?: TNative['tabIndex'], /** * Параметр `disabled` указывает, должно ли поле ввода быть неактивным и не реагировать на пользовательский ввод. Если `disabled` установлен в `true`, пользователь не сможет редактировать текст в поле ввода и оно будет иметь соответствующий стиль, который указывает на то, что поле недоступно для редактирования. */ readonly disabled?: TNative['disabled'], /** * Параметр `maxLength` указывает максимальную длину текста, которую можно ввести в поле ввода. Если установлено значение `maxLength`, пользователь не сможет ввести более указанного количества символов. Если значение `maxLength` не задано, пользователь сможет ввести любое количество символов в поле ввода. */ readonly maxLength?: TNative['maxLength'], /** * Параметр `minLength` указывает на минимальное количество символов, которое пользователь должен ввести в поле ввода. Если значение этого параметра больше, чем длина введенного текста, то поле ввода будет считаться недопустимым (ошибочным) и будет отображаться соответствующая валидационная информация. */ readonly minLength?: TNative['minLength'], /** * Регулярное выражение, которому должно соответствовать значение поля. */ readonly pattern?: TNative['pattern'], /** * Параметр `placeholder` позволяет установить текст-подсказку внутри текстовой области, который будет отображаться, когда текстовая область пуста. */ readonly placeholder?: TNative['placeholder'], /** * Параметр `readOnly` определяет, может ли пользователь редактировать текст в поле ввода или нет. */ readonly readOnly?: TNative['readOnly'], /** * Параметр `required` указывает, что данное поле является обязательным для заполнения перед отправкой формы */ readonly required?: TNative['required'], /** * Количество символов, которое может отображаться одновременно в поле. */ readonly size?: TNative['size'], /** * Параметр `autoComplete` определяет, должен ли браузер автоматически заполнять значение в поле ввода. */ readonly autoComplete?: TNative['autoComplete'], /** * Параметр `inputMode` определяет режим ввода текста для поля ввода. Он определяет, какая клавиатура должна появляться при вводе текста на мобильных устройствах. */ readonly inputMode?: TNative['inputMode'], /** * Параметр `autoCorrect` определяет, должна ли браузерная автокоррекция включаться для вводимого текста в поле ввода. */ readonly autoCorrect?: TNative['autoCorrect'], /** * Параметр `title` устанавливает значение атрибута `title` элемента `textarea`, которое используется для отображения всплывающей подсказки при наведении на элемент. */ readonly title?: TNative['title'], /** * Параметр `name` используется для установки имени элемента формы. Это имя будет отправлено на сервер вместе со значением поля при отправке формы. */ readonly name: string, /** * Параметр `className` используется для добавления пользовательских CSS классов к компоненту. Это позволяет настраивать внешний вид компонента с помощью пользовательских стилей. */ readonly className?: string | TStyle, /** * Параметр `label` используется для установки текста метки для текстового поля. Метка обычно отображается рядом с текстовым полем и предназначена для описания. */ readonly label?: ReactNode, /** * Тип поля ввода. */ readonly type?: 'email' | 'password' | 'search' | 'text' | 'tel' | 'url', /** * Параметр `value` используется для задания значения поля. */ readonly value?: string, /** * Параметр `defaultValue` используется для задания начального значения поля. */ readonly defaultValue?: string, /** * Параметр `isError` указывает, имеет ли поле ввода ошибку или нет. Если значение этого параметра установлено в `true`, то для поля ввода будет применяться соответствующий стиль, который указывает на наличие ошибки ввода. */ readonly isError?: boolean, /** * Параметр `elError` задает элемент, который будет использован в качестве места вывода сообщения об ошибке, если `isError` имеет значение true. Это элемент содержащий текст ошибки, который отображается рядом с полем ввода или под ним. */ readonly elError?: ReactNode, /** * Элемент, который следует разместить справа от поля ввода. */ readonly elAfter?: ReactNode, /** * Элемент, который следует разместить слева от поля ввода. */ readonly elBefore?: ReactNode, /** * Используется для отображения дополнительной информации о поле ввода, например, подсказки или описания того, какое содержимое следует вводить в поле. Это элемент отображается рядом с самим полем ввода. * * Этот параметр может быть полезен, если вы хотите предоставить пользователю дополнительную информацию о том, как использовать поле ввода или какой формат должен иметь вводимый текст. */ readonly elDescription?: ReactNode } /** * Компонент InputText - это текстовый ввод, который позволяет пользователю вводить текст в поле ввода. */ export const InputText = forwardRef(({ tabIndex = 0, type = 'text', ...props }, ref) => { const cn = useClassnames(style, props.className); const elLabel = useMemo(() => { if(props.label) { return (
); } }, [props.label, props.disabled, props.readOnly, props.required]); const elError = useMemo(() => { if(props.elError) { if(typeof props.elError === 'string') { return ( ); } return props.elError; } }, [props.elError]); const elDescription = useMemo(() => { if(props.elDescription) { if(typeof props.elDescription === 'string') { return ( ); } return props.elDescription; } }, [props.elDescription]); return ( ); });