import React from "react"; import { EventElement, EventEvent } from "../../../../types/types"; import { currentDay, daysInMonth, firstDayOfMonth, lastDayOfMonth, } from "./dateUtils"; import { Moment } from "moment"; import { getEventKey, getEventStart } from "../../../helpers/displayEvent"; import { Button, IconButton, useTheme, Grid, Typography } from "@mui/material"; import { Box } from "@mui/system"; interface Props { dateContext: Moment; events: EventElement[]; setSelectedDay: (day: number) => void; selectedDay: number | null; handleEventSelect: (eventEvent: EventEvent) => void; } const MonthView = (props: Props) => { const theme = useTheme(); const { dateContext, events, selectedDay, handleEventSelect } = props; const onDayClick = ( e: React.MouseEvent, day: number ) => { props.setSelectedDay(day); }; let blanks: JSX.Element[] = []; for (let i = 0; i < firstDayOfMonth(dateContext); i++) { blanks.push( {""} ); } let daysInMonthArray: React.ReactNode[] = []; for (let d = 1; d <= daysInMonth(dateContext); d++) { let className = d === currentDay(dateContext) ? "day current-day" : "day"; let selectedClass = d === selectedDay ? " selected-day " : ""; // Find all events for today const todaysEvents = events.filter((event) => { const eventDate = new Date(getEventStart(event.event)); /** @todo handle this dateContext is just a month but events are calendar month*/ if (eventDate.getMonth() === dateContext.month()) { return eventDate.getDate() === d; } return false; }); daysInMonthArray.push( { onDayClick(e, d); }} aria-label="close dialog" className="day-btn" sx={{ borderRadius: "50%", border: "none", paddingBottom: "4px", paddingTop: "4px", "&:hover": { backgroundColor: theme.palette.grey[100], }, }} > {d} {todaysEvents?.map((event) => { const key = getEventKey(event.event); return (
); })}
); } let endBlanks: JSX.Element[] = []; for (let i = lastDayOfMonth(dateContext); i < 6; i++) { endBlanks.push( {""} ); } var totalSlots = [...blanks, ...daysInMonthArray, ...endBlanks]; let rows: React.ReactNode[] = []; let cells: React.ReactNode[] = []; totalSlots.forEach((row, i) => { if (i % 7 !== 0) { cells.push(row); } else { let insertRow = cells.slice(); rows.push(insertRow); cells = []; cells.push(row); } if (i === totalSlots.length - 1) { let insertRow = cells.slice(); rows.push(insertRow); } }); let trElems = rows.map((d: React.ReactNode, i: number) => { return {d}; }); return ( {trElems} ); }; // The days of the week seems like this could be a constant const Weekdays = React.memo(function TableHeader() { return ( <> Sun Mon Tue Wed Thur Fri Sat ); }); export default MonthView;