From 4cb38264d01de33fc73c58c637a1250a9d363797 Mon Sep 17 00:00:00 2001 From: Alois Date: Wed, 5 Aug 2026 00:30:11 +0200 Subject: [PATCH] (feat): improve chat ui --- packages/chat/src/screen.tsx | 41 +++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/chat/src/screen.tsx b/packages/chat/src/screen.tsx index 5a3bcdd..8b3778e 100644 --- a/packages/chat/src/screen.tsx +++ b/packages/chat/src/screen.tsx @@ -146,6 +146,7 @@ export default function Screen() { setComposerValue, } = useChat(); const scrollRef = useRef(null); + const composerRef = useRef(null); const topSentinelRef = useRef(null); const didInitialScrollRef = useRef(false); const userScrolledUpRef = useRef(false); @@ -159,6 +160,7 @@ export default function Screen() { const [lastLiveMessageCount, setLastLiveMessageCount] = useState(0); const [didInitialScroll, setDidInitialScroll] = useState(false); const [viewportHeight, setViewportHeight] = useState(0); + const [composerHeight, setComposerHeight] = useState(0); const [editingMessageId, setEditingMessageId] = useState(null); const previousEditingMessageIdRef = useRef(null); @@ -280,6 +282,7 @@ export default function Screen() { getItemKey, estimateSize, overscan: 2, + paddingStart: composerHeight + 8, }); const totalSize = virtualizer.getTotalSize(); const contentHeight = Math.max(totalSize, viewportHeight); @@ -333,6 +336,26 @@ export default function Screen() { }; }, []); + useLayoutEffect(() => { + const element = composerRef.current; + if (!element || typeof ResizeObserver === "undefined") { + return; + } + + const updateComposerHeight = () => { + setComposerHeight(element.getBoundingClientRect().height); + }; + + updateComposerHeight(); + + const observer = new ResizeObserver(updateComposerHeight); + observer.observe(element); + + return () => { + observer.disconnect(); + }; + }, []); + useLayoutEffect(() => { if (didInitialScrollRef.current || virtualRowCount === 0) { return; @@ -382,22 +405,6 @@ export default function Screen() { void messagesQuery.fetchNextPage(); }, [didInitialScroll, messagesQuery, totalSize, viewportHeight]); - useLayoutEffect(() => { - if ( - !didInitialScroll || - userScrolledUpRef.current || - virtualRowCount === 0 - ) { - return; - } - - requestAnimationFrame(() => { - if (scrollRef.current) { - scrollRef.current.scrollTop = 0; - } - }); - }, [didInitialScroll, virtualRowCount]); - useEffect(() => { const root = scrollRef.current; const sentinel = topSentinelRef.current; @@ -623,7 +630,7 @@ export default function Screen() { })} -
+