From f40ad565be09098a171cae80172717dad6a10a87 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 27 Sep 2020 16:07:34 +0200
Subject: [PATCH] Minor bugfixes

---
 src/api/models/Episode.ts       |  4 ++--
 src/api/models/dto/TitleMeta.ts |  4 ++--
 src/routes/main/MainPage.tsx    | 40 ++++++++++++++++++++++++++++++---
 src/routes/player/Player.tsx    |  3 ++-
 4 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/src/api/models/Episode.ts b/src/api/models/Episode.ts
index 4afedae..2463d61 100644
--- a/src/api/models/Episode.ts
+++ b/src/api/models/Episode.ts
@@ -1,8 +1,8 @@
 import {Title} from "./Title";
 
 export interface Episode {
-    seasonNumber: string | null,
-    episodeNumber: string | null,
+    season: string | null,
+    episode: string | null,
     airDate: string | null,
     title: Title
 }
diff --git a/src/api/models/dto/TitleMeta.ts b/src/api/models/dto/TitleMeta.ts
index d81fb59..a6883fb 100644
--- a/src/api/models/dto/TitleMeta.ts
+++ b/src/api/models/dto/TitleMeta.ts
@@ -1,7 +1,7 @@
+import {Episode} from "../Episode";
 import {Title} from "../Title";
 
 export interface TitleMeta {
     title: Title,
-    show: Title | null,
-    episodes: Title[],
+    show: Episode | null,
 }
diff --git a/src/routes/main/MainPage.tsx b/src/routes/main/MainPage.tsx
index e02075f..5b3d18a 100644
--- a/src/routes/main/MainPage.tsx
+++ b/src/routes/main/MainPage.tsx
@@ -2,6 +2,7 @@ import React, {useEffect, useState} from "react";
 import {createUseStyles} from "react-jss";
 import {Link} from "react-router-dom";
 import {useApiClient} from "../../api/ApiClientContext";
+import {Episode} from "../../api/models/Episode";
 import {getLocalizedDescription, getLocalizedName, getLocalizedRating, Title} from "../../api/models/Title";
 import {Locale} from "../../util/locale/Locale";
 import {sortLexicallyAsc} from "../../util/sort/sortLexically";
@@ -20,6 +21,16 @@ export function MainPage(props: Props) {
         language: "en",
         region: "DE",
     };
+    const [episodes, setEpisodes] = useState<{ [key: string]: Episode[] }>({});
+    const titlesToLoad = data?.filter(it => it.kind === "show" && episodes[it.ids.uuid] === undefined);
+    useEffect(() => {
+        if (titlesToLoad?.length !== undefined && titlesToLoad.length > 0) {
+            const titlesBeingLoaded = Object.fromEntries(titlesToLoad?.map(it => [it.ids.uuid, []]) || []);
+            setEpisodes({...titlesBeingLoaded, ...episodes});
+            Promise.all(titlesToLoad?.map(it => apiClient.listEpisodes(it.ids.uuid).then(eps => [it.ids.uuid, eps])) || [])
+                .then(it => setEpisodes({...Object.fromEntries(it), ...episodes}));
+        }
+    }, [apiClient, episodes, titlesToLoad]);
 
     const classes = useStyles();
 
@@ -39,9 +50,32 @@ export function MainPage(props: Props) {
                             <p><strong>{rating?.certification}</strong></p>
                             <p><strong>{description?.tagline}</strong></p>
                             <p>{description?.overview}</p>
-                            <p>
-                                <Link to={"/player/" + item.ids.uuid}>Play</Link>
-                            </p>
+                            {item.kind === "movie" && (
+                                <p>
+                                    <Link to={"/player/" + item.ids.uuid}>Play</Link>
+                                </p>
+                            )}
+                            {item.kind === "show" && (
+                                <ul>
+                                    {episodes[item.ids.uuid]?.map(episode => {
+                                        const episodeTitle = getLocalizedName(episode.title, locale);
+                                        const episodeDescription = getLocalizedDescription(episode.title, locale);
+                                        return (
+                                            <li>
+                                                <p>
+                                                    <strong>S{episode.season}E{episode.episode}</strong> – {episode.airDate}
+                                                </p>
+                                                <p><strong>{episodeTitle?.name}</strong></p>
+                                                <p><strong>{episodeDescription?.tagline}</strong></p>
+                                                <p>{episodeDescription?.overview}</p>
+                                                <p>
+                                                    <Link to={"/player/" + episode.title.ids.uuid}>Play</Link>
+                                                </p>
+                                            </li>
+                                        )
+                                    })}
+                                </ul>
+                            )}
                             {poster && (
                                 <img
                                     className={classes.poster}
diff --git a/src/routes/player/Player.tsx b/src/routes/player/Player.tsx
index 56e6aaa..59055a6 100644
--- a/src/routes/player/Player.tsx
+++ b/src/routes/player/Player.tsx
@@ -17,7 +17,7 @@ interface Props {
 
 export function Player(props: Props) {
     const {media} = props;
-    const {title, show, episodes} = props.title;
+    const {title, show} = props.title;
 
     const classes = useStyles();
     const locale = useLocale();
@@ -44,6 +44,7 @@ export function Player(props: Props) {
         <div>
             <Link to="/">Back</Link>
             <p>{name?.name}</p>
+            <p>{show && getLocalizedName(show.title, locale)?.name}</p>
             {video}
             <p style={{fontVariant: "tabular-nums"}}>{formatDuration(position)} / {formatDuration(duration)}</p>
             <SeekBar
-- 
GitLab