Skip to content

Commit 148a7bc

Browse files
authored
fix: bug with detail page stale data (#120)
1 parent 54601c0 commit 148a7bc

8 files changed

Lines changed: 16 additions & 1 deletion

src/components/ResourceDetailPage.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export function ResourceDetailPage<T>({
5757
buildDetailLines,
5858
additionalContent,
5959
pollResource,
60+
onPollUpdate,
6061
pollInterval = 3000,
6162
}: ResourceDetailPageProps<T>) {
6263
const isMounted = React.useRef(true);
@@ -74,6 +75,11 @@ export function ResourceDetailPage<T>({
7475
const [currentResource, setCurrentResource] = React.useState(initialResource);
7576
const [copyStatus, setCopyStatus] = React.useState<string | null>(null);
7677

78+
// Keep local resource in sync when parent provides fresher data.
79+
React.useEffect(() => {
80+
setCurrentResource(initialResource);
81+
}, [initialResource]);
82+
7783
// Copy to clipboard with status feedback
7884
const handleCopy = React.useCallback(async (text: string) => {
7985
const status = await copyToClipboard(text);
@@ -114,6 +120,7 @@ export function ResourceDetailPage<T>({
114120
const updatedResource = await pollResource();
115121
if (isMounted.current) {
116122
setCurrentResource(updatedResource);
123+
onPollUpdate?.(updatedResource);
117124
}
118125
} catch {
119126
// Silently ignore polling errors
@@ -122,7 +129,7 @@ export function ResourceDetailPage<T>({
122129
}, pollInterval);
123130

124131
return () => clearInterval(interval);
125-
}, [pollResource, pollInterval, showDetailedInfo]);
132+
}, [pollResource, pollInterval, showDetailedInfo, onPollUpdate]);
126133

127134
// Calculate viewport for detailed info view
128135
const detailViewport = useViewportHeight({ overhead: 18, minHeight: 10 });

src/components/resourceDetailTypes.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ export interface ResourceDetailPageProps<T> {
113113
additionalContent?: React.ReactNode;
114114
/** Optional: Polling function to refresh resource data */
115115
pollResource?: () => Promise<T>;
116+
/** Optional: Called whenever polling returns a fresh resource */
117+
onPollUpdate?: (resource: T) => void;
116118
/** Polling interval in ms (default: 3000) */
117119
pollInterval?: number;
118120
}

src/screens/BenchmarkJobDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,7 @@ export function BenchmarkJobDetailScreen({
946946
onBack={goBack}
947947
buildDetailLines={buildDetailLines}
948948
pollResource={isRunning ? pollJob : undefined}
949+
onPollUpdate={setFetchedJob}
949950
breadcrumbPrefix={[{ label: "Home" }]}
950951
/>
951952
);

src/screens/BenchmarkRunDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,7 @@ export function BenchmarkRunDetailScreen({
662662
onBack={goBack}
663663
buildDetailLines={buildDetailLines}
664664
pollResource={isRunning ? pollRun : undefined}
665+
onPollUpdate={setFetchedRun}
665666
breadcrumbPrefix={[{ label: "Home" }, { label: "Benchmarks" }]}
666667
/>
667668
);

src/screens/BlueprintDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,7 @@ export function BlueprintDetailScreen({
571571
? pollBlueprint
572572
: undefined
573573
}
574+
onPollUpdate={setFetchedBlueprint}
574575
/>
575576
);
576577
}

src/screens/ObjectDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ export function ObjectDetailScreen({ objectId }: ObjectDetailScreenProps) {
625625
onBack={goBack}
626626
buildDetailLines={buildDetailLines}
627627
pollResource={pollObject}
628+
onPollUpdate={setFetchedObject}
628629
/>
629630
);
630631
}

src/screens/ScenarioRunDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ export function ScenarioRunDetailScreen({
370370
onBack={goBack}
371371
buildDetailLines={buildDetailLines}
372372
pollResource={isRunning ? pollRun : undefined}
373+
onPollUpdate={setFetchedRun}
373374
breadcrumbPrefix={breadcrumbPrefix}
374375
/>
375376
);

src/screens/SnapshotDetailScreen.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,7 @@ export function SnapshotDetailScreen({
383383
onBack={goBack}
384384
buildDetailLines={buildDetailLines}
385385
pollResource={snapshot.status === "pending" ? pollSnapshot : undefined}
386+
onPollUpdate={setFetchedSnapshot}
386387
/>
387388
);
388389
}

0 commit comments

Comments
 (0)