import React, { useMemo } from "react"; import { useDateFormatter, useLocale } from "@react-aria/i18n"; import { endOfMonth, getWeeksInMonth, startOfWeek, today, } from "@internationalized/date"; import { useCalendarGrid } from "react-aria"; import { CalendarState, RangeCalendarState } from "@react-stately/calendar"; import { CalendarCell } from ":/components/Forms/DatePicker/CalendarCell"; import { range } from ":/utils"; interface CalendarGridProps { state: CalendarState | RangeCalendarState; defaultDaysInWeek?: number; } export const CalendarGrid = ({ state, defaultDaysInWeek = 7, }: CalendarGridProps) => { const { locale } = useLocale(); const weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale); const { gridProps, headerProps } = useCalendarGrid( { startDate: state.visibleRange.start, endDate: endOfMonth(state.visibleRange.start), }, state, ); const shortDayFormatter = useDateFormatter({ weekday: "short", timeZone: state.timeZone, }); const weekDays = useMemo(() => { const weekStart = startOfWeek(today(state.timeZone), locale); return range(0, defaultDaysInWeek - 1).map((index) => { const dateDay = weekStart.add({ days: index }).toDate(state.timeZone); return shortDayFormatter.format(dateDay); }); }, [locale, state.timeZone, shortDayFormatter]); return ( {weekDays.map((day, index) => ( ))} {range(0, weeksInMonth - 1).map((weekIndex) => ( {state .getDatesInWeek(weekIndex) .map( (date, i) => date && , )} ))}
{day}
); };