// @flow strict import * as React from 'react'; // $FlowFixMe[untyped-import] import moment from 'moment'; import type {DateRange} from '../../types'; import { formatIsoDate, getDaysInMonth, inDateRange, isEndOfRange, isStartDateEndDateSame, isStartOfRange, MARKERS, NAVIGATION_ACTION, WEEKDAYS, } from '../../utils'; import { getTranslation, isAfter, isBefore, isSame, } from '../../utils/date-range-picker'; import {BodySmall, TEXT_COLORS} from '../Text'; import {Day} from './Day'; import css from './Calendar.module.css'; type CalendarProps = { value: string, marker: $Values, minDate?: string, maxDate?: string, hoverDay: string, dateRange: DateRange, inHoverRange: (day: string) => boolean, handlers: { onDayClick: (day: string) => void, onDayHover: (day: string) => void, onMonthNavigate: ( marker: $Values, action: $Values, ) => void, }, today: string, t: ?(key: string, fallback: string) => string, }; export const Calendar = ({ value, marker, minDate, maxDate = formatIsoDate(), handlers, hoverDay, dateRange, inHoverRange, today, t, }: CalendarProps): React.Node => (
{WEEKDAYS.map((day) => ( {getTranslation(t, day)} ))}
{getDaysInMonth(value).map((week, index) => (
{week.map((date: string) => { const isRangeValid = isStartDateEndDateSame(dateRange); const isStart = isStartOfRange(dateRange, date); const isEnd = isEndOfRange(dateRange, date); const highlighted = inDateRange(dateRange, date) || inHoverRange(date); const {onDayClick, onDayHover} = handlers; const dateValue = moment.utc(date); return ( onDayClick(date)} onHover={() => onDayHover(date)} outlined={isSame(date, today, 'd')} disabled={ (minDate && isBefore(date, minDate)) || isAfter(date, maxDate) || !isSame(date, value, 'month') } endOfRange={isEnd && !isRangeValid} highlighted={highlighted && !isRangeValid} startOfRange={isStart && !isRangeValid} value={dateValue.date()} hoverDay={hoverDay} /> ); })}
))}
);