From 48061839b92f004f3a0c4318d7b18ec45ff6ed2f Mon Sep 17 00:00:00 2001 From: Abhin Rustagi Date: Tue, 21 Jul 2026 15:58:13 +0530 Subject: [PATCH] feat: add hoook for auto-focus --- .../AgentInterface/components/Composer.tsx | 12 ++++++- .../components/DesktopWelcomeComposer.tsx | 11 ++++++- packages/react-ui/src/hooks/useAutoFocus.ts | 31 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 packages/react-ui/src/hooks/useAutoFocus.ts diff --git a/packages/react-ui/src/components/AgentInterface/components/Composer.tsx b/packages/react-ui/src/components/AgentInterface/components/Composer.tsx index 18f808eda..1aa51fdfd 100644 --- a/packages/react-ui/src/components/AgentInterface/components/Composer.tsx +++ b/packages/react-ui/src/components/AgentInterface/components/Composer.tsx @@ -1,7 +1,9 @@ -import { useThread } from "@openuidev/react-headless"; +import { useThread, useThreadList } from "@openuidev/react-headless"; import clsx from "clsx"; import { ArrowUp, Square } from "lucide-react"; import { useCallback, useLayoutEffect, useRef, useState } from "react"; +import { useLayoutContext } from "../../../context/LayoutContext"; +import { useAutoFocus } from "../../../hooks/useAutoFocus"; import { useComposerState } from "../../../hooks/useComposerState"; import { IconButton } from "../../IconButton"; @@ -19,6 +21,13 @@ export const Composer = ({ className, placeholder = "Type your query here" }: Co const inputRef = useRef(null); const [hasInputOverflowTop, setHasInputOverflowTop] = useState(false); const [hasInputOverflowBottom, setHasInputOverflowBottom] = useState(false); + const selectedThreadId = useThreadList((s) => s.selectedThreadId); + const { layout } = useLayoutContext(); + + useAutoFocus(inputRef, { + enabled: layout !== "mobile" && !isLoadingMessages, + focusKey: selectedThreadId, + }); const updateInputOverflow = useCallback(() => { const input = inputRef.current; @@ -71,6 +80,7 @@ export const Composer = ({ className, placeholder = "Type your query here" }: Co