feat: use loading state machine in episode navigation
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user