Fix/SW-1145 occupancy room api change * fix(SW-1145): change occupancy to min and max * fix(SW-1145): small edit * fix(SW-1145): refactor to transform total room occupancy * fix(SW-1145): remove space * fix(SW-1145): small fix * fix(SW-1145): change to max for readability Approved-by: Erik Tiekstra Approved-by: Linus Flood
123 lines
3.1 KiB
TypeScript
123 lines
3.1 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { BedTypeEnum, ExtraBedTypeEnum } from "@/constants/booking"
|
|
|
|
import { imageSchema } from "./image"
|
|
|
|
const roomContentSchema = z.object({
|
|
images: z.array(imageSchema),
|
|
texts: z.object({
|
|
descriptions: z.object({
|
|
short: z.string().optional(),
|
|
medium: z.string().optional(),
|
|
}),
|
|
}),
|
|
})
|
|
|
|
const roomTypesSchema = z.object({
|
|
name: z.string(),
|
|
description: z.string(),
|
|
code: z.string(),
|
|
roomCount: z.number(),
|
|
mainBed: z
|
|
.object({
|
|
type: z.string(),
|
|
description: z.string(),
|
|
widthRange: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
})
|
|
.transform((data) => ({
|
|
type:
|
|
data.type in BedTypeEnum
|
|
? (data.type as BedTypeEnum)
|
|
: BedTypeEnum.Other,
|
|
description: data.description,
|
|
widthRange: data.widthRange,
|
|
})),
|
|
fixedExtraBed: z
|
|
.object({
|
|
type: z.string(),
|
|
description: z.string().optional(),
|
|
widthRange: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
})
|
|
.transform((data) => {
|
|
return data.type in ExtraBedTypeEnum
|
|
? {
|
|
type: data.type as ExtraBedTypeEnum,
|
|
description: data.description,
|
|
}
|
|
: undefined
|
|
}),
|
|
roomSize: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
occupancy: z.object({
|
|
total: z.number(),
|
|
adults: z.number(),
|
|
children: z.number(),
|
|
}),
|
|
isLackingCribs: z.boolean(),
|
|
isLackingExtraBeds: z.boolean(),
|
|
})
|
|
|
|
const roomFacilitiesSchema = z.object({
|
|
availableInAllRooms: z.boolean(),
|
|
name: z.string(),
|
|
isUniqueSellingPoint: z.boolean(),
|
|
sortOrder: z.number(),
|
|
icon: z.string().optional(),
|
|
})
|
|
|
|
export const roomSchema = z
|
|
.object({
|
|
attributes: z.object({
|
|
name: z.string(),
|
|
sortOrder: z.number(),
|
|
content: roomContentSchema,
|
|
roomTypes: z.array(roomTypesSchema),
|
|
roomFacilities: z.array(roomFacilitiesSchema),
|
|
occupancy: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
roomSize: z.object({
|
|
min: z.number(),
|
|
max: z.number(),
|
|
}),
|
|
}),
|
|
id: z.string(),
|
|
type: z.literal("roomcategories"),
|
|
})
|
|
.transform((data) => {
|
|
return {
|
|
descriptions: data.attributes.content.texts.descriptions,
|
|
id: data.id,
|
|
images: data.attributes.content.images,
|
|
name: data.attributes.name,
|
|
occupancy: data.attributes.occupancy,
|
|
totalOccupancy:
|
|
data.attributes.occupancy.min === data.attributes.occupancy.max
|
|
? {
|
|
max: data.attributes.occupancy.max,
|
|
range: `${data.attributes.occupancy.max}`,
|
|
}
|
|
: {
|
|
max: data.attributes.occupancy.max,
|
|
range: `${data.attributes.occupancy.min}-${data.attributes.occupancy.max}`,
|
|
},
|
|
roomSize: data.attributes.roomSize,
|
|
roomTypes: data.attributes.roomTypes,
|
|
sortOrder: data.attributes.sortOrder,
|
|
type: data.type,
|
|
roomFacilities: data.attributes.roomFacilities,
|
|
}
|
|
})
|
|
|
|
export type RoomType = Pick<z.output<typeof roomSchema>, "roomTypes" | "name">
|