| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | 
							- import { forwardRef, useEffect, useRef } from 'react'
 - import cn from 'classnames'
 - 
 - type IProps = {
 -   placeholder?: string
 -   value: string
 -   onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void
 -   className?: string
 -   wrapperClassName?: string
 -   minHeight?: number
 -   maxHeight?: number
 -   autoFocus?: boolean
 -   controlFocus?: number
 -   onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
 -   onKeyUp?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void
 - }
 - 
 - const AutoHeightTextarea = forwardRef(
 -   (
 -     { value, onChange, placeholder, className, wrapperClassName, minHeight = 36, maxHeight = 96, autoFocus, controlFocus, onKeyDown, onKeyUp }: IProps,
 -     outerRef: any,
 -   ) => {
 -     // eslint-disable-next-line react-hooks/rules-of-hooks
 -     const ref = outerRef || useRef<HTMLTextAreaElement>(null)
 - 
 -     const doFocus = () => {
 -       if (ref.current) {
 -         // console.log('focus')
 -         ref.current.setSelectionRange(value.length, value.length)
 -         ref.current.focus()
 -         return true
 -       }
 -       // console.log(autoFocus, 'not focus')
 -       return false
 -     }
 - 
 -     const focus = () => {
 -       if (!doFocus()) {
 -         let hasFocus = false
 -         const runId = setInterval(() => {
 -           hasFocus = doFocus()
 -           if (hasFocus)
 -             clearInterval(runId)
 -         }, 100)
 -       }
 -     }
 - 
 -     useEffect(() => {
 -       if (autoFocus)
 -         focus()
 -     }, [])
 -     useEffect(() => {
 -       if (controlFocus)
 -         focus()
 -     }, [controlFocus])
 - 
 -     return (
 -       <div className={`relative ${wrapperClassName}`}>
 -         <div className={cn(className, 'invisible whitespace-pre-wrap break-all  overflow-y-auto')} style={{
 -           minHeight,
 -           maxHeight,
 -           paddingRight: (value && value.trim().length > 10000) ? 140 : 130,
 -         }}>
 -           {!value ? placeholder : value.replace(/\n$/, '\n ')}
 -         </div>
 -         <textarea
 -           ref={ref}
 -           autoFocus={autoFocus}
 -           className={cn(className, 'absolute inset-0 resize-none overflow-auto')}
 -           style={{
 -             paddingRight: (value && value.trim().length > 10000) ? 140 : 130,
 -           }}
 -           placeholder={placeholder}
 -           onChange={onChange}
 -           onKeyDown={onKeyDown}
 -           onKeyUp={onKeyUp}
 -           value={value}
 -         />
 -       </div>
 -     )
 -   },
 - )
 - 
 - AutoHeightTextarea.displayName = 'AutoHeightTextarea'
 - 
 - export default AutoHeightTextarea
 
 
  |