diff --git a/src/index.css b/src/index.css index 44d79e10cc879063da5a318ee7d04bb486ef73b3..7e67fc856d89077cba74cb211b817009966f60e7 100644 --- a/src/index.css +++ b/src/index.css @@ -98,57 +98,3 @@ font-weight: 800; src: url('./../public/fonts/inter/inter-v13-latin-800.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */ } - -/* Marquee */ -.marquee { - height: 50px; - overflow: hidden; - position: relative; - color: white; -} - -.marquee p { - position: absolute; - width: 100%; - height: 100%; - margin: 0; - line-height: 50px; - text-align: center; - -moz-transform: translateX(100%); - -webkit-transform: translateX(100%); - transform: translateX(100%); - -moz-animation: scroll-left 2s linear infinite; - -webkit-animation: scroll-left 2s linear infinite; - animation: scroll-left 20s linear infinite; -} - -@-moz-keyframes scroll-left { - 0% { - -moz-transform: translateX(100%); - } - 100% { - -moz-transform: translateX(-100%); - } -} - -@-webkit-keyframes scroll-left { - 0% { - -webkit-transform: translateX(100%); - } - 100% { - -webkit-transform: translateX(-100%); - } -} - -@keyframes scroll-left { - 0% { - -moz-transform: translateX(100%); - -webkit-transform: translateX(100%); - transform: translateX(100%); - } - 100% { - -moz-transform: translateX(-100%); - -webkit-transform: translateX(-100%); - transform: translateX(-100%); - } -} \ No newline at end of file diff --git a/src/panels/Fahrplan/FahrplanPanel.tsx b/src/panels/Fahrplan/FahrplanPanel.tsx index 696dcb3fbcaefad2d3ff14025f3c8ac6392bdfab..c707004bdb9faa42d7f1ab3ba1c12d0f64b4d213 100644 --- a/src/panels/Fahrplan/FahrplanPanel.tsx +++ b/src/panels/Fahrplan/FahrplanPanel.tsx @@ -173,8 +173,6 @@ async function getStopData(stop: string): Promise<StationResponse> { } })) - console.log(data); - return data as StationResponse; } diff --git a/src/panels/Gremium/GremiumPanel.tsx b/src/panels/Gremium/GremiumPanel.tsx index 4076d0ddc6126747d6c3ad31caee088589d74b0d..26f670734cbd5bf43b4fdccce7b1505f59112e63 100644 --- a/src/panels/Gremium/GremiumPanel.tsx +++ b/src/panels/Gremium/GremiumPanel.tsx @@ -24,8 +24,6 @@ const GremiumPanel = (props: {definition: GremiumPanelDefinition}) => { useEffect(() => { const update = async () => { setGremium(props.definition.gremien[cycle.current++ % props.definition.gremien.length]); - console.log(gremium); - console.log(cycle.current); } update(); diff --git a/src/panels/MensaJetzt/MensaJetztPanel.tsx b/src/panels/MensaJetzt/MensaJetztPanel.tsx index fd6c238c0acc46df7dc537a8b258cec59decd981..f5b629c2c877ac997b3e6685ec1ec50a5ca072f7 100644 --- a/src/panels/MensaJetzt/MensaJetztPanel.tsx +++ b/src/panels/MensaJetzt/MensaJetztPanel.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import { useEffect, useState } from "react"; import PanelWrapper from "../../meta/PanelWrapper"; import PanelTitle from "../../meta/PanelTitle"; import PanelContent from "../../meta/PanelContent"; @@ -28,43 +28,33 @@ const MensaJetztPanel = () => { const request = await fetch(`https://mensa.jetzt/api/entries/`); if (request.status !== 200) { - setMarqueeContent("Niemand :("); + setMarqueeContent("API Error :("); + console.error("mensa.jetzt API returned error code"); return; } const data = await request.json() as MensaJetztAPIResponse; - const attendance = data.attendance.reduce<Attendance>((accu, curr) => { - const keys = Object.keys(accu); + let marquee = Object.entries( + data.attendance + .sort((a, b) => a.time.localeCompare(b.time)) + .reduce((acc, curr) => { + if (acc[curr.time]) { + acc[curr.time].push(curr); + } else { + acc[curr.time] = [curr]; + } + return acc; + }, {} as Attendance) + ).map(([time, attendees]) => `${time} - ${attendees.map(a => a.name).join(", ")}`) + .join(" | "); - if (keys.includes(curr.time)) { - return { - ...accu, - [curr.time]: [ - ...accu[curr.time], - curr, - ] - } - } else { - return { - ...accu, - [curr.time]: [curr], - } - } - }, {}); - - let marquee = ""; - for (const time of Object.keys(attendance).sort()) { - marquee += " | " + time + " - " + (attendance[time].map(a => a.name).join(", ")); - } - - if (marquee !== "") { + if (marquee) { marquee += " |"; + } else { + marquee = "Niemand :("; } - marquee = marquee.trim(); - let marqueeContent = marquee ? marquee : 'Niemand :('; - setMarqueeContent(marqueeContent); - + setMarqueeContent(marquee.trim()); } catch (e) { console.warn("mensa.jetzt not showing data because", e); @@ -73,23 +63,29 @@ const MensaJetztPanel = () => { } update(); - const interval = setInterval(update, 60 * 1000); + const interval = setInterval(update, 5 * 60 * 1000); return () => { clearInterval(interval); } - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); return ( <PanelWrapper className={"relative"}> - <PanelTitle title={"Mensa.jetzt"} /> + <PanelTitle title={"Mensa.jetzt"}/> <PanelContent> - {/* @ts-ignore */} - <div class="marquee"> {/* eslint-disable-line jsx-a11y/no-distracting-elements */} - <p>{marqueeContent}</p> - {/* @ts-ignore */} - </div> + {marqueeContent.includes("Uhr") ? ( + <div className={"flex overflow-hidden whitespace-nowrap"}> + <div className={"animate-marquee"}> + {marqueeContent} + </div> + <div className={"animate-marquee ml-1"}> + {marqueeContent} + </div> + </div> + ) : ( + <div className={"text-center"}>{marqueeContent}</div> + )} </PanelContent> </PanelWrapper> ); diff --git a/src/panels/Mensaplan/MensaplanPanel.tsx b/src/panels/Mensaplan/MensaplanPanel.tsx index 9e0b05baf3d0cb688f3b3e42c4e2eb1a7355152a..e69d2a1fb62e3914477cdcd2f802df8798567ddc 100644 --- a/src/panels/Mensaplan/MensaplanPanel.tsx +++ b/src/panels/Mensaplan/MensaplanPanel.tsx @@ -67,8 +67,6 @@ const MensaplanPanel = (props: {definition: MensaPanelDefinition}) => { const data = await request.json() as CanteenAPIResponse; - console.log(data); - const old_menus_count = menus.current.length; const old_specials_count = menus.current.length; diff --git a/tailwind.config.js b/tailwind.config.js index d5ba8705b51222dd6cf52ddf431525d2e509b3d4..0187fda61111d0d1578ab260b989562b5d021afe 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -17,7 +17,16 @@ module.exports = { '3xl': '1.953rem', '4xl': '2.441rem', '5xl': '3.052rem' - } + }, + animation: { + marquee: 'marquee 20s linear infinite' + }, + keyframes: { + marquee: { + '0%': { transform: 'translateX(0)' }, + '100%': { transform: 'translateX(-100%)' }, + } + }, } }, plugins: [],