import { useMantineTheme } from '@mantine/core'; import { Calendar } from '@mantine/dates'; import { IconCalendarTime } from '@tabler/icons-react'; import { useSession } from 'next-auth/react'; import { useState } from 'react'; import { getLanguageByCode } from '~/tools/language'; import { RouterOutputs, api } from '~/utils/api'; import { useEditModeStore } from '~/components/Dashboard/Views/useEditModeStore'; import { useConfigContext } from '~/config/provider'; import { defineWidget } from '../helper'; import { IWidget } from '../widgets'; import { CalendarDay } from './CalendarDay'; import { getBgColorByDateAndTheme } from './bg-calculator'; import { MediasType } from './type'; const definition = defineWidget({ id: 'calendar', icon: IconCalendarTime, options: { hideWeekDays: { type: 'switch', defaultValue: true, }, useSonarrv4: { type: 'switch', defaultValue: false, }, radarrReleaseType: { type: 'select', defaultValue: 'inCinemas', data: [ { value: 'inCinemas' }, { value: 'physicalRelease' }, { value: 'digitalRelease' }, ], }, fontSize: { type: 'select', defaultValue: 'xs', data: [ { value: 'xs' }, { value: 'sm' }, { value: 'md' }, { value: 'lg' }, { value: 'xl' }, ], }, }, gridstack: { minWidth: 2, minHeight: 2, maxWidth: 12, maxHeight: 12, }, component: CalendarTile, }); export type ICalendarWidget = IWidget<(typeof definition)['id'], typeof definition>; interface CalendarTileProps { widget: ICalendarWidget; } function CalendarTile({ widget }: CalendarTileProps) { const { colorScheme, radius } = useMantineTheme(); const { name: configName } = useConfigContext(); const [month, setMonth] = useState(new Date()); const isEditMode = useEditModeStore((x) => x.enabled); const { data: sessionData } = useSession(); const { data: userWithSettings } = api.user.withSettings.useQuery(undefined, { enabled: !!sessionData?.user, }); const language = getLanguageByCode(userWithSettings?.settings.language ?? 'en'); const { data: medias } = api.calendar.medias.useQuery( { configName: configName!, month: month.getMonth() + 1, year: month.getFullYear(), options: { useSonarrv4: widget.properties.useSonarrv4 }, }, { staleTime: 1000 * 60 * 60 * 5, enabled: isEditMode === false, } ); const firstDayOfWeek = userWithSettings?.settings.firstDayOfWeek ?? 'monday'; return ( ({ bg: getBgColorByDateAndTheme(colorScheme, date), })} renderDay={(date) => ( )} /> ); } const getFirstDayOfWeek = ( firstDayOfWeek: RouterOutputs['user']['withSettings']['settings']['firstDayOfWeek'] ) => { if (firstDayOfWeek === 'sunday') return 0; if (firstDayOfWeek === 'monday') return 1; return 6; }; const getReleasedMediasForDate = ( medias: MediasType | undefined, date: Date, widget: ICalendarWidget ): MediasType => { const { radarrReleaseType } = widget.properties; const books = medias?.books.filter((b) => new Date(b.releaseDate).toDateString() === date.toDateString()) ?? []; const movies = medias?.movies.filter( (m) => new Date(m[radarrReleaseType]).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, }; }; export default definition;