From 68ba17d31a6b6d80eb0a4bcd5051d33942f306a6 Mon Sep 17 00:00:00 2001 From: "posthog[bot]" <206114724+posthog[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 09:50:12 +0000 Subject: [PATCH] fix(ui): stop stale PR status leaking across cloud task switches MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `useTaskPrStatus` disables its query for a cloud task with no `cloudPrUrl` yet, but `placeholderData: (prev) => prev` keeps serving the previously-selected task's resolved data — a disabled query never fetches to replace it, so the stale PR state and CI status persist indefinitely. Guard the disabled case explicitly so a freshly-selected task with no PR never surfaces another task's leftover PR/CI status. Generated-By: PostHog Code Task-Id: 4ee8babf-75b1-4574-a1e7-2cddf1c96134 --- .../src/features/sidebar/useTaskPrStatus.test.ts | 14 ++++++++++++++ .../ui/src/features/sidebar/useTaskPrStatus.ts | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/features/sidebar/useTaskPrStatus.test.ts b/packages/ui/src/features/sidebar/useTaskPrStatus.test.ts index 0e16f9904a..ecaa82bb60 100644 --- a/packages/ui/src/features/sidebar/useTaskPrStatus.test.ts +++ b/packages/ui/src/features/sidebar/useTaskPrStatus.test.ts @@ -108,4 +108,18 @@ describe("useTaskPrStatus", () => { ); expect(lastQueryOptions?.enabled).toBe(true); }); + + it("ignores leftover placeholder data from a previous task when the query is disabled", () => { + // Simulates switching from a cloud task with a PR (query data populated) + // to a fresh cloud task with no PR yet — TanStack's `placeholderData` + // would otherwise keep serving the previous task's resolved data since + // the disabled query never fetches to overwrite it. + queryData = { prState: "open", hasDiff: true }; + const { result } = renderHook(() => + useTaskPrStatus( + makeTask({ taskRunEnvironment: "cloud", cloudPrUrl: null }), + ), + ); + expect(result.current).toEqual({ prState: null, hasDiff: false }); + }); }); diff --git a/packages/ui/src/features/sidebar/useTaskPrStatus.ts b/packages/ui/src/features/sidebar/useTaskPrStatus.ts index d0db43aa62..e04e749179 100644 --- a/packages/ui/src/features/sidebar/useTaskPrStatus.ts +++ b/packages/ui/src/features/sidebar/useTaskPrStatus.ts @@ -35,6 +35,11 @@ export function useTaskPrStatus(task: { ), ); - if (!data || (!data.prState && !data.hasDiff)) return EMPTY; + // When the query is disabled, `data` can still be populated: + // `placeholderData: (prev) => prev` carries over whatever the previous + // task's query resolved to, and a disabled query never fetches to replace + // it. Without this guard, switching from a task with a PR to one without + // (e.g. a fresh cloud task) would keep showing the old task's PR status. + if (skipQuery || !data || (!data.prState && !data.hasDiff)) return EMPTY; return data; }