From 47e9ae21964d2cd72c80b24765c363e808a0278e Mon Sep 17 00:00:00 2001 From: Ammar Date: Tue, 9 Dec 2025 12:18:50 -0600 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=96=20fix:=20show=20user=20messages=20?= =?UTF-8?q?immediately=20without=20deferral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a user sends a message, useDeferredValue was causing a delay before the message appeared in the chat window. This created bad UX where the input was cleared but the message wasn't visible anywhere. The fix compares message counts between the current and deferred values. When the count differs (new message added), we show immediately. When only content changes (streaming deltas), we still defer for performance. This preserves the streaming optimization from commit 5cc443db while ensuring user messages appear instantly. --- src/browser/components/AIView.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/browser/components/AIView.tsx b/src/browser/components/AIView.tsx index b31a5f063d..99e1b292f4 100644 --- a/src/browser/components/AIView.tsx +++ b/src/browser/components/AIView.tsx @@ -169,7 +169,15 @@ const AIViewInner: React.FC = ({ // during rapid updates (streaming), keeping the UI responsive. // Must be defined before any early returns to satisfy React Hooks rules. const mergedMessages = useMemo(() => mergeConsecutiveStreamErrors(messages), [messages]); - const deferredMessages = useDeferredValue(mergedMessages); + const deferredMergedMessages = useDeferredValue(mergedMessages); + + // CRITICAL: When message count changes (new message sent/received), show immediately. + // Only defer content changes within existing messages (streaming deltas). + // This ensures user messages appear instantly while keeping streaming performant. + const deferredMessages = + mergedMessages.length !== deferredMergedMessages.length + ? mergedMessages + : deferredMergedMessages; // Get active stream message ID for token counting const activeStreamMessageId = aggregator?.getActiveStreamMessageId();