adobe/react-spectrum

Cannot Access isInvalid Prop from DateRangePicker onChange Handler

Open

#8,228 opened on May 13, 2025

View on GitHub
 (9 comments) (0 reactions) (0 assignees)TypeScript (1,500 forks)auto 404
DatePickerenhancementhelp wanted

Repository metrics

Stars
 (15,634 stars)
PR merge metrics
 (PR metrics pending)

Description

Provide a general summary of the issue here

I'm trying to validate a date range selection using the isInvalid prop inside the onChange callback of the DateRangePicker. However, isInvalid does not seem to be accessible there. I need to conditionally run logic based on whether the selection is valid.

Is there a correct way to do this behaviour? I must not be the first one to want to check for validity before using the value in the onChange.

🤔 Expected Behavior?

isInvalid should be available inside the onChange handler or via another mechanism during date selection.

😯 Current Behavior

Can only access the isInvalid prop from children of the DateRangePicker element.

💁 Possible Solution

No response

🔦 Context

No response

🖥️ Steps to Reproduce

import { parseDate } from "@internationalized/date"
import { CalendarIcon } from "lucide-react"

import { Button } from "@/registry/default/ui/button"
import {
  CalendarCell,
  CalendarGrid,
  CalendarGridBody,
  CalendarGridHeader,
  CalendarHeaderCell,
  CalendarHeading,
  RangeCalendar,
} from "@/registry/default/ui/calendar"
import {
  DatePickerContent,
  DateRangePicker,
} from "@/registry/default/ui/date-picker"
import { DateInput } from "@/registry/default/ui/datefield"
import { FieldGroup, Label } from "@/registry/default/ui/field"

export default function DateRangePickerDemo() {
  return (
    <DateRangePicker
      className="min-w-[320px] space-y-1"
      onChange={() => {
        console.log("Check validity here")
      }}
      maxValue={parseDate("2023-10-01")} //Should trigger validation
    >
      {(props) => {
        console.log("isInvalid", props.isInvalid)
        return (
          <>
            <Label>Date range</Label>
            <FieldGroup>
              <DateInput variant="ghost" slot={"start"} />
              <span aria-hidden className="px-2 text-sm text-muted-foreground">
                -
              </span>
              <DateInput className="flex-1" variant="ghost" slot={"end"} />

              <Button
                variant="ghost"
                size="icon"
                className="mr-1 size-6 data-[focus-visible]:ring-offset-0"
              >
                <CalendarIcon aria-hidden className="size-4" />
              </Button>
            </FieldGroup>
            <DatePickerContent>
              <RangeCalendar>
                <CalendarHeading />
                <CalendarGrid>
                  <CalendarGridHeader>
                    {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}
                  </CalendarGridHeader>
                  <CalendarGridBody>
                    {(date) => <CalendarCell date={date} />}
                  </CalendarGridBody>
                </CalendarGrid>
              </RangeCalendar>
            </DatePickerContent>
          </>
        )
      }}
    </DateRangePicker>
  )
}

Version

"react-aria-components": "^1.6.0",

What browsers are you seeing the problem on?

Chrome

If other, please specify.

No response

What operating system are you using?

Windows

🧢 Your Company/Team

No response

🕷 Tracking Issue

No response

Contributor guide