From 4de9b21ff7399763ef4f161801d4dbc5738349d3 Mon Sep 17 00:00:00 2001 From: York Date: Thu, 16 Jul 2026 12:45:10 +0800 Subject: [PATCH] fix: sleep timer countdown (#2233) (#2235) --- .../player/components/sleep-timer-button.tsx | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/renderer/features/player/components/sleep-timer-button.tsx b/src/renderer/features/player/components/sleep-timer-button.tsx index b116be291..10416cbde 100644 --- a/src/renderer/features/player/components/sleep-timer-button.tsx +++ b/src/renderer/features/player/components/sleep-timer-button.tsx @@ -107,34 +107,39 @@ const useSleepTimer = () => { const status = usePlayerStatus(); - const handleOnPlayerProgress = useCallback(() => { - if (!active) { - return; + useEffect(() => { + if (!active || mode !== 'timed' || status !== PlayerStatus.PLAYING) { + return undefined; } - if (status !== PlayerStatus.PLAYING) { - return; - } + let lastTick = Date.now(); + const interval = window.setInterval(() => { + const now = Date.now(); + const elapsedSeconds = Math.floor((now - lastTick) / 1000); - // Count down in timed mode - if (mode === 'timed') { + if (elapsedSeconds < 1) { + return; + } + + lastTick += elapsedSeconds * 1000; const remaining = useSleepTimerStore.getState().remaining; - if (remaining <= 0) { + if (remaining <= elapsedSeconds) { cancelTimer(); mediaPauseRef.current(); } else { - setRemaining(Math.max(0, remaining - 1)); + setRemaining(remaining - elapsedSeconds); } - } + }, 1000); + + return () => window.clearInterval(interval); }, [active, cancelTimer, mode, setRemaining, status]); usePlayerEvents( { onCurrentSongChange: handleOnCurrentSongChange, - onPlayerProgress: handleOnPlayerProgress, }, - [handleOnCurrentSongChange, handleOnPlayerProgress], + [handleOnCurrentSongChange], ); // End-of-song mode: set the pauseOnNextSongEnd flag so that