diff --git a/packages/web/src/app/error.test.tsx b/packages/web/src/app/error.test.tsx index 5e120196f..d28115410 100644 --- a/packages/web/src/app/error.test.tsx +++ b/packages/web/src/app/error.test.tsx @@ -7,6 +7,15 @@ vi.mock("next/navigation", () => ({ useRouter: () => ({ refresh }), })); +vi.mock("next/link", () => ({ + default: ({ + children, + ...props + }: React.PropsWithChildren>) => ( + {children} + ), +})); + import ErrorPage from "./error"; describe("Route error boundary", () => { diff --git a/packages/web/src/app/sessions/[id]/page.tsx b/packages/web/src/app/sessions/[id]/page.tsx index f90bf9a81..c09327e6e 100644 --- a/packages/web/src/app/sessions/[id]/page.tsx +++ b/packages/web/src/app/sessions/[id]/page.tsx @@ -75,6 +75,7 @@ export default function SessionPage() { const sessionIsOrchestratorRef = useRef(false); const resolvedProjectSessionsKeyRef = useRef(null); const prefixByProjectRef = useRef>(new Map()); + const hasLoadedSessionRef = useRef(false); // Keep prefixByProjectRef in sync so fetchProjectSessions (stable [] dep) reads latest map useEffect(() => { @@ -129,9 +130,12 @@ export default function SessionPage() { setSession(data); setRouteError(null); setSessionMissing(false); + hasLoadedSessionRef.current = true; } catch (err) { console.error("Failed to fetch session:", err); - setRouteError(err instanceof Error ? err : new Error("Failed to load session")); + if (!hasLoadedSessionRef.current) { + setRouteError(err instanceof Error ? err : new Error("Failed to load session")); + } } finally { setLoading(false); }