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
/>
)}
/>