import * as React from 'react'; import { Paper, Grid, Typography, makeStyles, } from '@material-ui/core'; import { getDate, isSameMonth, isToday, format, isWithinRange, } from 'date-fns'; import { chunks, getDaysInMonth, isStartOfRange, isEndOfRange, inDateRange, isRangeSameDay, } from '../utils'; import Header from './Header'; import Day from './Day'; // eslint-disable-next-line no-unused-vars import { NavigationAction, DateRange } from '../types'; const WEEK_DAYS = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; const useStyles = makeStyles(() => ({ root: { width: 290, }, weekDaysContainer: { marginTop: 10, paddingLeft: 30, paddingRight: 30, }, daysContainer: { paddingLeft: 15, paddingRight: 15, marginTop: 15, marginBottom: 20, }, })); 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; }; } const Month: React.FunctionComponent = (props: MonthProps) => { const classes = useStyles(); const { helpers, handlers, value: date, dateRange, marker, setValue: setDate, minDate, maxDate, } = props; // eslint-disable-next-line react/destructuring-assignment 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) => ( // eslint-disable-next-line react/no-array-index-key {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)} /> ); })} ))} ); }; export default Month;