From f4dd6f95a4d76c7c523347d2f72f52d8589b777d Mon Sep 17 00:00:00 2001 From: Joao Melo Date: Mon, 25 Mar 2024 17:59:11 +0000 Subject: [PATCH] Fix #241: Last episode completed does not save After ending episode or clicking on next episode, store state wasn't updating. Changed NextEpisodeButton and which series episodes are displayed --- .../player/atoms/NextEpisodeButton.tsx | 16 +++++++++++++++- src/stores/progress/utils.ts | 13 ++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/components/player/atoms/NextEpisodeButton.tsx b/src/components/player/atoms/NextEpisodeButton.tsx index caaf7ef9..906b6829 100644 --- a/src/components/player/atoms/NextEpisodeButton.tsx +++ b/src/components/player/atoms/NextEpisodeButton.tsx @@ -7,6 +7,7 @@ import { usePlayerMeta } from "@/components/player/hooks/usePlayerMeta"; import { Transition } from "@/components/utils/Transition"; import { PlayerMeta } from "@/stores/player/slices/source"; import { usePlayerStore } from "@/stores/player/store"; +import { useProgressStore } from "@/stores/progress"; function shouldShowNextEpisodeButton( time: number, @@ -55,6 +56,7 @@ export function NextEpisodeButton(props: { const setShouldStartFromBeginning = usePlayerStore( (s) => s.setShouldStartFromBeginning, ); + const updateItem = useProgressStore((s) => s.updateItem); let show = false; if (showingState === "always") show = true; @@ -79,7 +81,19 @@ export function NextEpisodeButton(props: { setShouldStartFromBeginning(true); setDirectMeta(metaCopy); props.onChange?.(metaCopy); - }, [setDirectMeta, nextEp, meta, props, setShouldStartFromBeginning]); + const defaultProgress = { duration: 0, watched: 0 }; + updateItem({ + meta: metaCopy, + progress: defaultProgress, + }); + }, [ + setDirectMeta, + nextEp, + meta, + props, + setShouldStartFromBeginning, + updateItem, + ]); if (!meta?.episode || !nextEp) return null; if (metaType !== "show") return null; diff --git a/src/stores/progress/utils.ts b/src/stores/progress/utils.ts index 9a439141..6ea09462 100644 --- a/src/stores/progress/utils.ts +++ b/src/stores/progress/utils.ts @@ -46,6 +46,15 @@ function progressIsAcceptableRange(duration: number, watched: number): boolean { return true; } +function isFirstEpisodeOfShow( + item: ProgressMediaItem, + episode: ProgressEpisodeItem, +): boolean { + const seasonId = episode.seasonId; + const season = item.seasons[seasonId]; + return season.number === 1 && episode.number === 1; +} + export function shouldShowProgress( item: ProgressMediaItem, ): ShowProgressResult { @@ -66,8 +75,10 @@ export function shouldShowProgress( .sort((a, b) => b.updatedAt - a.updatedAt) .filter( (epi) => - !progressIsNotStarted(epi.progress.duration, epi.progress.watched), + !progressIsNotStarted(epi.progress.duration, epi.progress.watched) || + !isFirstEpisodeOfShow(item, epi), )[0]; + const season = item.seasons[ep?.seasonId]; if (!ep || !season) return {