"use client"; /** * Date Range Field * * Combines Shadcn Popover and Calendar for date range selection */ import { Calendar } from "@mdxui/primitives/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@mdxui/primitives/popover"; import { format, isAfter, isBefore, isSameDay } from "date-fns"; import { CalendarIcon } from "lucide-react"; import { useMemo, useState } from "react"; import type { DateRange } from "react-day-picker"; import { ANIMATION_CLASSES, getStaggerStyle, STAGGER_PRESETS, } from "../animations"; import { cx } from "../lib/utils"; import { OnboardingButton } from "../primitives/onboarding-button"; import { OnboardingLabel } from "../primitives/onboarding-label"; import type { DateRangeFieldProps } from "../types/fields"; export function DateRangeField({ id, label, placeholder = "Pick a date range", description, required = false, value, onChange, minDate, maxDate, disabledDates, numberOfMonths = 2, animationIndex = 0, disabled = false, error, touched = false, }: DateRangeFieldProps) { const [open, setOpen] = useState(false); const handleSelect = (range: DateRange | undefined) => { onChange(range); // Keep popover open - user closes it by clicking outside or pressing Escape }; // Build disabled function for react-day-picker const isDateDisabled = useMemo(() => { return (date: Date) => { if (minDate && isBefore(date, minDate)) return true; if (maxDate && isAfter(date, maxDate)) return true; if (disabledDates?.some((d) => isSameDay(date, d))) return true; return false; }; }, [minDate, maxDate, disabledDates]); // Format the display text const displayText = useMemo(() => { if (!value?.from) return placeholder; if (!value.to) return format(value.from, "PPP"); return `${format(value.from, "PP")} - ${format(value.to, "PP")}`; }, [value, placeholder]); return (
{description}
)}{error}
)}