import { useEffect } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import type { Visit, VisitCreateInput } from '../types'; import { useCreateVisitMutation, useUpdateVisitMutation } from '../hooks/useVisitQueries'; import { useVisitDrawerStore } from '../../../state/useVisitDrawerStore'; import { useTranslation } from 'react-i18next'; const visitFormSchema = z .object({ country: z.string().min(1, 'validation.countryRequired'), city: z.string().optional(), start: z.string().min(1, 'validation.startDateRequired'), end: z.string().optional(), notes: z.string().optional(), lat: z.number(), lng: z.number() }) .refine( (data) => { if (!data.end) return true; return new Date(data.end) >= new Date(data.start); }, { message: 'validation.endAfterStart', path: ['end'] } ); type VisitFormSchema = z.infer; interface VisitFormProps { editingVisit?: Visit | null; onCompleted?: () => void; } export function VisitForm({ editingVisit, onCompleted }: VisitFormProps) { const closeDrawer = useVisitDrawerStore((state) => state.close); const initialLocation = useVisitDrawerStore((state) => state.initialLocation); const { t } = useTranslation(); const createMutation = useCreateVisitMutation(); const updateMutation = useUpdateVisitMutation(); const { register, handleSubmit, setValue, formState: { errors, isSubmitting, isSubmitSuccessful } } = useForm({ resolver: zodResolver(visitFormSchema), defaultValues: { country: editingVisit?.location.country ?? '', city: editingVisit?.location.city ?? '', start: editingVisit?.date.start ?? '', end: editingVisit?.date.end ?? '', notes: editingVisit?.notes ?? '', lat: editingVisit?.location.lat ?? initialLocation?.lat ?? 0, lng: editingVisit?.location.lng ?? initialLocation?.lng ?? 0 } }); useEffect(() => { if (initialLocation && !editingVisit) { setValue('lat', initialLocation.lat); setValue('lng', initialLocation.lng); } }, [initialLocation, editingVisit, setValue]); useEffect(() => { if (isSubmitSuccessful) { closeDrawer(); onCompleted?.(); } }, [isSubmitSuccessful, closeDrawer, onCompleted]); async function onSubmit(values: VisitFormSchema) { const payload: VisitCreateInput = { location: { country: values.country, city: values.city, lat: values.lat, lng: values.lng }, date: { start: values.start, end: values.end || undefined }, notes: values.notes || undefined }; if (editingVisit) { await updateMutation.mutateAsync({ id: editingVisit.id, data: { ...payload, location: payload.location, date: payload.date } }); return; } await createMutation.mutateAsync(payload); } return (
{errors.country ? (

{t(errors.country.message ?? '')}

) : null}
{errors.city ?

{t(errors.city.message ?? '')}

: null}
{errors.start ?

{t(errors.start.message ?? '')}

: null}
{errors.end ?

{t(errors.end.message ?? '')}

: null}