import React, { ChangeEvent, LegacyRef, memo, TextareaHTMLAttributes, useCallback, useEffect, useRef, useState, } from 'react'; import classNames from 'classnames'; import autosize from 'autosize'; import * as styles from '~/styles/common/inputs.module.scss'; import { Icon } from '../Icon'; type IProps = TextareaHTMLAttributes & { value: string; placeholder?: string; rows?: number; className?: string; minRows?: number; maxRows?: number; handler: (value: string) => void; required?: boolean; status?: 'error' | 'success' | ''; title?: string; seamless?: boolean; }; const Textarea = memo( ({ placeholder, className, minRows = 3, maxRows = 30, handler, required = false, title = '', status = '', seamless, value, ...props }) => { const [rows, setRows] = useState(minRows || 1); const [focused, setFocused] = useState(false); const textarea: LegacyRef = useRef(null); const onInput = useCallback( ({ target }: ChangeEvent) => handler(target.value), [handler] ); const onFocus = useCallback(() => setFocused(true), [setFocused]); const onBlur = useCallback(() => setFocused(false), [setFocused]); useEffect(() => { if (!textarea.current) return; autosize(textarea.current); return () => autosize.destroy(textarea.current); }, [textarea.current]); return (