import { useContext, useMemo } from "react";
import { DateTime, Info } from "luxon";
import classNames from "classnames";
import { useTranslation } from "next-i18next";
import { IoMdCheckmarkCircleOutline } from "react-icons/io";
import { EventContext } from "../../utils/contexts/calendar";
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.toFormat("MM-dd-yyyy") === showDate.toFormat("MM-dd-yyyy")
? "text-black-500 bg-theme-100/20 dark:bg-white/10 rounded-md "
: "";
if (displayDate.toFormat("MM-dd-yyyy") === currentDate.toFormat("MM-dd-yyyy")) {
// 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 (
);
}
export function Event({ event }) {
return (
{event.title}
{event.additional ? ` - ${event.additional}` : ""}
{event.isCompleted && (
)}
);
}
const dayInWeekId = {
monday: 1,
tuesday: 2,
wednesday: 3,
thursday: 4,
friday: 5,
saturday: 6,
sunday: 7,
};
export default function Monthly({ service, colorVariants, showDate, setShowDate }) {
const { widget } = service;
const { i18n } = useTranslation();
const { events } = useContext(EventContext);
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]);
return (
{dayNames.map((name) => (
{name}
))}
{weekNumbers.map((weekNumber) =>
daysInWeek.map((dayInWeek) => (
)),
)}
{eventsArray
?.filter((event) => showDate.startOf("day").toUnixInteger() === event.date?.startOf("day").toUnixInteger())
.slice(0, widget?.maxEvents ?? 10)
.map((event) => (
))}
);
}