diff --git a/ui/src/lib/components/AudioPlayer.svelte b/ui/src/lib/components/AudioPlayer.svelte index e6ad0be..ac1a244 100644 --- a/ui/src/lib/components/AudioPlayer.svelte +++ b/ui/src/lib/components/AudioPlayer.svelte @@ -46,8 +46,13 @@ // Keep nextChapter in the store so the layout's onended can navigate. // Run as an effect so it stays in sync if the prop ever changes. + // On unmount, clear it so a stale value can't trigger navigation after + // the user leaves the chapter page. $effect(() => { audioStore.nextChapter = nextChapter ?? null; + return () => { + audioStore.nextChapter = null; + }; }); // Auto-start: if the layout navigated here via auto-next, kick off playback. @@ -128,7 +133,7 @@ audioStore.bookTitle = bookTitle; audioStore.voice = voice; audioStore.speed = speed; - audioStore.nextChapter = nextChapter ?? null; + // nextChapter is kept in sync by the $effect above — no need to write it here audioStore.status = 'loading'; audioStore.errorMsg = ''; diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte index 20ca88f..db8360c 100644 --- a/ui/src/routes/+layout.svelte +++ b/ui/src/routes/+layout.svelte @@ -179,9 +179,11 @@ audioStore.isPlaying = false; saveAudioTime(); if (audioStore.autoNext && audioStore.nextChapter !== null && audioStore.slug) { - audioStore.autoStartPending = true; - goto(`/books/${audioStore.slug}/chapters/${audioStore.nextChapter}`); - } + audioStore.autoStartPending = true; + goto(`/books/${audioStore.slug}/chapters/${audioStore.nextChapter}`).catch(() => { + audioStore.autoStartPending = false; + }); + } }} preload="metadata" style="display:none"