When creating or updating events in Big Calendar, the event data must conform to the eventSchema. This schema ensures that all required fields are present and that the temporal logic (start time vs. end time) is valid.
Key constraints:
title and description must be non-empty strings.startDate and endDate must be valid Date objects.startTime and endTime are objects containing hour (number) and minute (number).color must be one of the following allowed values: "blue", "green", "red", "yellow", "purple", "orange", or "gray".- Temporal Validation: The combined start date/time must occur before the combined end date/time. If this condition fails, a validation error is returned on the
startDate path with the message "Start date cannot be after end date".
import { z } from "zod";
export const eventSchema = z
.object({
user: z.string(),
title: z.string().min(1, "Title is required"),
description: z.string().min(1, "Description is required"),
startDate: z.date({ required_error: "Start date is required" }),
startTime: z.object({ hour: z.number(), minute: z.number() }, { required_error: "Start time is required" }),
endDate: z.date({ required_error: "End date is required" }),
endTime: z.object({ hour: z.number(), minute: z.number() }, { required_error: "End time is required" }),
color: z.enum(["blue", "green", "red", "yellow", "purple", "orange", "gray"], { required_error: "Color is required" }),
})
.refine(
data => {
const startDateTime = new Date(data.startDate);
startDateTime.setHours(data.startTime.hour, data.startTime.minute, 0, 0);
const endDateTime = new Date(data.endDate);
endDateTime.setHours(data.endTime.hour, data.endTime.minute, 0, 0);
return startDateTime < endDateTime;
},
{
message: "Start date cannot be after end date",
path: ["startDate"],
}
);
export type TEventFormData = z.infer<typeof eventSchema>;