import type { FC, HTMLAttributes, PropsWithChildren } from "react"; import { Fragment, useContext, useState } from "react"; import type { CalendarDate } from "@internationalized/date"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { faChevronLeft, faChevronRight } from "@fortawesome/pro-duotone-svg-icons"; const ChevronLeft: FC<{ className?: string }> = ({ className }) => ; const ChevronRight: FC<{ className?: string }> = ({ className }) => ; import { useDateFormatter } from "react-aria"; import type { RangeCalendarProps as AriaRangeCalendarProps, DateValue } from "react-aria-components"; import { CalendarGrid as AriaCalendarGrid, CalendarGridBody as AriaCalendarGridBody, CalendarGridHeader as AriaCalendarGridHeader, CalendarHeaderCell as AriaCalendarHeaderCell, RangeCalendar as AriaRangeCalendar, RangeCalendarContext, RangeCalendarStateContext, useSlottedContext, } from "react-aria-components"; import { Button } from "@/components/base/buttons/button"; import { useBreakpoint } from "@/hooks/use-breakpoint"; import { CalendarCell } from "./cell"; import { DateInput } from "./date-input"; export const RangeCalendarContextProvider = ({ children }: PropsWithChildren) => { const [value, onChange] = useState<{ start: DateValue; end: DateValue } | null>(null); const [focusedValue, onFocusChange] = useState(); return {children}; }; const RangeCalendarTitle = ({ part }: { part: "start" | "end" }) => { const context = useContext(RangeCalendarStateContext); if (!context) { throw new Error(" must be used within a component."); } const formatter = useDateFormatter({ month: "long", year: "numeric", calendar: context.visibleRange.start.calendar.identifier, timeZone: context.timeZone, }); return part === "start" ? formatter.format(context.visibleRange.start.toDate(context.timeZone)) : formatter.format(context.visibleRange.end.toDate(context.timeZone)); }; const MobilePresetButton = ({ value, children, ...props }: HTMLAttributes & { value: { start: DateValue; end: DateValue } }) => { const context = useContext(RangeCalendarStateContext); return ( ); }; interface RangeCalendarProps extends AriaRangeCalendarProps { /** The dates to highlight. */ highlightedDates?: DateValue[]; /** The date presets to display. */ presets?: Record; } export const RangeCalendar = ({ presets, ...props }: RangeCalendarProps) => { const isDesktop = useBreakpoint("md"); const context = useSlottedContext(RangeCalendarContext); const ContextWrapper = context ? Fragment : RangeCalendarContextProvider; return (
{!isDesktop && (
)} {!isDesktop && presets && (
{Object.values(presets).map((preset) => ( {preset.label} ))}
)} {(day) => (
{day.slice(0, 2)}
)}
{(date) => }
{isDesktop && (

{(day) => (
{day.slice(0, 2)}
)}
{(date) => }
)}
); };