2022-12-11 15:13:35 +01:00
|
|
|
import { createStyles, MantineThemeColors, useMantineTheme } from '@mantine/core';
|
2022-12-11 14:11:25 +01:00
|
|
|
import { Calendar } from '@mantine/dates';
|
|
|
|
|
import { useQuery } from '@tanstack/react-query';
|
|
|
|
|
import { useState } from 'react';
|
2022-12-16 21:01:06 +01:00
|
|
|
import { HomarrCardWrapper } from '../../components/Dashboard/Tiles/HomarrCardWrapper';
|
|
|
|
|
import { BaseTileProps } from '../../components/Dashboard/Tiles/type';
|
|
|
|
|
import { useConfigContext } from '../../config/provider';
|
|
|
|
|
import { useColorTheme } from '../../tools/color';
|
|
|
|
|
import { isToday } from '../../tools/isToday';
|
|
|
|
|
import { CalendarIntegrationType } from '../../types/integration';
|
2022-12-11 14:11:25 +01:00
|
|
|
import { CalendarDay } from './CalendarDay';
|
|
|
|
|
import { MediasType } from './type';
|
|
|
|
|
|
|
|
|
|
interface CalendarTileProps extends BaseTileProps {
|
2022-12-16 21:01:06 +01:00
|
|
|
module: CalendarIntegrationType | undefined; // TODO: change to new type defined through widgetDefinition
|
2022-12-11 14:11:25 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const CalendarTile = ({ className, module }: CalendarTileProps) => {
|
|
|
|
|
const { secondaryColor } = useColorTheme();
|
|
|
|
|
const { name: configName } = useConfigContext();
|
|
|
|
|
const { classes, cx } = useStyles(secondaryColor);
|
|
|
|
|
const { colorScheme, colors } = useMantineTheme();
|
|
|
|
|
const [month, setMonth] = useState(new Date());
|
|
|
|
|
|
|
|
|
|
const { data: medias } = useQuery({
|
|
|
|
|
queryKey: ['calendar/medias', { month: month.getMonth(), year: month.getFullYear() }],
|
|
|
|
|
queryFn: async () =>
|
|
|
|
|
(await (
|
|
|
|
|
await fetch(
|
|
|
|
|
`/api/modules/calendar?year=${month.getFullYear()}&month=${
|
|
|
|
|
month.getMonth() + 1
|
|
|
|
|
}&configName=${configName}`
|
|
|
|
|
)
|
|
|
|
|
).json()) as MediasType,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (!module) return <></>;
|
|
|
|
|
|
|
|
|
|
return (
|
2022-12-11 15:13:35 +01:00
|
|
|
<HomarrCardWrapper className={className} p={6}>
|
2022-12-11 14:11:25 +01:00
|
|
|
<Calendar
|
|
|
|
|
month={month}
|
|
|
|
|
onMonthChange={setMonth}
|
|
|
|
|
size="xs"
|
|
|
|
|
fullWidth
|
|
|
|
|
onChange={() => {}}
|
|
|
|
|
firstDayOfWeek={module.properties?.isWeekStartingAtSunday ? 'sunday' : 'monday'}
|
|
|
|
|
dayStyle={(date) => ({
|
|
|
|
|
margin: 1,
|
|
|
|
|
backgroundColor: isToday(date)
|
|
|
|
|
? colorScheme === 'dark'
|
|
|
|
|
? colors.dark[5]
|
|
|
|
|
: colors.gray[0]
|
|
|
|
|
: undefined,
|
|
|
|
|
})}
|
|
|
|
|
styles={{
|
|
|
|
|
calendarHeader: {
|
|
|
|
|
marginRight: 40,
|
|
|
|
|
marginLeft: 40,
|
|
|
|
|
},
|
|
|
|
|
}}
|
|
|
|
|
allowLevelChange={false}
|
|
|
|
|
dayClassName={(_, modifiers) => cx({ [classes.weekend]: modifiers.weekend })}
|
|
|
|
|
renderDay={(date) => (
|
|
|
|
|
<CalendarDay date={date} medias={getReleasedMediasForDate(medias, date)} />
|
|
|
|
|
)}
|
2022-12-11 15:13:35 +01:00
|
|
|
/>
|
|
|
|
|
</HomarrCardWrapper>
|
2022-12-11 14:11:25 +01:00
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const useStyles = createStyles((theme, secondaryColor: keyof MantineThemeColors) => ({
|
|
|
|
|
weekend: {
|
|
|
|
|
color: `${secondaryColor} !important`,
|
|
|
|
|
},
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
const getReleasedMediasForDate = (medias: MediasType | undefined, date: Date): MediasType => {
|
|
|
|
|
const books =
|
|
|
|
|
medias?.books.filter((b) => new Date(b.releaseDate).toDateString() === date.toDateString()) ??
|
|
|
|
|
[];
|
|
|
|
|
const movies =
|
|
|
|
|
medias?.movies.filter((m) => new Date(m.inCinemas).toDateString() === date.toDateString()) ??
|
|
|
|
|
[];
|
|
|
|
|
const musics =
|
|
|
|
|
medias?.musics.filter((m) => new Date(m.releaseDate).toDateString() === date.toDateString()) ??
|
|
|
|
|
[];
|
|
|
|
|
const tvShows =
|
|
|
|
|
medias?.tvShows.filter(
|
|
|
|
|
(tv) => new Date(tv.airDateUtc).toDateString() === date.toDateString()
|
|
|
|
|
) ?? [];
|
|
|
|
|
const totalCount = medias ? books.length + movies.length + musics.length + tvShows.length : 0;
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
books,
|
|
|
|
|
movies,
|
|
|
|
|
musics,
|
|
|
|
|
tvShows,
|
|
|
|
|
totalCount,
|
|
|
|
|
};
|
|
|
|
|
};
|