| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 | import { forwardRef, useEffect, useRef } from 'react'import cn from '@/utils/classnames'type AutoHeightTextareaProps =  & React.DetailedHTMLProps<React.TextareaHTMLAttributes<HTMLTextAreaElement>, HTMLTextAreaElement>  & { outerClassName?: string }const AutoHeightTextarea = forwardRef<HTMLTextAreaElement, AutoHeightTextareaProps>(  (    {      outerClassName,      value,      className,      placeholder,      autoFocus,      disabled,      ...rest    },    outRef,  ) => {    const innerRef = useRef<HTMLTextAreaElement>(null)    const ref = outRef || innerRef    useEffect(() => {      if (autoFocus && !disabled && value) {        if (typeof ref !== 'function') {          ref.current?.setSelectionRange(`${value}`.length, `${value}`.length)          ref.current?.focus()        }      }    }, [autoFocus, disabled, ref])    return (      <div className={outerClassName}>        <div className='relative'>          <div className={cn(className, 'invisible whitespace-pre-wrap break-all')}>            {!value ? placeholder : `${value}`.replace(/\n$/, '\n ')}          </div>          <textarea            ref={ref}            placeholder={placeholder}            className={cn(className, 'disabled:bg-transparent absolute inset-0 outline-none border-none appearance-none resize-none w-full h-full')}            value={value}            disabled={disabled}            {...rest}          />        </div>      </div>    )  },)export default AutoHeightTextarea
 |