diff --git a/src/design-system/providers/GlobalFilterProvider.tsx b/src/design-system/providers/GlobalFilterProvider.tsx index 618f6a8..ba22d15 100644 --- a/src/design-system/providers/GlobalFilterProvider.tsx +++ b/src/design-system/providers/GlobalFilterProvider.tsx @@ -12,6 +12,7 @@ export type ExchangeStatus = 'completed' | 'failed' | 'running' | 'warning' interface GlobalFilterContextValue { timeRange: TimeRange setTimeRange: (range: TimeRange) => void + refreshTimeRange: () => void statusFilters: Set toggleStatus: (status: ExchangeStatus) => void clearStatusFilters: () => void @@ -66,16 +67,22 @@ export function GlobalFilterProvider({ children }: { children: ReactNode }) { try { localStorage.setItem('cameleer:auto-refresh', String(enabled)) } catch {} }, []) - // Keep the time range sliding forward whenever a preset is active. - // PAUSED mode only stops query polling — the time window still advances - // so that manual refreshes and sidebar-triggered queries see current data. + // Keep the time range sliding forward when a preset is active and live useEffect(() => { - if (!timeRange.preset) return + if (!autoRefresh || !timeRange.preset) return const id = setInterval(() => { const { start, end } = computePresetRange(timeRange.preset!) setTimeRangeState({ start, end, preset: timeRange.preset }) }, 10_000) return () => clearInterval(id) + }, [autoRefresh, timeRange.preset]) + + // Recompute time range from preset on demand (for manual refresh in PAUSED mode) + const refreshTimeRange = useCallback(() => { + if (timeRange.preset) { + const { start, end } = computePresetRange(timeRange.preset) + setTimeRangeState({ start, end, preset: timeRange.preset }) + } }, [timeRange.preset]) const isInTimeRange = useCallback( @@ -92,7 +99,7 @@ export function GlobalFilterProvider({ children }: { children: ReactNode }) { return ( {children}