shadcn-ui / ui

Beautifully designed components that you can copy and paste into your apps. Accessible. Customizable. Open Source.
https://ui.shadcn.com
MIT License
71.13k stars 4.28k forks source link

Error with onSelect in Calendar with react-hook-form? #731

Closed dBianchii closed 3 months ago

dBianchii commented 1 year ago

I am trying to use the Calendar picker with react hook form. At the end of this page they have an example of how to do it - https://ui.shadcn.com/docs/components/date-picker#react-hook-form

I copied the exact same page to my vscode, but I keep getting this error:

Type '(event: Date | ChangeEvent<Element>) => void' is not assignable to type 'SelectSingleEventHandler'.
  Types of parameters 'event' and 'day' are incompatible.
    Type 'Date | undefined' is not assignable to type 'Date | ChangeEvent<Element>'.
      Type 'undefined' is not assignable to type 'Date | ChangeEvent<Element>'.ts(2322)

image image

Here's the full code:

"use client";

import { zodResolver } from "@hookform/resolvers/zod";
import { format } from "date-fns";
import { CalendarIcon } from "lucide-react";
import { useForm } from "react-hook-form";
import * as z from "zod";

import { cn } from "@ui/lib/utils";
import { Button } from "@/components/ui/button";
import { Calendar } from "@/components/ui/calendar";
import {
  Form,
  FormControl,
  FormDescription,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/components/ui/form";
import {
  Popover,
  PopoverContent,
  PopoverTrigger,
} from "@/components/ui/popover";
import { toast } from "@/components/ui/use-toast";

const FormSchema = z.object({
  dob: z.date({
    required_error: "A date of birth is required.",
  }),
});

export function DatePickerForm() {
  const form = useForm<z.infer<typeof FormSchema>>({
    resolver: zodResolver(FormSchema),
  });

  function onSubmit(data: z.infer<typeof FormSchema>) {
    toast({
      title: "You submitted the following values:",
      description: (
        <pre className="mt-2 w-[340px] rounded-md bg-slate-950 p-4">
          <code className="text-white">{JSON.stringify(data, null, 2)}</code>
        </pre>
      ),
    });
  }

  return (
    <Form {...form}>
      <form
        onSubmit={(e) => void form.handleSubmit(onSubmit)(e)}
        className="space-y-8"
      >
        <FormField
          control={form.control}
          name="dob"
          render={({ field }) => (
            <FormItem className="flex flex-col">
              <FormLabel>Date of birth</FormLabel>
              <Popover>
                <PopoverTrigger asChild>
                  <FormControl>
                    <Button
                      variant={"outline"}
                      className={cn(
                        "w-[240px] pl-3 text-left font-normal",
                        !field.value && "text-muted-foreground"
                      )}
                    >
                      {field.value ? (
                        format(field.value, "PPP")
                      ) : (
                        <span>Pick a date</span>
                      )}
                      <CalendarIcon className="ml-auto h-4 w-4 opacity-50" />
                    </Button>
                  </FormControl>
                </PopoverTrigger>
                <PopoverContent className="w-auto p-0" align="start">
                  <Calendar
                    mode="single"
                    selected={field.value}
                    onSelect={field.onChange}
                    disabled={(date) =>
                      date > new Date() || date < new Date("1900-01-01")
                    }
                    initialFocus
                  />
                </PopoverContent>
              </Popover>
              <FormDescription>
                Your date of birth is used to calculate your age.
              </FormDescription>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit">Submit</Button>
      </form>
    </Form>
  );
}
dBianchii commented 1 year ago

I managed to "fix" it by changing the onSelect to onDayClick

marcelblijleven commented 1 year ago

It's caused by an update in react-hook-form, pinning to 7.44.3 helps (see https://github.com/shadcn/ui/issues/735#issuecomment-1609416635)

oscartorres-10 commented 1 year ago

I managed to "fix" it by changing the onSelect to onDayClick

Thanks! This helped me to avoid that error. How did you get to making that change?

vitorschelb commented 11 months ago

I managed to "fix" it by changing the onSelect to onDayClick

Hero

shadcn commented 3 months ago

This issue has been automatically closed because it received no activity for a while. If you think it was closed by accident, please leave a comment. Thank you.

cy-alonzo commented 2 months ago

Hello! Is there an update for this? I encountered the same issue with the calendar component. my react-day-picker version: "react-day-picker": "^8.10.1",

image
CafeinoDev commented 2 weeks ago

@0xCyyy3000 selected={field.value ? new Date(field.value) : undefined}