refactor(player): E.9 — extract scheduled pause/resume timer lifecycle (#572)

Two timer mutables (`scheduledPauseTimer`, `scheduledResumeTimer`) plus
the three clear helpers move into `src/store/scheduleTimers.ts`. The
module also gains `schedulePauseTimer(delayMs, onFire)` /
`scheduleResumeTimer(delayMs, onFire)` so callers no longer need to do
the `window.setTimeout(...) as unknown as number` cast or null the
handle inside the fire callback — the module auto-clears its own
reference before invoking the user callback.

`schedulePauseIn` / `scheduleResumeIn` store actions are now four lines
shorter each and don't reach into the timer mutables.

playerStore 3389 → 3369 LOC. 9 focused tests cover schedule + fire +
clear + replace-on-reschedule + independence between the two timers.
This commit is contained in:
Frank Stellmacher
2026-05-12 14:01:36 +02:00
committed by GitHub
parent 18b88e3ae0
commit 89bf7e2364
3 changed files with 154 additions and 31 deletions
+50
View File
@@ -0,0 +1,50 @@
/**
* Deferred pause / resume timers — back the `schedulePauseIn` /
* `scheduleResumeIn` store actions. Encapsulated so the timer handles
* never leak: every public API either schedules + auto-clears on fire,
* or clears an outstanding timer outright. Cleared on stop, new track,
* manual pause/resume.
*/
let scheduledPauseTimer: number | null = null;
let scheduledResumeTimer: number | null = null;
export function schedulePauseTimer(delayMs: number, onFire: () => void): void {
clearScheduledPauseTimers();
scheduledPauseTimer = window.setTimeout(() => {
scheduledPauseTimer = null;
onFire();
}, delayMs) as unknown as number;
}
export function scheduleResumeTimer(delayMs: number, onFire: () => void): void {
clearScheduledResumeTimers();
scheduledResumeTimer = window.setTimeout(() => {
scheduledResumeTimer = null;
onFire();
}, delayMs) as unknown as number;
}
export function clearScheduledPauseTimers(): void {
if (scheduledPauseTimer != null) {
window.clearTimeout(scheduledPauseTimer);
scheduledPauseTimer = null;
}
}
export function clearScheduledResumeTimers(): void {
if (scheduledResumeTimer != null) {
window.clearTimeout(scheduledResumeTimer);
scheduledResumeTimer = null;
}
}
export function clearAllPlaybackScheduleTimers(): void {
clearScheduledPauseTimers();
clearScheduledResumeTimers();
}
/** Test-only: clear both handles without invoking the timer callbacks. */
export function _resetScheduleTimersForTest(): void {
clearAllPlaybackScheduleTimers();
}