diff --git a/packages/core/src/dom/store/features/playback.ts b/packages/core/src/dom/store/features/playback.ts index 7fe14bdb..41bd3553 100644 --- a/packages/core/src/dom/store/features/playback.ts +++ b/packages/core/src/dom/store/features/playback.ts @@ -37,5 +37,6 @@ export const playbackFeature = definePlayerFeature({ listen(media, 'ended', sync, { signal }); listen(media, 'playing', sync, { signal }); listen(media, 'waiting', sync, { signal }); + listen(media, 'seeked', sync, { signal }); }, }); diff --git a/packages/core/src/dom/store/features/tests/playback.test.ts b/packages/core/src/dom/store/features/tests/playback.test.ts index c181bff9..171783bd 100644 --- a/packages/core/src/dom/store/features/tests/playback.test.ts +++ b/packages/core/src/dom/store/features/tests/playback.test.ts @@ -104,6 +104,21 @@ describe('playbackFeature', () => { expect(store.state.ended).toBe(true); }); + it('clears ended state on seeked event', () => { + const video = createMockVideo({ ended: true }); + + const store = createStore()(playbackFeature); + store.attach({ media: video, container: null }); + + expect(store.state.ended).toBe(true); + + // Simulate seeking: browser clears ended when user seeks + Object.defineProperty(video, 'ended', { value: false, writable: false, configurable: true }); + video.dispatchEvent(new Event('seeked')); + + expect(store.state.ended).toBe(false); + }); + it('stops listening when store is destroyed', () => { const video = createMockVideo({});