From 93f2c18daeec560024e9ebb01e234a2d10c74af0 Mon Sep 17 00:00:00 2001 From: brennanb2025 Date: Wed, 24 Jun 2026 21:14:54 -0700 Subject: [PATCH] Address PR refresh review feedback Co-authored-by: Orca --- .../components/right-sidebar/ChecksPanel.tsx | 26 ++++++++--------- .../right-sidebar/checks-panel-empty-state.ts | 2 ++ src/renderer/src/store/slices/github.ts | 29 ++++++++++++++----- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/renderer/src/components/right-sidebar/ChecksPanel.tsx b/src/renderer/src/components/right-sidebar/ChecksPanel.tsx index 1ffcaa6c2cb..437057f8d6a 100644 --- a/src/renderer/src/components/right-sidebar/ChecksPanel.tsx +++ b/src/renderer/src/components/right-sidebar/ChecksPanel.tsx @@ -14,6 +14,7 @@ import { } from 'lucide-react' import { useAppStore, type AppState } from '@/store' import { + buildGitHubPRRefreshStateClearToken, getGitHubPRRefreshStateExpiryAt, mergePRCommentIntoList, prChecksCacheSuffix, @@ -665,16 +666,17 @@ export default function ChecksPanel(): React.JSX.Element { setPrRefreshStateNow(Date.now()) const storeState = useAppStore.getState() const rawState = storeState.prRefreshStates[prCacheKey] - if (!rawState) { + const token = buildGitHubPRRefreshStateClearToken( + rawState, + storeState.prRefreshSequences, + prCacheKey + ) + if (!token) { return } // Why: time alone does not publish Zustand updates; this timeout clears // abandoned active refresh UI without treating expiry as no-PR evidence. - storeState.expireGitHubPRRefreshState(prCacheKey, { - sequence: storeState.prRefreshSequences[prCacheKey] ?? 0, - status: rawState.status, - updatedAt: rawState.updatedAt - }) + storeState.expireGitHubPRRefreshState(prCacheKey, token) }, Math.max(0, expiryAt - Date.now() + 1) ) @@ -1846,13 +1848,11 @@ export default function ChecksPanel(): React.JSX.Element { } const refreshStoreState = useAppStore.getState() const rawPRRefreshState = refreshStoreState.prRefreshStates[prCacheKey] - const startedPRRefreshToken = rawPRRefreshState - ? { - sequence: refreshStoreState.prRefreshSequences[prCacheKey] ?? 0, - status: rawPRRefreshState.status, - updatedAt: rawPRRefreshState.updatedAt - } - : null + const startedPRRefreshToken = buildGitHubPRRefreshStateClearToken( + rawPRRefreshState, + refreshStoreState.prRefreshSequences, + prCacheKey + ) let refreshedPR: PRInfo | null = null try { refreshedPR = await fetchPRForBranch(repo.path, branch, { diff --git a/src/renderer/src/components/right-sidebar/checks-panel-empty-state.ts b/src/renderer/src/components/right-sidebar/checks-panel-empty-state.ts index b36495f2714..8510676a759 100644 --- a/src/renderer/src/components/right-sidebar/checks-panel-empty-state.ts +++ b/src/renderer/src/components/right-sidebar/checks-panel-empty-state.ts @@ -40,6 +40,8 @@ export function getChecksPanelEmptyStateCopy( } const blockedReason = input.hostedReviewBlockedReason + // Why: hosted-review metadata with missing PR cache data is ambiguous, so + // avoid showing "no PR" or publish guidance until GitHub status is refreshed. if ( input.hasAmbiguousGitHubHostedReview === true && (input.prRefreshStatus === 'paused' || diff --git a/src/renderer/src/store/slices/github.ts b/src/renderer/src/store/slices/github.ts index 947cc15e1c4..0f7e6ac7393 100644 --- a/src/renderer/src/store/slices/github.ts +++ b/src/renderer/src/store/slices/github.ts @@ -637,7 +637,7 @@ export type PRRefreshState = { message?: string } -type PRRefreshStateClearToken = { +export type PRRefreshStateClearToken = { sequence: number status: PRRefreshState['status'] updatedAt: number @@ -1484,6 +1484,21 @@ function isPRRefreshStateExpired(state: PRRefreshState, now: number): boolean { return expiryAt !== null && now > expiryAt } +export function buildGitHubPRRefreshStateClearToken( + state: PRRefreshState | undefined, + sequences: Record, + cacheKey: string +): PRRefreshStateClearToken | null { + if (!state) { + return null + } + return { + sequence: sequences[cacheKey] ?? 0, + status: state.status, + updatedAt: state.updatedAt + } +} + export function getGitHubPRRefreshStateExpiryAt(state: PRRefreshState | undefined): number | null { if (!state) { return null @@ -2817,13 +2832,11 @@ export const createGitHubSlice: StateCreator = (s const requestStartedAt = Date.now() const requestStartedHostedReviewEntry = get().hostedReviewCache[hostedReviewCacheKey] const requestStartedPRRefreshState = get().prRefreshStates[cacheKey] - const requestStartedPRRefreshToken = requestStartedPRRefreshState - ? { - sequence: get().prRefreshSequences[cacheKey] ?? 0, - status: requestStartedPRRefreshState.status, - updatedAt: requestStartedPRRefreshState.updatedAt - } - : null + const requestStartedPRRefreshToken = buildGitHubPRRefreshStateClearToken( + requestStartedPRRefreshState, + get().prRefreshSequences, + cacheKey + ) prRequestGenerations.set(cacheKey, generation) const request = (async () => {