diff --git a/frontend/src/composables/useAutoRefresh.ts b/frontend/src/composables/useAutoRefresh.ts index 519d37cc50..b191dea4f8 100644 --- a/frontend/src/composables/useAutoRefresh.ts +++ b/frontend/src/composables/useAutoRefresh.ts @@ -4,6 +4,7 @@ export interface UseAutoRefreshOptions { storageKey: string intervals?: readonly number[] defaultInterval?: number + defaultEnabled?: boolean onRefresh: () => Promise | void /** Skip tick when this returns true (e.g. modal open, document hidden). */ shouldPause?: () => boolean @@ -18,7 +19,7 @@ export function useAutoRefresh(options: UseAutoRefreshOptions) { shouldPause, } = options - const enabled = ref(false) + const enabled = ref(options.defaultEnabled ?? false) const intervalSeconds = ref(defaultInterval ?? intervals[intervals.length - 1]) const countdown = ref(0) const fetching = ref(false) diff --git a/frontend/src/views/user/ChannelStatusV1View.vue b/frontend/src/views/user/ChannelStatusV1View.vue index 8c8ad058ee..041650c6c1 100644 --- a/frontend/src/views/user/ChannelStatusV1View.vue +++ b/frontend/src/views/user/ChannelStatusV1View.vue @@ -66,6 +66,7 @@ const autoRefresh = useAutoRefresh({ storageKey: 'channel-status-auto-refresh', intervals: [30, 60, 120] as const, defaultInterval: DEFAULT_INTERVAL_SECONDS, + defaultEnabled: true, onRefresh: () => reload(true), shouldPause: () => document.hidden || loading.value, }) @@ -162,7 +163,7 @@ watch( onMounted(() => { void reload(false) if (appStore.cachedPublicSettings?.channel_monitor_enabled !== false) { - autoRefresh.setEnabled(true) + autoRefresh.setEnabled(autoRefresh.enabled.value) } }) diff --git a/frontend/src/views/user/__tests__/ChannelStatusV1View.refresh.spec.ts b/frontend/src/views/user/__tests__/ChannelStatusV1View.refresh.spec.ts index 6bed4ee6a5..6b848bfa02 100644 --- a/frontend/src/views/user/__tests__/ChannelStatusV1View.refresh.spec.ts +++ b/frontend/src/views/user/__tests__/ChannelStatusV1View.refresh.spec.ts @@ -24,6 +24,25 @@ beforeEach(() => { vi.useFakeTimers(); localStorage.clear(); list.mockReset().mo afterEach(() => { wrapper?.unmount(); vi.useRealTimers(); localStorage.clear() }) describe('channel monitor refresh interval', () => { + it('keeps automatic refresh disabled after reopening the page', async () => { + wrapper = mountView(); await flushPromises() + await wrapper.get('.disable').trigger('click') + wrapper.unmount() + wrapper = mountView(); await flushPromises() + const calls = list.mock.calls.length + await vi.advanceTimersByTimeAsync(240000) + expect(list).toHaveBeenCalledTimes(calls) + expect(JSON.parse(localStorage.getItem('channel-status-auto-refresh')!).enabled).toBe(false) + await wrapper.get('.refresh').trigger('click'); await flushPromises() + expect(list).toHaveBeenCalledTimes(calls + 1) + }) + + it('starts automatic refresh for a first visit', async () => { + wrapper = mountView(); await flushPromises() + await vi.advanceTimersByTimeAsync(120000) + expect(list.mock.calls.length).toBeGreaterThan(1) + }) + it('refreshes at the selected interval on successive automatic refreshes', async () => { wrapper = mountView(); await flushPromises() await wrapper.get('.interval').trigger('click')