feat: save current episode progress on transition
This commit is contained in:
@@ -100,10 +100,7 @@ const scheduleProgressSave = (): void => {
|
|||||||
}, 30_000);
|
}, 30_000);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/** Saves the current episode before an asynchronous or fallback episode transition. */
|
||||||
* Records episode transition (clicked external link to next episode). Uses beacon for reliability
|
|
||||||
* on page unload.
|
|
||||||
*/
|
|
||||||
export const markEpisodeTransition = (episodeNumber: number): void => {
|
export const markEpisodeTransition = (episodeNumber: number): void => {
|
||||||
if (!state.episode.malID || !episodeNumber) {
|
if (!state.episode.malID || !episodeNumber) {
|
||||||
return;
|
return;
|
||||||
@@ -112,8 +109,17 @@ export const markEpisodeTransition = (episodeNumber: number): void => {
|
|||||||
window.clearTimeout(state.timers.progressSaveTimer);
|
window.clearTimeout(state.timers.progressSaveTimer);
|
||||||
state.timers.progressSaveTimer = undefined;
|
state.timers.progressSaveTimer = undefined;
|
||||||
}
|
}
|
||||||
|
const alreadyTransitioning = state.episode.transitionEpisode !== null;
|
||||||
state.episode.transitionEpisode = episodeNumber;
|
state.episode.transitionEpisode = episodeNumber;
|
||||||
const payload = buildPayload(episodeNumber, 0);
|
if (alreadyTransitioning || state.episode.endedProgressSaved) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const currentEpisode = Number.parseInt(state.episode.current, 10);
|
||||||
|
const progressSeconds = snapToEnd(currentProgressTime());
|
||||||
|
if (!currentEpisode || progressSeconds < 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const payload = buildPayload(currentEpisode, progressSeconds);
|
||||||
// beacon falls back to fetch with keepalive
|
// beacon falls back to fetch with keepalive
|
||||||
if (!sendBeacon(payload)) {
|
if (!sendBeacon(payload)) {
|
||||||
fetch("/api/watch-progress", {
|
fetch("/api/watch-progress", {
|
||||||
@@ -125,6 +131,7 @@ export const markEpisodeTransition = (episodeNumber: number): void => {
|
|||||||
console.debug("failed to save progress:", error);
|
console.debug("failed to save progress:", error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
state.episode.lastSavedProgress = { episode: state.episode.current, seconds: progressSeconds };
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Sets up progress save on timeupdate, pause, mouseup (scrub end), and beforeunload. */
|
/** Sets up progress save on timeupdate, pause, mouseup (scrub end), and beforeunload. */
|
||||||
|
|||||||
Reference in New Issue
Block a user