From a430284aa21e3ae1f0d5654e55b2ad2852519cc2 Mon Sep 17 00:00:00 2001 From: wwf <yearningwang@iqtogether.com> Date: 星期三, 04 六月 2025 15:17:49 +0800 Subject: [PATCH] 初始化 --- app/components/base/auto-height-textarea/index.tsx | 126 +++++++++++++++++++----------------------- 1 files changed, 57 insertions(+), 69 deletions(-) diff --git a/app/components/base/auto-height-textarea/index.tsx b/app/components/base/auto-height-textarea/index.tsx index da412a1..f55db79 100644 --- a/app/components/base/auto-height-textarea/index.tsx +++ b/app/components/base/auto-height-textarea/index.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef } from 'react' +import { forwardRef, useEffect, useRef } from 'react' import cn from '@/utils/classnames' import { sleep } from '@/utils' @@ -16,80 +16,68 @@ onKeyUp?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void } -const AutoHeightTextarea = ( - { - ref: outerRef, - value, - onChange, - placeholder, - className, - wrapperClassName, - minHeight = 36, - maxHeight = 96, - autoFocus, - controlFocus, - onKeyDown, - onKeyUp, - }: IProps & { - ref: React.RefObject<unknown>; - }, -) => { - // eslint-disable-next-line react-hooks/rules-of-hooks - const ref = outerRef || useRef<HTMLTextAreaElement>(null) +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) { - ref.current.setSelectionRange(value.length, value.length) - ref.current.focus() - return true + const doFocus = () => { + if (ref.current) { + ref.current.setSelectionRange(value.length, value.length) + ref.current.focus() + return true + } + return false } - return false - } - const focus = async () => { - if (!doFocus()) { - let hasFocus = false - await sleep(100) - hasFocus = doFocus() - if (!hasFocus) + const focus = async () => { + if (!doFocus()) { + let hasFocus = false + await sleep(100) + hasFocus = doFocus() + if (!hasFocus) + focus() + } + } + + useEffect(() => { + if (autoFocus) focus() - } - } + }, []) + useEffect(() => { + if (controlFocus) + focus() + }, [controlFocus]) - useEffect(() => { - if (autoFocus) - focus() - }, []) - useEffect(() => { - if (controlFocus) - focus() - }, [controlFocus]) - - return ( - (<div className={`relative ${wrapperClassName}`}> - <div className={cn(className, 'invisible overflow-y-auto whitespace-pre-wrap break-all')} 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={{ + 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, - }} - placeholder={placeholder} - onChange={onChange} - onKeyDown={onKeyDown} - onKeyUp={onKeyUp} - value={value} - /> - </div>) - ) -} + }}> + {!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' -- Gitblit v1.8.0