fix(monitor): preserve the saved auto-refresh preference

This commit is contained in:
chihao.ou
2026-09-20 18:07:39 +08:00
parent d2e319b2a1
commit 319299519b
3 changed files with 23 additions and 2 deletions
+2 -1
View File
@@ -4,6 +4,7 @@ export interface UseAutoRefreshOptions {
storageKey: string
intervals?: readonly number[]
defaultInterval?: number
defaultEnabled?: boolean
onRefresh: () => Promise<void> | 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)
@@ -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)
}
})
@@ -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')