feat: use loading state machine in episode navigation

This commit is contained in:
2026-07-06 07:09:53 +02:00
parent 6b6256b839
commit 7215b1a4ee

View File

@@ -1,3 +1,4 @@
import { setPlayerLoadState } from "../loading";
import { hydrateAlternateMode, updateModeButtons } from "../mode"; import { hydrateAlternateMode, updateModeButtons } from "../mode";
import { markEpisodeTransition } from "../progress"; import { markEpisodeTransition } from "../progress";
import { updateQualityOptions } from "../quality"; import { updateQualityOptions } from "../quality";
@@ -36,7 +37,6 @@ type TransitionOptions = {
}; };
type ActiveTransition = { type ActiveTransition = {
autoplay: boolean;
controller: AbortController; controller: AbortController;
fallbackHref: string; fallbackHref: string;
id: number; id: number;
@@ -297,13 +297,6 @@ const updateHistory = (episode: number, mode: TransitionHistory): void => {
history.pushState(null, "", href); history.pushState(null, "", href);
}; };
const showLoader = (): void => {
const loading = state.elements.container.querySelector("[data-loading]") as HTMLElement | null;
if (loading) {
loading.style.display = "flex";
}
};
const finishTransition = (transition: ActiveTransition): void => { const finishTransition = (transition: ActiveTransition): void => {
if (activeTransition?.id !== transition.id) { if (activeTransition?.id !== transition.id) {
return; return;
@@ -332,10 +325,11 @@ const monitorMediaReady = (transition: ActiveTransition): void => {
return; return;
} }
if (retried) { if (retried) {
fallbackToEpisodeNavigation(transition.fallbackHref, transition.autoplay); setPlayerLoadState("unavailable");
return; return;
} }
retried = true; retried = true;
setPlayerLoadState("retrying");
fetchEpisodePayload( fetchEpisodePayload(
Number.parseInt(state.episode.current, 10), Number.parseInt(state.episode.current, 10),
state.playback.currentMode, state.playback.currentMode,
@@ -367,7 +361,7 @@ const monitorMediaReady = (transition: ActiveTransition): void => {
return; return;
} }
console.error("failed to refresh episode source:", error); console.error("failed to refresh episode source:", error);
fallbackToEpisodeNavigation(transition.fallbackHref, transition.autoplay); setPlayerLoadState("unavailable");
}); });
}; };
@@ -466,7 +460,6 @@ export const transitionToEpisode = async (
modeHydrationController?.abort(); modeHydrationController?.abort();
modeHydrationController = null; modeHydrationController = null;
const transition: ActiveTransition = { const transition: ActiveTransition = {
autoplay: options.autoplay ?? false,
controller: new AbortController(), controller: new AbortController(),
fallbackHref: options.fallbackHref ?? episodeHref(episode), fallbackHref: options.fallbackHref ?? episodeHref(episode),
id: ++transitionID, id: ++transitionID,
@@ -474,7 +467,7 @@ export const transitionToEpisode = async (
}; };
activeTransition = transition; activeTransition = transition;
markEpisodeTransition(episode); markEpisodeTransition(episode);
showLoader(); setPlayerLoadState("resolving_source");
try { try {
const requestedMode = state.playback.currentMode; const requestedMode = state.playback.currentMode;