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