import type {FunctionComponent, InputHTMLAttributes} from 'react' import {useId, useState} from 'react' import {CalendarIcon} from 'lucide-react' import {Popover, PopoverContent, PopoverTrigger} from '@/components/ui/popover' import {Button} from '@/components/ui/button' import {format} from 'date-fns' import {Calendar} from '@/components/ui/calendar' import {cn} from '@/lib/utils' import {Controller, useFormContext} from 'react-hook-form' import {Label} from '@/components/ui/label' import FormError from '@/components/form/formError' interface DatePickerProps extends Omit, 'defaultValue'> { name: string label: string defaultValue?: Date } const DatePicker: FunctionComponent = ({defaultValue, label, ...inputProps}) => { const form = useFormContext() const formDefault = form.getValues(inputProps.name) ? new Date(form.getValues(inputProps.name) as string) : undefined const [date, setDate] = useState(defaultValue ?? formDefault ?? undefined) const id = useId() return (
{}} /> {/** * De eerste keer dat het formulier gesubmit wordt, controleert Hook Form (via Zod) of er validatiefouten * zijn. Als dit het geval is, wordt de input een controlled component in plaats van een uncontrolled * component. Zo kan hookform validatiefouten verwijderen terwijl de gebruiker aan het typen is. * Dit werkt echter enkel als we de onChange handler van Hook Form gebruiken. * Deze wordt dan automatisch toegevoegd via de register functie. * Omdat we hier met een complexe component zitten, wordt die onChange functie echter nooit uitgevoerd. * * Een value change triggert de onChange niet als deze vanuit React gebeurd in plaats van via de browser, * bovenstaande input zal dus nooit een onChange triggeren. * * Om dit probleem op te lossen, gebruiken we de Controller uit Hook Form, dit is een wrapper die rond * complexere input elementen gezet kan worden om deze toch te koppelen aan Hook Form. */} ( { setDate(newDate) field.onChange(date ? new Date().toISOString() : newDate?.toISOString()) }} autoFocus /> )} />
) } export default DatePicker