From 6cc5d2448f1eb402dae1816bae4648dbfa7f4e4b Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sat, 26 Sep 2020 01:48:52 +0200
Subject: [PATCH] Improve regional selection

---
 src/App.tsx                        | 11 ++++++++---
 src/api/models/LocalizedData.ts    |  4 ++--
 src/api/models/Rating.ts           |  4 +++-
 src/api/models/TitleDescription.ts |  4 +++-
 src/api/models/TitleName.ts        |  4 +++-
 src/locale/selectLocaleData.ts     | 26 +++++++++++++++++++-------
 6 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/src/App.tsx b/src/App.tsx
index 24ce632..1859c58 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -4,6 +4,7 @@ import {useApiClient} from "./api/ApiClientContext";
 import {Title} from "./api/models/Title";
 import {Locale, LocalePriority, selectLocaleVersion} from "./locale/selectLocaleData";
 import {usePlayabilityRating} from "./mime/usePlayabilityRating";
+import {sortLexicallyAsc} from "./util/sortLexically";
 import {sortNumericallyDesc} from "./util/sortNumerically";
 
 export default function App() {
@@ -14,7 +15,7 @@ export default function App() {
         apiClient.listTitles().then(setData);
     }, [apiClient]);
     const locale: Locale = {
-        language: "de",
+        language: "en",
         region: "DE",
     };
 
@@ -22,9 +23,12 @@ export default function App() {
 
     return (
         <div>
-            {data?.map((item: Title) => {
+            {data?.sort(sortLexicallyAsc(item =>
+                selectLocaleVersion(locale, LocalePriority.REGION_BEFORE_LOCALE, item.titles)?.name || ""))
+                .map((item: Title) => {
                 const title = selectLocaleVersion(locale, LocalePriority.REGION_BEFORE_LOCALE, item.titles);
                 const description = selectLocaleVersion(locale, LocalePriority.LOCALE_BEFORE_REGION, item.descriptions);
+                const rating = selectLocaleVersion(locale, LocalePriority.REGION_ONLY, item.ratings);
                 const poster = item.images.find(it => it.kind === "poster");
                 const backdrop = item.images.find(it => it.kind === "backdrop");
                 const mediaList = item.media.map(it => {
@@ -38,8 +42,9 @@ export default function App() {
                 return (
                     <div key={item.ids.uuid} className={classes.movie}>
                         <h1>{title?.name}</h1>
-                        <strong>{description?.tagline}</strong>
+                        <p><strong>{description?.tagline}</strong></p>
                         <p>{description?.overview}</p>
+                        <p><strong>{rating?.certification}</strong></p>
                         {poster && (
                             <img
                                 className={classes.poster}
diff --git a/src/api/models/LocalizedData.ts b/src/api/models/LocalizedData.ts
index 992a91e..71b27d2 100644
--- a/src/api/models/LocalizedData.ts
+++ b/src/api/models/LocalizedData.ts
@@ -1,5 +1,5 @@
 export interface LocalizedData {
     region: string | null,
-    languages: string[],
-    kind: string,
+    languages?: string[],
+    kind?: string,
 }
diff --git a/src/api/models/Rating.ts b/src/api/models/Rating.ts
index 6cef8e9..e4b85e7 100644
--- a/src/api/models/Rating.ts
+++ b/src/api/models/Rating.ts
@@ -1,4 +1,6 @@
-export interface Rating {
+import {LocalizedData} from "./LocalizedData";
+
+export interface Rating extends LocalizedData {
     region: string | null,
     certification: string
 }
diff --git a/src/api/models/TitleDescription.ts b/src/api/models/TitleDescription.ts
index 980640d..cc2b03a 100644
--- a/src/api/models/TitleDescription.ts
+++ b/src/api/models/TitleDescription.ts
@@ -2,5 +2,7 @@ import {LocalizedData} from "./LocalizedData";
 
 export interface TitleDescription extends LocalizedData {
     overview: string,
-    tagline: string | null
+    tagline: string | null,
+    languages: string[],
+    kind: string
 }
diff --git a/src/api/models/TitleName.ts b/src/api/models/TitleName.ts
index 914d7a4..b21be8e 100644
--- a/src/api/models/TitleName.ts
+++ b/src/api/models/TitleName.ts
@@ -1,5 +1,7 @@
 import {LocalizedData} from "./LocalizedData";
 
 export interface TitleName extends LocalizedData {
-    name: string
+    name: string,
+    languages: string[],
+    kind: string
 }
diff --git a/src/locale/selectLocaleData.ts b/src/locale/selectLocaleData.ts
index b376401..f2d49a4 100644
--- a/src/locale/selectLocaleData.ts
+++ b/src/locale/selectLocaleData.ts
@@ -11,24 +11,36 @@ export enum LocalePriority {
     LOCALE_BEFORE_REGION
 }
 
-function filterVersions<T extends LocalizedData>(locale: Locale, method: LocalePriority, data: T[]): T | undefined {
+function filterVersions<T extends LocalizedData>(
+    locale: Locale,
+    method: LocalePriority,
+    data: T[]
+): T | undefined {
     switch (method) {
         case LocalePriority.REGION_ONLY:
             return data.find((el) => {
                 return (el.region === locale.region);
             });
         case LocalePriority.REGION_BEFORE_LOCALE:
-            return data.sort((a, b) => (+b.languages.includes(locale.language)) - (+a.languages.includes(locale.language)))
-                .find((el) => el.region === locale.region);
+            return data.sort((a, b) =>
+                +(b.languages?.includes(locale.language) || false) -
+                +(a.languages?.includes(locale.language) || false)
+            ).find((el) => el.region === locale.region);
         case LocalePriority.LOCALE_BEFORE_REGION:
-            return data.sort((a, b) => (+(b.region === locale.region)) - (+(a.region === locale.region)))
-                .find((el) => el.languages.includes(locale.language));
+            return data.sort((a, b) =>
+                +(b.region === locale.region) -
+                +(a.region === locale.region)
+            ).find((el) => el.languages?.includes(locale.language));
 
     }
 }
 
-export function selectLocaleVersion<T extends LocalizedData>(locale: Locale, method: LocalePriority, data: T[]): T | null {
-    return filterVersions(locale, method, data.filter(it => it.kind === "localized"))
+export function selectLocaleVersion<T extends LocalizedData>(
+    locale: Locale,
+    method: LocalePriority,
+    data: T[]
+): T | null {
+    return filterVersions(locale, method, data.filter(it => it?.kind === undefined || it?.kind === "localized"))
         || data.find(it => it.kind === "primary")
         || data.find(it => it.kind === "original")
         || null;
-- 
GitLab