import React from 'react'; import { Paper, Grid, Typography, } from '@mui/material'; import { getDate, isSameMonth, isToday, format, } from 'date-fns'; import { chunks, getDaysInMonth, isStartOfRange, isEndOfRange, inDateRange, isRangeSameDay, isWithinRange, } from './utils'; import { Day } from './picker.day'; import { Header } from './picker.header'; import { NavigationAction, DateRange } from './types'; const WEEK_DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; interface MonthProps { value: Date; marker: symbol; dateRange: DateRange; minDate: Date; maxDate: Date; navState: [boolean, boolean]; setValue: (date: Date) => void; helpers: { inHoverRange: (day: Date) => boolean; }; handlers: { onDayClick: (day: Date) => void; onDayHover: (day: Date) => void; onMonthNavigate: (marker: symbol, action: NavigationAction) => void; }; } export const Month: React.FunctionComponent = (props: MonthProps) => { const { helpers, handlers, value: date, dateRange, marker, setValue: setDate, minDate, maxDate, } = props; const [back, forward] = props.navState; return (
handlers.onMonthNavigate(marker, NavigationAction.Previous)} onClickNext={() => handlers.onMonthNavigate(marker, NavigationAction.Next)} /> { WEEK_DAYS.map((day) => ( {day} )) } { chunks(getDaysInMonth(date), 7).map((week, idx) => ( { week.map((day) => { const isStart = isStartOfRange(dateRange, day); const isEnd = isEndOfRange(dateRange, day); const isRangeOneDay = isRangeSameDay(dateRange); const highlighted = inDateRange(dateRange, day) || helpers.inHoverRange(day); return ( handlers.onDayClick(day)} onHover={() => handlers.onDayHover(day)} value={getDate(day)} /> ); }) } )) } ); }