import { useMemo } from "react"; import { DateTime, Info } from "luxon"; import classNames from "classnames"; import { useTranslation } from "next-i18next"; import Event from "./event"; const cellStyle = "relative w-10 flex items-center justify-center flex-col"; const monthButton = "pl-6 pr-6 ml-2 mr-2 hover:bg-theme-100/20 dark:hover:bg-white/5 rounded-md cursor-pointer"; export function Day({ weekNumber, weekday, events, colorVariants, showDate, setShowDate }) { const currentDate = DateTime.now(); const cellDate = showDate.set({ weekday, weekNumber }).startOf("day"); const filteredEvents = events?.filter( (event) => event.date?.startOf("day").toUnixInteger() === cellDate.toUnixInteger(), ); const dayStyles = (displayDate) => { let style = "h-9 "; if ([6, 7].includes(displayDate.weekday)) { // weekend style style += "text-red-500 "; // different month style style += displayDate.month !== showDate.month ? "text-red-500/40 " : ""; } else if (displayDate.month !== showDate.month) { // different month style style += "text-gray-500 "; } // selected same day style style += displayDate.startOf("day").ts === showDate.startOf("day").ts ? "text-black-500 bg-theme-100/20 dark:bg-white/10 rounded-md " : ""; if (displayDate.startOf("day").ts === currentDate.startOf("day").ts) { // today style style += "text-black-500 bg-theme-100/20 dark:bg-black/20 rounded-md "; } else { style += "hover:bg-theme-100/20 dark:hover:bg-white/5 rounded-md cursor-pointer "; } return style; }; return ( ); } const dayInWeekId = { monday: 1, tuesday: 2, wednesday: 3, thursday: 4, friday: 5, saturday: 6, sunday: 7, }; export default function Monthly({ service, colorVariants, events, showDate, setShowDate }) { const { widget } = service; const { i18n } = useTranslation(); const currentDate = DateTime.now().setLocale(i18n.language).startOf("day"); const dayNames = Info.weekdays("short", { locale: i18n.language }); const firstDayInWeekCalendar = widget?.firstDayInWeek ? widget?.firstDayInWeek?.toLowerCase() : "monday"; for (let i = 1; i < dayInWeekId[firstDayInWeekCalendar]; i += 1) { dayNames.push(dayNames.shift()); } const daysInWeek = useMemo( () => [...Array(7).keys()].map((i) => i + dayInWeekId[firstDayInWeekCalendar]), [firstDayInWeekCalendar], ); if (!showDate) { return
; } const firstWeek = DateTime.local(showDate.year, showDate.month, 1).setLocale(i18n.language); const weekIncrementChange = dayInWeekId[firstDayInWeekCalendar] > firstWeek.weekday ? -1 : 0; let weekNumbers = [...Array(Math.ceil(5) + 1).keys()].map((i) => firstWeek.weekNumber + weekIncrementChange + i); if (weekNumbers.includes(55)) { // if we went too far with the weeks, it's the beginning of the year weekNumbers = weekNumbers.map((weekNum) => weekNum - 52); } const eventsArray = Object.keys(events).map((eventKey) => events[eventKey]); eventsArray.sort((a, b) => a.date - b.date); return (
{dayNames.map((name) => ( {name} ))}
{weekNumbers.map((weekNumber) => daysInWeek.map((dayInWeek) => ( )), )}
{eventsArray ?.filter((event) => showDate.startOf("day").ts === event.date?.startOf("day").ts) .slice(0, widget?.maxEvents ?? 10) .map((event) => ( ))}
); }