X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=resources%2Fjs%2Fcomponents%2Fpages%2FSchedule.js;h=59e6ac4846eeff8aee216d632d90a773a0706170;hb=01c03862db4c9d7da371fb3500aab566d36366ff;hp=5f82bfe3347d322d0178b86da342209a2d8129b1;hpb=fb9c7a3524a5fc879bb062b343ec2f8fc3817f42;p=alttp.git diff --git a/resources/js/components/pages/Schedule.js b/resources/js/components/pages/Schedule.js index 5f82bfe..59e6ac4 100644 --- a/resources/js/components/pages/Schedule.js +++ b/resources/js/components/pages/Schedule.js @@ -1,27 +1,44 @@ import axios from 'axios'; import moment from 'moment'; import React from 'react'; -import { Container } from 'react-bootstrap'; +import { Alert, Container } from 'react-bootstrap'; import { Helmet } from 'react-helmet'; import { useTranslation } from 'react-i18next'; import CanonicalLinks from '../common/CanonicalLinks'; import ErrorBoundary from '../common/ErrorBoundary'; +import Filter from '../episodes/Filter'; import List from '../episodes/List'; const Schedule = () => { - const [ahead, setAhead] = React.useState(6); + const [ahead, setAhead] = React.useState(14); const [behind, setBehind] = React.useState(0); const [episodes, setEpisodes] = React.useState([]); + const [filter, setFilter] = React.useState({}); const { t } = useTranslation(); - const fetchEpisodes = React.useCallback((controller, ahead, behind) => { + React.useEffect(() => { + const savedFilter = localStorage.getItem('episodes.filter.schedule'); + if (savedFilter) { + setFilter(JSON.parse(savedFilter)); + } else { + setFilter(filter => filter ? {} : filter); + } + }, []); + + const updateFilter = React.useCallback(newFilter => { + localStorage.setItem('episodes.filter.schedule', JSON.stringify(newFilter)); + setFilter(newFilter); + }, []); + + const fetchEpisodes = React.useCallback((controller, ahead, behind, filter) => { axios.get(`/api/episodes`, { signal: controller.signal, params: { after: moment().startOf('day').subtract(behind, 'days').toISOString(), before: moment().startOf('day').add(ahead + 1, 'days').toISOString(), + ...filter, }, }).then(response => { setEpisodes(response.data || []); @@ -30,19 +47,19 @@ const Schedule = () => { console.error(e); } }); - }, [setEpisodes]); + }, []); React.useEffect(() => { const controller = new AbortController(); - fetchEpisodes(controller, ahead, behind); + fetchEpisodes(controller, ahead, behind, filter); const timer = setInterval(() => { - fetchEpisodes(controller, ahead, behind); - }, 5 * 60 * 1000); + fetchEpisodes(controller, ahead, behind, filter); + }, 3 * 60 * 1000); return () => { controller.abort(); clearInterval(timer); }; - }, [ahead, behind]); + }, [ahead, behind, fetchEpisodes, filter]); return @@ -50,9 +67,20 @@ const Schedule = () => { -

{t('schedule.heading')}

+
+

{t('schedule.heading')}

+
+ +
+
- + {episodes.length ? + + : + + {t('episodes.empty')} + + }
; };