'use client'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; // Define the schema using Zod const eventSchema = z .object({ name: z.string().min(1, { message: 'Event name is required' }), description: z.string().min(1, { message: 'Description is required' }), capacity: z .number({ invalid_type_error: 'Capacity must be a number' }) .min(1, { message: 'Capacity must be at least 1' }) .refine(Number.isInteger, { message: 'Capacity must be an integer' }), ticketPrice: z .number({ invalid_type_error: 'Ticket price must be a number' }) .min(0, { message: 'Ticket price must be at least 0' }), location: z.string().min(1, { message: 'Location is required' }), eventStartTime: z.preprocess( (val) => typeof val === 'string' && val !== '' ? new Date(val) : undefined, z .date({ required_error: 'Event start time is required' }) .min(new Date(), { message: 'Event start time must be in the future' }) ), eventEndTime: z.preprocess( (val) => typeof val === 'string' && val !== '' ? new Date(val) : undefined, z.date().optional() ), images: z.preprocess( (val) => { if (Array.isArray(val)) { // Filter out empty strings return val.filter((v) => v !== ''); } return []; }, z .array(z.string().url({ message: 'Invalid image URL format' })) .optional() ), }) .superRefine((data, ctx) => { if (data.eventEndTime && data.eventEndTime <= data.eventStartTime) { ctx.addIssue({ code: 'custom', message: 'Event end time must be after the start time', path: ['eventEndTime'], }); } }); // Define the TypeScript type based on the Zod schema export type EventFormData = z.infer; interface EventFormProps { onSubmit: (data: EventFormData) => void; } const EventForm = ({ onSubmit }: EventFormProps) => { const [imageFields, setImageFields] = useState(['']); const { register, handleSubmit, formState: { errors }, setValue, watch, } = useForm({ resolver: zodResolver(eventSchema), mode: 'onChange', defaultValues: { images: [''], }, }); const images = watch('images') || []; const handleAddImageField = () => { setImageFields((prev) => [...prev, '']); }; const handleRemoveImageField = (index: number) => { const updatedImages = [...imageFields]; updatedImages.splice(index, 1); setImageFields(updatedImages); // Also update the form values setValue('images', updatedImages); }; return (
{/* Name Field */}
{errors.name &&

{errors.name.message}

}
{/* Description Field */}