import { z } from "zod" import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" import type { Location } from "@/types/trpc/routers/hotel/locations" export const guestRoomSchema = z .object({ adults: z.number().default(1), child: z .array( z.object({ age: z.number().min(0, "Age is required"), bed: z.number().min(0, "Bed choice is required"), }) ) .default([]), }) .superRefine((value, ctx) => { const childrenInAdultsBed = value.child.filter( (c) => c.bed === ChildBedMapEnum.IN_ADULTS_BED ) if (value.adults < childrenInAdultsBed.length) { const lastAdultBedIndex = value.child .map((c) => c.bed) .lastIndexOf(ChildBedMapEnum.IN_ADULTS_BED) ctx.addIssue({ code: z.ZodIssueCode.custom, message: "You cannot have more children in adults bed than adults in the room", path: ["child", lastAdultBedIndex], }) } }) export const guestRoomsSchema = z.array(guestRoomSchema) export const bookingWidgetSchema = z.object({ bookingCode: z.string(), // Update this as required when working with booking codes component date: z.object({ // Update this as required once started working with Date picker in Nights component fromDate: z.string(), toDate: z.string(), }), location: z.string().refine( (value) => { if (value) { const parsedValue: Location = JSON.parse(decodeURIComponent(value)) switch (parsedValue?.type) { case "cities": case "hotels": return true default: return false } } }, { message: "Required" } ), redemption: z.boolean().default(false), rooms: guestRoomsSchema, search: z.string({ coerce: true }).min(1, "Required"), voucher: z.boolean().default(false), })