50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { productSchema } from "./product"
|
|
|
|
import { AvailabilityEnum } from "@/types/components/hotelReservation/selectHotel/selectHotel"
|
|
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
|
|
|
|
export const roomConfigurationSchema = z
|
|
.object({
|
|
breakfastIncludedInAllRatesMember: z.boolean().default(false),
|
|
breakfastIncludedInAllRatesPublic: z.boolean().default(false),
|
|
features: z
|
|
.array(
|
|
z.object({
|
|
inventory: z.number(),
|
|
code: z.enum([
|
|
RoomPackageCodeEnum.PET_ROOM,
|
|
RoomPackageCodeEnum.ALLERGY_ROOM,
|
|
RoomPackageCodeEnum.ACCESSIBILITY_ROOM,
|
|
]),
|
|
})
|
|
)
|
|
.default([]),
|
|
products: z.array(productSchema).default([]),
|
|
roomsLeft: z.number(),
|
|
roomType: z.string(),
|
|
roomTypeCode: z.string(),
|
|
status: z.string(),
|
|
})
|
|
.transform((data) => {
|
|
if (data.products.length) {
|
|
/**
|
|
* Just guaranteeing that if all products all miss
|
|
* both public and member rateCode that status is
|
|
* set to `NotAvailable`
|
|
*/
|
|
const allProductsMissBothRateCodes = data.products.every(
|
|
(product) => !product.public?.rateCode && !product.member?.rateCode
|
|
)
|
|
if (allProductsMissBothRateCodes) {
|
|
return {
|
|
...data,
|
|
status: AvailabilityEnum.NotAvailable,
|
|
}
|
|
}
|
|
}
|
|
|
|
return data
|
|
})
|