From d978d3d62f9f772f03e375a5aac7547b330f246b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niklas=20Schr=C3=B6tler?= <niklas@allround.digital>
Date: Sat, 9 Dec 2023 16:44:21 +0100
Subject: [PATCH] MensaplanPanel: Added handling for failing requests

---
 src/panels/Mensaplan/MensaplanPanel.tsx | 159 +++++++++++++-----------
 1 file changed, 83 insertions(+), 76 deletions(-)

diff --git a/src/panels/Mensaplan/MensaplanPanel.tsx b/src/panels/Mensaplan/MensaplanPanel.tsx
index 03c8a75..32be9b3 100644
--- a/src/panels/Mensaplan/MensaplanPanel.tsx
+++ b/src/panels/Mensaplan/MensaplanPanel.tsx
@@ -29,85 +29,92 @@ const MensaplanPanel = (props: {definition: MensaPanelDefinition}) => {
 
   useEffect(() => {
     const update = async () => {
-      // Determine day to fetch for
-      const now = new Date();
-      let fetchFor: string;
-
-      if(
-        now.getHours() > props.definition.closingTime.hours || (
-          now.getHours() === props.definition.closingTime.hours &&
-          now.getMinutes() > props.definition.closingTime.minutes
-        )
-      ) {
-        // After closing, fetch for next day
-        setRelativeDay("morgen");
-        const tomorrow = new Date(now.setTime(now.getTime() + 24 * 60 * 60 * 1000));
-        fetchFor = toYYYYMMDD(tomorrow);
-      } else {
-        // otherwise, fetch for today
-        setRelativeDay("heute");
-        fetchFor = toYYYYMMDD(now);
+      try {
+        // Determine day to fetch for
+        const now = new Date();
+        let fetchFor: string;
+
+        if (
+          now.getHours() > props.definition.closingTime.hours || (
+            now.getHours() === props.definition.closingTime.hours &&
+            now.getMinutes() > props.definition.closingTime.minutes
+          )
+        ) {
+          // After closing, fetch for next day
+          setRelativeDay("morgen");
+          const tomorrow = new Date(now.setTime(now.getTime() + 24 * 60 * 60 * 1000));
+          fetchFor = toYYYYMMDD(tomorrow);
+        } else {
+          // otherwise, fetch for today
+          setRelativeDay("heute");
+          fetchFor = toYYYYMMDD(now);
+        }
+
+        // Request the API
+        const request = await fetch(`https://infoscreen.oh14.de/canteen-menu/v3/canteens/${props.definition.canteenId}/${fetchFor}`);
+
+        if (!(request.status === 200)) {
+          menus.current = [];
+          specials.current = [];
+          return;
+        }
+
+        const data = await request.json() as CanteenAPIResponse;
+
+        console.log(data);
+
+        const old_menus_count = menus.current.length;
+        const old_specials_count = menus.current.length;
+
+        // ToDo: This needs to be cleaned up!
+        menus.current = data
+          .filter(d => d.counter !== "Beilagen")
+          .filter(d => d.counter !== "Aktionsteller")
+          .sort((a, b) => {
+            return a.position - b.position
+          })
+          .map(d => ({
+            name: (d.title.de
+              .split(" | ")
+              .at(0) ?? "Name nicht bekannt")
+              .replace(" nach Wahl", ""),
+            details: d.title.de
+              .split(" | ")
+              .slice(1, -1)
+              .join(", ")
+              .replace(" nach Wahl", ""),
+            typeIcons: d.type.map(typeToIcon).filter(i => i !== null) as unknown as React.FC<any>[]
+          }))
+
+        specials.current = data
+          .filter(d => d.counter === "Aktionsteller")
+          .sort((a, b) => {
+            return a.position - b.position
+          })
+          .map(d => ({
+            name: (d.title.de
+              .split(" | ")
+              .at(0) ?? "Name nicht bekannt")
+              .replace(" nach Wahl", ""),
+            details: d.title.de
+              .split(" | ")
+              .slice(1, -1)
+              .join(", ")
+              .replace(" nach Wahl", ""),
+            typeIcons: d.type.map(typeToIcon).filter(i => i !== null) as unknown as React.FC<any>[]
+          }))
+
+        // If the count of menus and specials changed, reset the cycler
+        if (menus.current.length !== old_menus_count || specials.current.length !== old_specials_count) {
+          setDishes(menus.current);
+          cycle.current = 0;
+          setGroupName("Menüs")
+        }
       }
-
-      // Request the API
-      const request = await fetch(`https://infoscreen.oh14.de/canteen-menu/v3/canteens/${props.definition.canteenId}/${fetchFor}`);
-
-      if(!(request.status === 200)) {
+      catch (e) {
+        console.warn("MensaPlan not showing data because", e);
         menus.current = [];
         specials.current = [];
-        return;
-      }
-
-      const data = await request.json() as CanteenAPIResponse;
-
-      console.log(data);
-
-      const old_menus_count = menus.current.length;
-      const old_specials_count = menus.current.length;
-
-      // ToDo: This needs to be cleaned up!
-      menus.current = data
-        .filter(d => d.counter !== "Beilagen")
-        .filter(d => d.counter !== "Aktionsteller")
-        .sort((a, b) => {
-          return a.position - b.position
-        })
-        .map(d => ({
-          name: (d.title.de
-            .split(" | ")
-            .at(0) ?? "Name nicht bekannt")
-            .replace(" nach Wahl", ""),
-          details: d.title.de
-            .split(" | ")
-            .slice(1,-1)
-            .join(", ")
-            .replace(" nach Wahl", ""),
-          typeIcons: d.type.map(typeToIcon).filter(i => i !== null) as unknown as React.FC<any>[]
-        }))
-
-      specials.current = data
-        .filter(d => d.counter === "Aktionsteller")
-        .sort((a, b) => {
-          return a.position - b.position
-        })
-        .map(d => ({
-          name: (d.title.de
-            .split(" | ")
-            .at(0) ?? "Name nicht bekannt")
-            .replace(" nach Wahl", ""),
-          details: d.title.de
-            .split(" | ")
-            .slice(1,-1)
-            .join(", ")
-            .replace(" nach Wahl", ""),
-          typeIcons: d.type.map(typeToIcon).filter(i => i !== null) as unknown as React.FC<any>[]
-        }))
-
-      // If the count of menus and specials changed, reset the cycler
-      if(menus.current.length !== old_menus_count || specials.current.length !== old_specials_count) {
-        setDishes(menus.current);
-        cycle.current = 0;
-        setGroupName("Menüs")
       }
     }
 
-- 
GitLab