Address PR refresh review feedback

Co-authored-by: Orca <help@stably.ai>
This commit is contained in:
brennanb2025
2026-06-24 21:14:54 -07:00
co-authored by Orca
parent a68836bcc5
commit 93f2c18dae
3 changed files with 36 additions and 21 deletions
@@ -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, {
@@ -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' ||
+21 -8
View File
@@ -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<string, number>,
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<AppState, [], [], GitHubSlice> = (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 () => {