import * as React from "react"; import classNames from "classnames"; import { AriaCalendarProps, AriaRangeCalendarProps, useCalendar, useCalendarCell, useCalendarGrid, useLocale, useRangeCalendar, } from "react-aria"; import { CalendarState, RangeCalendarState, useCalendarState, useRangeCalendarState, } from "react-stately"; import { ChevronLeft } from "@faulty/gdq-icons/icons/ChevronLeft"; import { ChevronRight } from "@faulty/gdq-icons/icons/ChevronRight"; import { CalendarDate, createCalendar, DateValue, getWeeksInMonth, isSameDay, } from "@internationalized/date"; import { Clickable } from "../Clickable/Clickable"; import { Interactive } from "../Interactive/Interactive"; import { Stack } from "../Stack/Stack"; import { Header } from "../Text/Text"; import styles from "./Calendar.module.css"; export interface CalendarProps extends AriaCalendarProps { className?: string; } export function Calendar(props: CalendarProps) { const { className } = props; let { locale } = useLocale(); let state = useCalendarState({ ...props, locale, createCalendar, }); let { calendarProps, prevButtonProps, nextButtonProps, title } = useCalendar(props, state); return (
{title}
); } export interface RangeCalendarProps extends AriaRangeCalendarProps {} export function RangeCalendar(props: RangeCalendarProps) { let { locale } = useLocale(); let state = useRangeCalendarState({ ...props, locale, createCalendar, }); let ref = React.useRef(null); let { calendarProps, prevButtonProps, nextButtonProps, title } = useRangeCalendar( props, state, ref, ); return (
{title}
); } interface CalendarGridProps { state: CalendarState | RangeCalendarState; } function CalendarGrid(props: CalendarGridProps) { const { state } = props; let { locale } = useLocale(); let { gridProps, headerProps, weekDays } = useCalendarGrid({}, state); // Get the number of weeks in the month so we can render the proper number of rows. let weeksInMonth = getWeeksInMonth(state.visibleRange.start, locale); return ( {weekDays.map((day, index) => ( ))} {[...new Array(weeksInMonth).keys()].map((weekIndex) => ( {state .getDatesInWeek(weekIndex) .map((date, i) => date ? : ))}
{day}
, )}
); } interface CalendarCellProps { state: CalendarState | RangeCalendarState; date: CalendarDate; } function CalendarCell(props: CalendarCellProps) { const { state, date } = props; let ref = React.useRef(null); let { cellProps, buttonProps, isSelected, isOutsideVisibleRange, isDisabled, isUnavailable, formattedDate, } = useCalendarCell({ date }, state, ref); const isRangeCalendar = "highlightedRange" in state; const isStart = isRangeCalendar ? isSameDay(date, state.highlightedRange.start) : false; const isEnd = isRangeCalendar ? isSameDay(date, state.highlightedRange.end) : false; const isWithinRange = isRangeCalendar ? date.compare(state.highlightedRange.start) >= 0 && date.compare(state.highlightedRange.end) <= 0 : false; return ( ); }