From 6274595fc2b7e92bf62c36a3e8411d4bfc814a1a Mon Sep 17 00:00:00 2001 From: Punyapal Shah <53343069+MrPunyapal@users.noreply.github.com> Date: Thu, 5 Nov 2026 02:06:45 +0530 Subject: [PATCH] perf: pause scheduled commit polling while hidden --- .../js/pages/scheduled-commits/index.tsx | 2 +- tests/Unit/ScheduledCommitPolling.test.tsx | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/Unit/ScheduledCommitPolling.test.tsx diff --git a/resources/js/pages/scheduled-commits/index.tsx b/resources/js/pages/scheduled-commits/index.tsx index 750e28931..349072b97 100644 --- a/resources/js/pages/scheduled-commits/index.tsx +++ b/resources/js/pages/scheduled-commits/index.tsx @@ -101,7 +101,7 @@ export default function Index({ const { start, stop } = usePoll( 30_000, backgroundPollOptions({ only: ['scheduledCommits'] }), - { autoStart: false }, + { autoStart: false, background: 'pause' }, ); useEffect(() => { diff --git a/tests/Unit/ScheduledCommitPolling.test.tsx b/tests/Unit/ScheduledCommitPolling.test.tsx new file mode 100644 index 000000000..8fc67ae39 --- /dev/null +++ b/tests/Unit/ScheduledCommitPolling.test.tsx @@ -0,0 +1,47 @@ +import assert from 'node:assert/strict'; +import type { ReloadOptions } from '@inertiajs/core'; +import type { PropsWithChildren } from 'react'; +import { renderToString } from 'react-dom/server'; +import { test, vi } from 'vite-plus/test'; + +const usePoll = vi.fn(() => ({ start: vi.fn(), stop: vi.fn() })); + +vi.doMock('@inertiajs/react', async () => ({ + ...(await vi.importActual('@inertiajs/react')), + Head: () => null, + Link: ({ children }: PropsWithChildren) => children, + usePage: () => ({ props: { auth: { user: null } } }), + usePoll, +})); +vi.doMock('@/hooks/use-realtime', () => ({ useIsListening: () => false })); +vi.doMock('@/layouts/app-layout', () => ({ + default: ({ children }: PropsWithChildren) => children, +})); + +const { default: ScheduledCommits } = + await import('../../resources/js/pages/scheduled-commits/index'); + +test('scheduled commits pause polling in hidden tabs without changing the partial reload', () => { + usePoll.mockClear(); + + renderToString( + , + ); + + assert.equal(usePoll.mock.calls.length, 1); + const [interval, reload, options] = usePoll.mock.calls[0] as unknown as [ + number, + () => ReloadOptions, + { autoStart: boolean; background: string }, + ]; + + assert.equal(interval, 30_000); + assert.deepEqual(reload().only, ['scheduledCommits']); + assert.deepEqual(options, { autoStart: false, background: 'pause' }); +});