import React, { FC, memo, useRef, useState } from 'react'; import { cn } from '../../util/bem'; import { FormSizesType, SizeType } from '../../util/global-props'; import { IconPropsType } from '../icon/icon.component'; import { iconMap } from '../icon/icon.library'; import { useDynamicRows } from './textarea.hook'; import './textarea.component.scss'; export type TextAreaPropsType = { className?: string; value?: string; defaultValue?: string; placeholder?: string; icon?: keyof typeof iconMap; iconColor?: IconPropsType['color']; after?: React.ReactNode; before?: React.ReactNode; size?: FormSizesType; flex?: number; margin?: SizeType; style?: React.CSSProperties; autoSize?: boolean; minRows?: number; maxRows?: number; autoFocus?: boolean; disabled?: boolean; fullWidth?: boolean; transparent?: boolean; readOnly?: boolean; required?: boolean; onChange?: React.ChangeEventHandler; onClick?: React.MouseEventHandler; onFocus?: React.FocusEventHandler; onBlur?: React.FocusEventHandler; onKeyDown?: React.KeyboardEventHandler; onKeyPress?: React.KeyboardEventHandler; onKeyUp?: React.KeyboardEventHandler; } const className = cn('text-area'); export const TextArea: FC = memo((props) => { const ref = useRef(null); const [ focus, setFocus ] = useState(false); const rows = useDynamicRows( ref, { min: props.minRows, max: props.maxRows, value: props.value, enable: props.autoSize } ); const handleFocus = (event: React.FocusEvent) => { setFocus(true); if (props.onFocus) { props.onFocus(event); } }; const handleBlur = (event: React.FocusEvent) => { setFocus(false); if (props.onBlur) { props.onBlur(event); } }; return (