From 4fb25576b90879d4285520c83cc34a336ab9be87 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 22:17:51 +0000 Subject: [PATCH] fix: defer markThreadVisited to avoid React 185 error Wraps `markThreadVisited` in `startTransition` inside `ChatView.tsx` to defer the Zustand update out of React's synchronous commit cycle. This prevents an infinite re-render loop ("Maximum update depth exceeded") in React 19 caused by synchronous state updates from within the `useEffect`. Co-authored-by: gleber <33185+gleber@users.noreply.github.com> --- apps/web/src/components/ChatView.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 7c649b5003..3d8c3794f5 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -23,7 +23,7 @@ import { import { applyClaudePromptEffortPrefix, normalizeModelSlug } from "@t3tools/shared/model"; import { projectScriptCwd, projectScriptRuntimeEnv } from "@t3tools/shared/projectScripts"; import { truncate } from "@t3tools/shared/String"; -import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; +import { startTransition, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { useDebouncedValue } from "@tanstack/react-pacer"; import { useNavigate, useSearch } from "@tanstack/react-router"; @@ -976,7 +976,9 @@ export default function ChatView({ threadId }: ChatViewProps) { const lastVisitedAt = activeThreadLastVisitedAt ? Date.parse(activeThreadLastVisitedAt) : NaN; if (!Number.isNaN(lastVisitedAt) && lastVisitedAt >= turnCompletedAt) return; - markThreadVisited(serverThread.id); + startTransition(() => { + markThreadVisited(serverThread.id); + }); }, [ activeLatestTurn?.completedAt, activeThreadLastVisitedAt,