Skip to content

Commit 8cc0a9c

Browse files
committed
Add timer to force re-evaluation of retry barrier
The initial fix prevented the flash but introduced a regression: if a send truly hangs (no stream-start event arrives), the retry barrier would never appear because React doesn't re-render just because time passes. Fixed by adding a timer that forces a re-render 2.1s after a user message is sent. This ensures the retry barrier appears even if the stream never starts, while still preventing the flash during normal operation.
1 parent 5c57969 commit 8cc0a9c

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

src/components/AIView.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ const AIViewInner: React.FC<AIViewProps> = ({
5252
const [activeTab, setActiveTab] = useState<TabType>("costs");
5353
const isReviewTabActive = activeTab === "review";
5454

55+
// Force re-check state for retry barrier (incremented to trigger re-evaluation)
56+
const [, setForceRecheck] = useState(0);
57+
5558
// Resizable sidebar for Review tab only
5659
// Hook encapsulates all drag logic, persistence, and constraints
5760
// Returns width to apply to RightSidebar and startResize for handle's onMouseDown
@@ -269,6 +272,26 @@ const AIViewInner: React.FC<AIViewProps> = ({
269272
// Uses same logic as useResumeManager for DRY
270273
const showRetryBarrier = !canInterrupt && hasInterruptedStream(messages);
271274

275+
// Force re-evaluation after 2s when last message is a recent user message
276+
// This ensures retry barrier appears even if stream-start never arrives
277+
useEffect(() => {
278+
if (messages.length === 0) return;
279+
const lastMessage = messages[messages.length - 1];
280+
281+
if (lastMessage.type === "user" && !canInterrupt) {
282+
const messageAge = Date.now() - (lastMessage.timestamp ?? 0);
283+
const timeUntilCheck = Math.max(0, 2100 - messageAge); // 2.1s to ensure we're past threshold
284+
285+
if (timeUntilCheck > 0) {
286+
const timer = setTimeout(() => {
287+
// Force re-render to re-evaluate showRetryBarrier
288+
setForceRecheck((prev) => prev + 1);
289+
}, timeUntilCheck);
290+
return () => clearTimeout(timer);
291+
}
292+
}
293+
}, [messages, canInterrupt]);
294+
272295
// Note: We intentionally do NOT reset autoRetry when streams start.
273296
// If user pressed Ctrl+C, autoRetry stays false until they manually retry.
274297
// This makes state transitions explicit and predictable.

0 commit comments

Comments
 (0)