Skip to content

Commit 2fff7c4

Browse files
Fix auto-refresh on workflow details page (#671)
1 parent 9cc68cd commit 2fff7c4

File tree

6 files changed

+17
-19
lines changed

6 files changed

+17
-19
lines changed

src/ui/src/components/refresh/use-refresh-control-state.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// SPDX-License-Identifier: Apache-2.0
1616

1717
import { useCallback } from "react";
18+
import { useInterval } from "usehooks-ts";
1819
import { useMounted } from "@/hooks/use-mounted";
1920
import { useRefreshAnimation } from "@/components/refresh/use-refresh-animation";
2021
import { formatInterval } from "@/lib/format-interval";
@@ -40,6 +41,10 @@ export function useRefreshControlState(props: RefreshControlProps) {
4041
[setInterval],
4142
);
4243

44+
// Auto-refresh timer: fires onRefresh at the selected interval.
45+
// useInterval handles callback stability internally and accepts null to pause.
46+
useInterval(onRefresh, mounted && isAutoRefreshActive ? interval : null);
47+
4348
return {
4449
mounted,
4550
clickCount,

src/ui/src/components/refresh/vertical-refresh-control.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,13 @@ export function VerticalRefreshControl(props: RefreshControlProps) {
134134
<span className="sr-only">Refresh workflow</span>
135135
</button>
136136
</TooltipTrigger>
137-
<TooltipContent side="left">{isRefreshing ? "Refreshing..." : "Refresh workflow"}</TooltipContent>
137+
<TooltipContent side="left">
138+
{isRefreshing
139+
? "Refreshing..."
140+
: isAutoRefreshActive
141+
? `Refresh workflow (auto-refresh: ${intervalLabel})`
142+
: "Refresh workflow"}
143+
</TooltipContent>
138144
</Tooltip>
139145

140146
<DropdownMenu>

src/ui/src/features/pools/components/pools-page-content.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
"use client";
3232

33-
import { useMemo, useCallback } from "react";
33+
import { useMemo } from "react";
3434
import { InlineErrorBoundary } from "@/components/error/inline-error-boundary";
3535
import { usePage } from "@/components/chrome/page-context";
3636
import { useResultsCount } from "@/components/filter-bar/hooks/use-results-count";
@@ -106,7 +106,6 @@ export function PoolsPageContent() {
106106
} = usePoolsData({
107107
searchChips: effectiveChips,
108108
accessiblePoolNames,
109-
refetchInterval: autoRefresh.effectiveInterval,
110109
});
111110

112111
// ==========================================================================
@@ -125,14 +124,6 @@ export function PoolsPageContent() {
125124
onClosed: clearSelectedPool,
126125
});
127126

128-
// Open panel with a pool (URL-synced)
129-
const handlePoolSelect = useCallback(
130-
(poolName: string) => {
131-
setSelectedPoolName(poolName);
132-
},
133-
[setSelectedPoolName],
134-
);
135-
136127
// Results count for FilterBar display (consolidated hook)
137128
const resultsCount = useResultsCount({ total, filteredTotal, hasActiveFilters });
138129

@@ -203,7 +194,7 @@ export function PoolsPageContent() {
203194
isLoading={isLoading}
204195
error={error ?? undefined}
205196
onRetry={refetch}
206-
onPoolSelect={handlePoolSelect}
197+
onPoolSelect={setSelectedPoolName}
207198
selectedPoolName={selectedPoolName}
208199
onSearchChipsChange={handleChipsChange}
209200
/>
@@ -236,7 +227,7 @@ export function PoolsPageContent() {
236227
<PanelContent
237228
pool={selectedPool}
238229
sharingGroups={sharingGroups}
239-
onPoolSelect={handlePoolSelect}
230+
onPoolSelect={setSelectedPoolName}
240231
selectedPlatform={selectedPlatform}
241232
onPlatformSelect={setSelectedPlatform}
242233
/>

src/ui/src/features/workflows/detail/components/workflow-detail-content.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
"use client";
4949

5050
import { usePage } from "@/components/chrome/page-context";
51-
import { WorkflowDetailInnerWithProvider } from "@/features/workflows/detail/components/workflow-detail-inner";
51+
import { WorkflowDetailInner } from "@/features/workflows/detail/components/workflow-detail-inner";
5252

5353
// =============================================================================
5454
// Direct Import for ReactFlow
@@ -115,7 +115,7 @@ export function WorkflowDetailContent({ name, initialView }: WorkflowDetailConte
115115
// No top-level boundary - components handle their own errors for granular failure isolation
116116
return (
117117
<div className="h-full">
118-
<WorkflowDetailInnerWithProvider
118+
<WorkflowDetailInner
119119
name={name}
120120
initialView={initialView}
121121
/>

src/ui/src/features/workflows/detail/components/workflow-detail-inner.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ function WorkflowDetailContent({ name, initialView }: WorkflowDetailInnerProps)
149149

150150
const { workflow, groupsWithLayout, isLoading, error, refetch, isNotFound, isTerminal } = useWorkflowDetail({
151151
name,
152-
refetchInterval: autoRefresh.effectiveInterval,
153152
});
154153

155154
// Terminal workflows force interval to 0 (display only - polling already stopped)
@@ -483,5 +482,3 @@ function WorkflowDetailContent({ name, initialView }: WorkflowDetailInnerProps)
483482
</ShellProvider>
484483
);
485484
}
486-
487-
export { WorkflowDetailInner as WorkflowDetailInnerWithProvider };

src/ui/src/features/workflows/list/components/workflows-page-content.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ export function WorkflowsPageContent({ initialUsername }: WorkflowsPageContentPr
7373
searchChips: effectiveChips,
7474
showAllUsers: optOut,
7575
sortDirection,
76-
refetchInterval: autoRefresh.effectiveInterval,
7776
});
7877

7978
const resultsCount = useResultsCount({ total, filteredTotal, hasActiveFilters });

0 commit comments

Comments
 (0)