From e9189eb629d635a1eb98a9bb66579e344d39471a Mon Sep 17 00:00:00 2001 From: Anton Lantukh Date: Tue, 18 Apr 2023 11:47:46 +0200 Subject: [PATCH] feat(series): support series features - support sorting --- .../MediaSeriesEpisode/MediaSeriesEpisode.tsx | 2 +- src/utils/series.ts | 35 ++++++++++++++----- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/pages/ScreenRouting/mediaScreens/MediaSeriesEpisode/MediaSeriesEpisode.tsx b/src/pages/ScreenRouting/mediaScreens/MediaSeriesEpisode/MediaSeriesEpisode.tsx index e7fbbe16e..6eb0e3a9e 100644 --- a/src/pages/ScreenRouting/mediaScreens/MediaSeriesEpisode/MediaSeriesEpisode.tsx +++ b/src/pages/ScreenRouting/mediaScreens/MediaSeriesEpisode/MediaSeriesEpisode.tsx @@ -67,7 +67,7 @@ const MediaSeriesEpisode: ScreenComponent = ({ data }) => { const isLoading = seriesIdLoading || isPlaylistLoading; const [seasonFilter, setSeasonFilter] = useState(episodeItem?.seasonNumber || '1'); - const filters = getFiltersFromSeries(seriesPlaylist); + const filters = getFiltersFromSeries(seriesPlaylist, series); const filteredPlaylist = useMemo(() => filterSeries(seriesPlaylist, seasonFilter), [seriesPlaylist, seasonFilter]); // Watch history diff --git a/src/utils/series.ts b/src/utils/series.ts index 7ab5163f3..ec47f322b 100644 --- a/src/utils/series.ts +++ b/src/utils/series.ts @@ -1,11 +1,21 @@ import type { Playlist, PlaylistItem } from '#types/playlist'; import type { Season, Series } from '#types/series'; -export const getFiltersFromSeries = (playlist: Playlist): string[] => - playlist.playlist +/** + * Get an array of options for a season filter + */ +export const getFiltersFromSeries = (playlist: Playlist, series: Series | undefined): string[] => { + // For new series flow we should keep sorting set for series seasons, the order in the array of seasons can be different + if (series && 'seasons' in series) { + return (series?.seasons || []).map((el) => String(el.season_number)); + } + + // Old series doesn't have sorting supported and needs to be sorted manually + return playlist.playlist .reduce((filters: string[], item) => (item.seasonNumber && filters.includes(item.seasonNumber) ? filters : filters.concat(item.seasonNumber || '')), []) .slice() .sort(); +}; export const filterSeries = (playlist: Playlist, filter: string) => { if (!filter) return playlist; @@ -60,15 +70,24 @@ export const enrichMediaItems = (series: Series | undefined, mediaItems: { [key: if (series) { if ('seasons' in series) { return series.seasons.flatMap((season: Season) => - season.episodes.map((episode) => ({ - ...mediaItems[episode.media_id], - seasonNumber: String(season.season_number), - episodeNumber: String(episode.episode_number), - })), + season.episodes.map((episode) => { + const item = mediaItems[episode.media_id]; + + item.seasonNumber = String(season.season_number); + item.episodeNumber = String(episode.episode_number); + + return item; + }), ); } - return series.episodes.map((episode) => ({ ...mediaItems[episode.media_id], seasonNumber: '1', episodeNumber: String(episode.episode_number) })); + return series.episodes.map((episode) => { + const item = mediaItems[episode.media_id]; + item.seasonNumber = '0'; + item.episodeNumber = String(episode.episode_number); + + return item; + }); } return [];