"use client"; import { useForm } from "react-hook-form"; import { createEvent, updateEvent } from "@/actions/events"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { DateTimePicker } from "@/components/ui/date-time-picker"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Textarea } from "@/components/ui/textarea"; import { useServerAction } from "@/hooks/use-server-action"; import type { CreateEventInput } from "@/lib/validators/event"; interface EventType { id: number; name: string; slug: string; color: string; } interface EventFormProps { eventTypes: EventType[]; defaultValues?: Partial & { id?: number }; } export function EventForm({ eventTypes, defaultValues }: EventFormProps) { const { run, isPending } = useServerAction(); const isEditing = !!defaultValues?.id; const form = useForm({ defaultValues: { title: "", description: "", typeId: eventTypes[0]?.id, status: "draft", isRecurring: 0, ...defaultValues, }, }); // biome-ignore lint/suspicious/noExplicitAny: form values typed by useForm defaults; createEvent does its own zod validation function onSubmit(data: any) { if (isEditing && defaultValues?.id) { run(() => updateEvent({ id: defaultValues.id!, ...data }), { successMessage: "Event updated!", }); } else { run(() => createEvent(data), { successMessage: "Event created!", onSuccess: (result) => { const data = result.data as Record | undefined; if (data?.id) { window.location.href = `/admin/events/${data.id}`; } }, }); } } return (
{isEditing ? "Edit Event" : "Event Details"}
{form.formState.errors.title && (

{form.formState.errors.title.message}

)}