From ad5a49c2c6e675b38c21d510506f0ed5e16e6cd4 Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Fri, 26 Dec 2025 01:55:45 +0530 Subject: [PATCH] refactor: enhance auto-focus behavior in Composer component - Implemented a mechanism to auto-focus the editor immediately after the first message is sent, improving user experience by allowing quick follow-up queries. - Introduced a reference to track the previous state of the thread to ensure focus only occurs during the transition from empty to non-empty. --- surfsense_web/components/assistant-ui/thread.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/surfsense_web/components/assistant-ui/thread.tsx b/surfsense_web/components/assistant-ui/thread.tsx index 90d4e62a3..fb96e4d7a 100644 --- a/surfsense_web/components/assistant-ui/thread.tsx +++ b/surfsense_web/components/assistant-ui/thread.tsx @@ -409,6 +409,7 @@ const Composer: FC = () => { const setMentionedDocumentIds = useSetAtom(mentionedDocumentIdsAtom); const composerRuntime = useComposerRuntime(); const hasAutoFocusedRef = useRef(false); + const prevIsThreadEmptyRef = useRef(true); // Check if thread is empty (new chat) const isThreadEmpty = useAssistantState(({ thread }) => thread.isEmpty); @@ -428,11 +429,20 @@ const Composer: FC = () => { } }, [isThreadEmpty]); - // Reset auto-focus flag when thread becomes non-empty (user sent a message) + // Auto-focus editor immediately after first message is sent (when thread transitions from empty to non-empty) + // This allows the user to start typing the second query right away useEffect(() => { - if (!isThreadEmpty) { - hasAutoFocusedRef.current = false; + // Only focus when transitioning from empty to non-empty (first message sent) + if (prevIsThreadEmptyRef.current && !isThreadEmpty && editorRef.current) { + // Small delay to ensure the editor is ready after the message is sent + const timeoutId = setTimeout(() => { + editorRef.current?.focus(); + }, 50); + prevIsThreadEmptyRef.current = isThreadEmpty; + return () => clearTimeout(timeoutId); } + // Update the ref to track the previous state + prevIsThreadEmptyRef.current = isThreadEmpty; }, [isThreadEmpty]); // Sync mentioned document IDs to atom for use in chat request