diff --git a/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx b/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx
index c1c4b3942804..f19e41599043 100644
--- a/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx
+++ b/apps/web/src/components/pullRequest/PullRequestDetailPanel.tsx
@@ -849,6 +849,9 @@ export function PullRequestDetailPanel({
// and at worst answer from it.
const invalidate = useAtomCommand(pullRequestEnvironment.invalidate, { reportFailure: false });
const [isInvalidating, setIsInvalidating] = useState(false);
+ // One word for "the host is being asked again", whichever of the two halves is in flight:
+ // the invalidation round trip, then the detail read it kicks off.
+ const refreshing = isInvalidating || detailQuery.isPending;
const refreshFromHost = useCallback(async () => {
setIsInvalidating(true);
try {
@@ -1987,18 +1990,29 @@ export function PullRequestDetailPanel({
}
>
-
+ {/* The refresh lives in this menu, so while one runs the trigger wears
+ the spinning glyph in place of the dots: the reader sees the panel
+ is fetching without a control appearing or the row shifting. */}
+ {refreshing ? (
+
+ ) : (
+
+ )}
}
/>
- More pull request actions
+
+ {refreshing ? "Refreshing pull request" : "More pull request actions"}
+
-