fix(ui): don't resume paused music on Media Session pause action

The player library maps both the Media Session "play" and "pause"
actions to togglePlay. When the OS sends "pause" to an already-paused
player (e.g. macOS when a Zoom or phone call starts), playback resumes.
Re-register both handlers so each only toggles in the matching state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Alanna 2026-10-05 10:09:37 -04:00
commit b36ed26c3c

View file

@ -424,6 +424,21 @@ const Player = () => {
}
}, [isMobilePlayer, audioInstance])
// The player library maps both the Media Session "play" and "pause" actions
// to togglePlay, so an OS "pause" (e.g. when a call starts) resumes paused
// music. Re-register them so each only acts in the matching state. This runs
// after every player update, as the library re-registers its own handlers.
useEffect(() => {
if (!audioInstance || !('mediaSession' in navigator)) return
if (playerState.current?.isRadio) return
navigator.mediaSession.setActionHandler('play', () => {
if (audioInstance.paused) audioInstance.togglePlay()
})
navigator.mediaSession.setActionHandler('pause', () => {
if (!audioInstance.paused) audioInstance.togglePlay()
})
}, [audioInstance, playerState])
// Report every seek (including programmatic ones the library does not surface
// via onAudioSeeked, e.g. restartCurrentOnPrev). Debounce coalesces drag
// bursts into one report at the final position.