"use client"; import { createCalendar } from "@internationalized/date"; import { useDateField, useDateSegment } from "@react-aria/datepicker"; import { useLocale } from "@react-aria/i18n"; import { mergeProps } from "@react-aria/utils"; import { useDateFieldState } from "@react-stately/datepicker"; import type { AriaDatePickerProps, DateValue } from "@react-types/datepicker"; import { useRef, useState } from "react"; import { useFocusRing, useFocusWithin } from "react-aria"; import type { DateFieldState as IDateFieldState, DateSegment as IDateSegment, } from "react-stately"; export function DateField(props: AriaDatePickerProps) { let { locale } = useLocale(); let state = useDateFieldState({ ...props, locale, createCalendar, }); let ref = useRef(); let { fieldProps } = useDateField(props, state, ref); const [focusWithin, setFocusWithin] = useState(false); let { focusWithinProps } = useFocusWithin({ onFocusWithinChange: setFocusWithin, }); return (
{state.segments.map((segment, i) => ( ))}
); } interface DateSegmentProps { segment: IDateSegment; state: IDateFieldState; } function DateSegment({ segment, state }: DateSegmentProps) { let ref = useRef(); let { segmentProps } = useDateSegment(segment, state, ref); let { focusProps, isFocused } = useFocusRing(); return (
{/* Always reserve space for the placeholder, to prevent layout shift when editing. */} {segment.isPlaceholder ? "" : segment.text}
); }