12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 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
|