From fec7190dd49a6328ddd0d4a16c16e655c85dec10 Mon Sep 17 00:00:00 2001 From: 4gray Date: Thu, 16 Jul 2026 17:36:08 +0200 Subject: [PATCH] fix(player-controls): block toggles while stalled --- .../src/lib/player-controls/controls-view-model.ts | 8 ++++++-- .../player-controls.component.interactions.spec.ts | 12 ++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/libs/ui/playback/src/lib/player-controls/controls-view-model.ts b/libs/ui/playback/src/lib/player-controls/controls-view-model.ts index 9c3c74e9c..c4dcf3ff5 100644 --- a/libs/ui/playback/src/lib/player-controls/controls-view-model.ts +++ b/libs/ui/playback/src/lib/player-controls/controls-view-model.ts @@ -39,8 +39,12 @@ export function createControlsViewModel(deps: ControlsViewModelDeps) { }); const isPlaying = computed(() => state().status === 'playing'); const canTogglePlay = computed(() => { - const status = state().status; - return status !== 'loading' && status !== 'error'; + const currentState = state(); + return ( + !currentState.stalled && + currentState.status !== 'loading' && + currentState.status !== 'error' + ); }); const hasAudioTracks = computed( diff --git a/libs/ui/playback/src/lib/player-controls/player-controls.component.interactions.spec.ts b/libs/ui/playback/src/lib/player-controls/player-controls.component.interactions.spec.ts index 3bc3f388f..70a1f8917 100644 --- a/libs/ui/playback/src/lib/player-controls/player-controls.component.interactions.spec.ts +++ b/libs/ui/playback/src/lib/player-controls/player-controls.component.interactions.spec.ts @@ -357,6 +357,18 @@ describe('PlayerControlsComponent interactions', () => { expect(component.controlsAreVisible()).toBe(true); }); + it('does not toggle playback from the surface while stalled', () => { + const surface = document.createElement('div'); + fixture.componentRef.setInput('playerSurface', surface); + setState({ status: 'playing', stalled: true }); + fixture.detectChanges(); + + surface.dispatchEvent(new MouseEvent('click', { bubbles: true })); + jest.advanceTimersByTime(250); + + expect(fake.commands.togglePlay).not.toHaveBeenCalled(); + }); + it('re-reveals hidden controls on reveal()', () => { jest.advanceTimersByTime(10000); fixture.detectChanges();