/* eslint-disable react/no-children-prop */ import { Box, Divider, Indicator, Popover, ScrollArea } from '@mantine/core'; import React, { useEffect, useState } from 'react'; import { Calendar } from '@mantine/dates'; import { IconCalendar as CalendarIcon } from '@tabler/icons'; import axios from 'axios'; import { useConfig } from '../../../tools/state'; import { IModule } from '../modules'; import { SonarrMediaDisplay, RadarrMediaDisplay, LidarrMediaDisplay, ReadarrMediaDisplay, } from '../common'; import { serviceItem } from '../../../tools/types'; export const CalendarModule: IModule = { title: 'Calendar', description: 'A calendar module for displaying upcoming releases. It interacts with the Sonarr and Radarr API.', icon: CalendarIcon, component: CalendarComponent, }; export default function CalendarComponent(props: any) { const { config } = useConfig(); const [sonarrMedias, setSonarrMedias] = useState([] as any); const [lidarrMedias, setLidarrMedias] = useState([] as any); const [radarrMedias, setRadarrMedias] = useState([] as any); const [readarrMedias, setReadarrMedias] = useState([] as any); const sonarrServices = config.services.filter((service) => service.type === 'Sonarr'); const radarrServices = config.services.filter((service) => service.type === 'Radarr'); const lidarrServices = config.services.filter((service) => service.type === 'Lidarr'); const readarrServices = config.services.filter((service) => service.type === 'Readarr'); function getMedias(service: serviceItem | undefined, type: string) { if (!service || !service.apiKey) { return Promise.resolve({ data: [] }); } return axios.post(`/api/modules/calendar?type=${type}`, { ...service }); } useEffect(() => { // Filter only sonarr and radarr services // Get the url and apiKey for all Sonarr and Radarr services sonarrServices.map((service) => getMedias(service, 'sonarr').then((res) => { setSonarrMedias([...sonarrMedias, ...res.data]); }) ); radarrServices.map((service) => getMedias(service, 'radarr').then((res) => { setRadarrMedias([...radarrMedias, ...res.data]); }) ); lidarrServices.map((service) => getMedias(service, 'lidarr').then((res) => { setLidarrMedias([...lidarrMedias, ...res.data]); }) ); readarrServices.map((service) => getMedias(service, 'readarr').then((res) => { setReadarrMedias([...readarrMedias, ...res.data]); }) ); }, [config.services]); return ( {}} renderDay={(renderdate) => ( )} /> ); } function DayComponent(props: any) { const { renderdate, sonarrmedias, radarrmedias, lidarrmedias, readarrmedias, }: { renderdate: Date; sonarrmedias: []; radarrmedias: []; lidarrmedias: []; readarrmedias: [] } = props; const [opened, setOpened] = useState(false); const day = renderdate.getDate(); const readarrFiltered = readarrmedias.filter((media: any) => { const date = new Date(media.releaseDate); return date.getDate() === day && date.getMonth() === renderdate.getMonth(); }); const lidarrFiltered = lidarrmedias.filter((media: any) => { const date = new Date(media.releaseDate); // Return true if the date is renerdate without counting hours and minutes return date.getDate() === day && date.getMonth() === renderdate.getMonth(); }); const sonarrFiltered = sonarrmedias.filter((media: any) => { const date = new Date(media.airDate); // Return true if the date is renerdate without counting hours and minutes return date.getDate() === day && date.getMonth() === renderdate.getMonth(); }); const radarrFiltered = radarrmedias.filter((media: any) => { const date = new Date(media.inCinemas); // Return true if the date is renerdate without counting hours and minutes return date.getDate() === day && date.getMonth() === renderdate.getMonth(); }); if ( sonarrFiltered.length === 0 && radarrFiltered.length === 0 && lidarrFiltered.length === 0 && readarrFiltered.length === 0 ) { return
{day}
; } return ( { setOpened(true); }} > {readarrFiltered.length > 0 && ( )} {radarrFiltered.length > 0 && ( )} {sonarrFiltered.length > 0 && ( )} {lidarrFiltered.length > 0 && ( )} setOpened(false)} opened={opened} target={day} > {sonarrFiltered.map((media: any, index: number) => ( {index < sonarrFiltered.length - 1 && } ))} {radarrFiltered.length > 0 && sonarrFiltered.length > 0 && ( )} {radarrFiltered.map((media: any, index: number) => ( {index < radarrFiltered.length - 1 && } ))} {sonarrFiltered.length > 0 && lidarrFiltered.length > 0 && ( )} {lidarrFiltered.map((media: any, index: number) => ( {index < lidarrFiltered.length - 1 && } ))} {lidarrFiltered.length > 0 && readarrFiltered.length > 0 && ( )} {readarrFiltered.map((media: any, index: number) => ( {index < readarrFiltered.length - 1 && } ))} ); }