Feat/SW-755 price change non happy * fix(SW-755): dont show field error if checkbox has no children * feat(SW-755): Price change route + dialog WIP * fix(SW-755): minor refactoring * fix(SW-755): added logging to price change route * fix(SW-755): remove redundant search param logic * fix(SW-755): moved enum cast to zod instead * fix(SW-755): move prop type to types folder * fix(SW-755): Added suspense to Payment and refactored payment options hook * fix(SW-755): seperated terms and conditions copy from the checkbox label * fix(SW-755): add currency format and fixed wrong translation * fix(SW-755): change from undefined to null * fix(SW-755): added extra type safety to payment options Approved-by: Christian Andolf Approved-by: Simon.Emanuelsson
98 lines
2.3 KiB
TypeScript
98 lines
2.3 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { ChildBedTypeEnum } from "@/constants/booking"
|
|
|
|
const signupSchema = z.discriminatedUnion("becomeMember", [
|
|
z.object({
|
|
dateOfBirth: z.string(),
|
|
postalCode: z.string(),
|
|
becomeMember: z.literal<boolean>(true),
|
|
}),
|
|
z.object({ becomeMember: z.literal<boolean>(false) }),
|
|
])
|
|
|
|
const roomsSchema = z.array(
|
|
z.object({
|
|
adults: z.number().int().nonnegative(),
|
|
childrenAges: z
|
|
.array(
|
|
z.object({
|
|
age: z.number().int().nonnegative(),
|
|
bedType: z.nativeEnum(ChildBedTypeEnum),
|
|
})
|
|
)
|
|
.default([]),
|
|
rateCode: z.string(),
|
|
roomTypeCode: z.coerce.string(),
|
|
guest: z.intersection(
|
|
z.object({
|
|
firstName: z.string(),
|
|
lastName: z.string(),
|
|
email: z.string().email(),
|
|
phoneNumber: z.string(),
|
|
countryCode: z.string(),
|
|
membershipNumber: z.string().optional(),
|
|
}),
|
|
signupSchema
|
|
),
|
|
smsConfirmationRequested: z.boolean(),
|
|
packages: z.object({
|
|
breakfast: z.boolean(),
|
|
allergyFriendly: z.boolean(),
|
|
petFriendly: z.boolean(),
|
|
accessibility: z.boolean(),
|
|
}),
|
|
roomPrice: z.object({
|
|
publicPrice: z.number().or(z.string().transform((val) => Number(val))),
|
|
memberPrice: z
|
|
.number()
|
|
.or(z.string().transform((val) => Number(val)))
|
|
.optional(),
|
|
}),
|
|
})
|
|
)
|
|
|
|
const paymentSchema = z.object({
|
|
paymentMethod: z.string(),
|
|
card: z
|
|
.object({
|
|
alias: z.string(),
|
|
expiryDate: z.string(),
|
|
cardType: z.string(),
|
|
})
|
|
.optional(),
|
|
cardHolder: z
|
|
.object({
|
|
email: z.string().email(),
|
|
name: z.string(),
|
|
phoneCountryCode: z.string(),
|
|
phoneSubscriber: z.string(),
|
|
})
|
|
.optional(),
|
|
success: z.string(),
|
|
error: z.string(),
|
|
cancel: z.string(),
|
|
})
|
|
|
|
// Mutation
|
|
export const createBookingInput = z.object({
|
|
hotelId: z.string(),
|
|
checkInDate: z.string(),
|
|
checkOutDate: z.string(),
|
|
rooms: roomsSchema,
|
|
payment: paymentSchema,
|
|
})
|
|
|
|
export const priceChangeInput = z.object({
|
|
confirmationNumber: z.string(),
|
|
})
|
|
|
|
// Query
|
|
const confirmationNumberInput = z.object({
|
|
confirmationNumber: z.string(),
|
|
})
|
|
|
|
export const bookingConfirmationInput = confirmationNumberInput
|
|
|
|
export const getBookingStatusInput = confirmationNumberInput
|