Files
Homarr/components/calendar/CalendarComponent.tsx

94 lines
2.6 KiB
TypeScript
Raw Normal View History

import { Indicator, Popover, Box, Center } from '@mantine/core';
import { useEffect, useState } from 'react';
2022-04-30 21:36:46 +02:00
import { Calendar } from '@mantine/dates';
import MediaDisplay from './MediaDisplay';
import { useConfig } from '../../tools/state';
import { serviceItem } from '../../tools/types';
2022-04-30 21:36:46 +02:00
export default function CalendarComponent(props: any) {
const { config } = useConfig();
2022-04-30 21:36:46 +02:00
const [opened, setOpened] = useState(false);
const [medias, setMedias] = useState([] as any);
if (medias === undefined) {
return <div>ok</div>;
}
useEffect(() => {
// Filter only sonarr and radarr services
const filtered = config.services.filter(
(service) => service.type === 'Sonarr' || service.type === 'Radarr'
);
// Get the url and API key for each service
const serviceUrls = filtered.map((service: serviceItem) => ({
url: service.url,
apiKey: service.apiKey,
}));
// Get the medias from each service
// With no cors
// const promises = serviceUrls.map((service) =>
// fetch('/api/getCalendar', {
// method: 'POST',
// body: JSON.stringify({
// apiKey: service.apiKey,
// remoteUrl: service.url,
// }),
// }).then((response) => console.log(response.json()))
// );
fetch('http://server:8989/api/calendar?apikey=ea736455118146fea297e6c7465205ce').then(
(response) => {
response.json().then((data) => setMedias(data));
}
);
}, [config.services]);
2022-04-30 21:36:46 +02:00
if (medias === undefined) {
return <div>ok</div>;
}
2022-05-01 14:47:06 +02:00
2022-04-30 21:36:46 +02:00
return (
<Calendar
onChange={(day: any) => {}}
renderDay={(renderdate) => <DayComponent renderdate={renderdate} medias={medias} />}
2022-04-30 21:36:46 +02:00
/>
);
}
function DayComponent(props: any) {
const { renderdate, medias }: { renderdate: Date; medias: [] } = props;
2022-04-30 21:36:46 +02:00
const [opened, setOpened] = useState(false);
const day = renderdate.getDate();
// Itterate over the medias and filter the ones that are on the same day
const filtered = medias.filter((media: any) => {
const date = new Date(media.airDate);
return date.getDate() === day;
});
if (filtered.length === 0) {
return <div>{day}</div>;
2022-04-30 21:36:46 +02:00
}
return (
<Box
onClick={() => {
setOpened(true);
}}
style={{ height: '100%', width: '100%' }}
>
<Center>
<Indicator size={10} color="red">
<Popover
position="left"
width={700}
onClose={() => setOpened(false)}
opened={opened}
target={day}
>
<MediaDisplay media={filtered[0]} />
</Popover>
</Indicator>
</Center>
</Box>
);
2022-04-30 21:36:46 +02:00
}