From ae816d5227dfcb251930092e94e640105027e78d Mon Sep 17 00:00:00 2001 From: Nate <37554478+servusdei2018@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:39:52 -0400 Subject: [PATCH] fix: insert parameters at cursor position (#2867) Co-authored-by: ellipsis-dev[bot] <65095814+ellipsis-dev[bot]@users.noreply.github.com> Co-authored-by: Suchintan Co-authored-by: Jonathan Dobson --- .../AutoResizingTextarea.tsx | 108 ++++++++++++------ .../components/WorkflowBlockInputTextarea.tsx | 47 +++++++- 2 files changed, 116 insertions(+), 39 deletions(-) diff --git a/skyvern-frontend/src/components/AutoResizingTextarea/AutoResizingTextarea.tsx b/skyvern-frontend/src/components/AutoResizingTextarea/AutoResizingTextarea.tsx index 82104377..242eac56 100644 --- a/skyvern-frontend/src/components/AutoResizingTextarea/AutoResizingTextarea.tsx +++ b/skyvern-frontend/src/components/AutoResizingTextarea/AutoResizingTextarea.tsx @@ -1,5 +1,12 @@ -import { ChangeEventHandler, useEffect, useLayoutEffect, useRef } from "react"; import { Textarea } from "@/components/ui/textarea"; +import type { ChangeEventHandler, HTMLAttributes } from "react"; +import { + forwardRef, + useEffect, + useLayoutEffect, + useRef, + useCallback, +} from "react"; import { cn } from "@/util/utils"; type Props = { @@ -8,44 +15,73 @@ type Props = { className?: string; readOnly?: boolean; placeholder?: string; -}; + onClick?: React.MouseEventHandler; + onKeyUp?: React.KeyboardEventHandler; + onSelect?: React.ReactEventHandler; +} & Omit, "onChange" | "value">; -function AutoResizingTextarea({ - value, - onChange, - className, - readOnly, - placeholder, -}: Props) { - const ref = useRef(null); +const AutoResizingTextarea = forwardRef( + ( + { + value, + onChange, + className, + readOnly, + placeholder, + onClick, + onKeyUp, + onSelect, + ...restProps + }, + forwardedRef, + ) => { + const innerRef = useRef(null); + const getTextarea = useCallback(() => innerRef.current, []); - useLayoutEffect(() => { - // size the textarea correctly on first render - if (!ref.current) { - return; - } - ref.current.style.height = `${ref.current.scrollHeight + 2}px`; - }, []); + const setRefs = (element: HTMLTextAreaElement | null) => { + innerRef.current = element; - useEffect(() => { - if (!ref.current) { - return; - } - ref.current.style.height = "auto"; - ref.current.style.height = `${ref.current.scrollHeight + 2}px`; - }, [value]); + // Forward to external ref + if (typeof forwardedRef === "function") { + forwardedRef(element); + } else if (forwardedRef) { + forwardedRef.current = element; + } + }; - return ( -