mirror of
				https://github.com/langgenius/dify.git
				synced 2025-10-31 10:53:02 +00:00 
			
		
		
		
	 cf93d8d6e2
			
		
	
	
		cf93d8d6e2
		
			
		
	
	
	
	
		
			
			Co-authored-by: jyong <718720800@qq.com> Co-authored-by: StyleZhang <jasonapring2015@outlook.com>
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { forwardRef, useEffect, useRef } from 'react'
 | |
| import cn from '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')}
 | |
|             value={value}
 | |
|             disabled={disabled}
 | |
|             {...rest}
 | |
|           />
 | |
|         </div>
 | |
|       </div>
 | |
|     )
 | |
|   },
 | |
| )
 | |
| 
 | |
| export default AutoHeightTextarea
 |