From e544feaa36796cc9ddf3554306eb25018b64f35d Mon Sep 17 00:00:00 2001 From: Christian Andolf Date: Wed, 16 Apr 2025 09:59:16 +0200 Subject: [PATCH] fix(SW-2385): add booking widget error messages --- .../components/Forms/BookingWidget/schema.ts | 55 ++++++++++--------- .../TempDesignSystem/Form/Input/errors.ts | 40 ++++++++++++++ 2 files changed, 70 insertions(+), 25 deletions(-) diff --git a/apps/scandic-web/components/Forms/BookingWidget/schema.ts b/apps/scandic-web/components/Forms/BookingWidget/schema.ts index b50e77e91..4d3d71468 100644 --- a/apps/scandic-web/components/Forms/BookingWidget/schema.ts +++ b/apps/scandic-web/components/Forms/BookingWidget/schema.ts @@ -4,14 +4,27 @@ import { REDEMPTION } from "@/constants/booking" import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums" +export const bookingWidgetErrors = { + AGE_REQUIRED: "AGE_REQUIRED", + BED_CHOICE_REQUIRED: "BED_CHOICE_REQUIRED", + CHILDREN_EXCEEDS_ADULTS: "CHILDREN_EXCEEDS_ADULTS", + BOOKING_CODE_INVALID: "BOOKING_CODE_INVALID", + REQUIRED: "REQUIRED", + DESTINATION_REQUIRED: "DESTINATION_REQUIRED", + MULTIROOM_BOOKING_CODE_UNAVAILABLE: "MULTIROOM_BOOKING_CODE_UNAVAILABLE", + MULTIROOM_REWARD_NIGHT_UNAVAILABLE: "MULTIROOM_REWARD_NIGHT_UNAVAILABLE", + CODE_VOUCHER_REWARD_NIGHT_UNAVAILABLE: + "CODE_VOUCHER_REWARD_NIGHT_UNAVAILABLE", +} as const + export const guestRoomSchema = z .object({ adults: z.number().default(1), childrenInRoom: z .array( z.object({ - age: z.number().min(0, "Age is required"), - bed: z.number().min(0, "Bed choice is required"), + age: z.number().min(0, bookingWidgetErrors.AGE_REQUIRED), + bed: z.number().min(0, bookingWidgetErrors.BED_CHOICE_REQUIRED), }) ) .default([]), @@ -27,8 +40,7 @@ export const guestRoomSchema = z ctx.addIssue({ code: z.ZodIssueCode.custom, - message: - "You cannot have more children in adults bed than adults in the room", + message: bookingWidgetErrors.CHILDREN_EXCEEDS_ADULTS, path: ["childrenInRoom", lastAdultBedIndex], }) } @@ -41,19 +53,12 @@ export const bookingCodeSchema = z value: z .string() .refine( - (value) => { - if ( - !value || - /(^D\d*$)|(^DSH[0-9a-z]*$)|(^L\d*$)|(^LH[0-9a-z]*$)|(^B[a-z]{3}\d{6})|(^VO[0-9a-z]*$)|^[0-9a-z]*$/i.test( - value - ) - ) { - return true - } else { - return false - } - }, - { message: "Invalid booking code" } + (value) => + !value || + /(^D\d*$)|(^DSH[0-9a-z]*$)|(^L\d*$)|(^LH[0-9a-z]*$)|(^B[a-z]{3}\d{6})|(^VO[0-9a-z]*$)|^[0-9a-z]*$/i.test( + value + ), + { message: bookingWidgetErrors.BOOKING_CODE_INVALID } ) .default(""), remember: z.boolean().default(false), @@ -71,7 +76,7 @@ export const bookingWidgetSchema = z }), redemption: z.boolean().default(false), rooms: guestRoomsSchema, - search: z.string({ coerce: true }).min(1, "Required"), + search: z.string({ coerce: true }).min(1, bookingWidgetErrors.REQUIRED), selectedSearch: z.string().optional(), hotel: z.number().optional(), city: z.string().optional(), @@ -80,43 +85,43 @@ export const bookingWidgetSchema = z if (!value.hotel && !value.city) { ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Destination required", + message: bookingWidgetErrors.DESTINATION_REQUIRED, path: ["search"], }) } if (value.rooms.length > 1 && value.bookingCode?.value.startsWith("VO")) { ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Multi-room booking is not available with this booking code.", + message: bookingWidgetErrors.MULTIROOM_BOOKING_CODE_UNAVAILABLE, path: ["bookingCode.value"], }) ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Multi-room booking is not available with this booking code.", + message: bookingWidgetErrors.MULTIROOM_BOOKING_CODE_UNAVAILABLE, path: ["rooms"], }) } if (value.rooms.length > 1 && value.redemption) { ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Multi-room booking is not available with reward night.", + message: bookingWidgetErrors.MULTIROOM_REWARD_NIGHT_UNAVAILABLE, path: [REDEMPTION], }) ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Multi-room booking is not available with reward night.", + message: bookingWidgetErrors.MULTIROOM_REWARD_NIGHT_UNAVAILABLE, path: ["rooms"], }) } if (value.bookingCode?.value && value.redemption) { ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Code and voucher is not available with reward night.", + message: bookingWidgetErrors.CODE_VOUCHER_REWARD_NIGHT_UNAVAILABLE, path: [REDEMPTION], }) ctx.addIssue({ code: z.ZodIssueCode.custom, - message: "Code and voucher is not available with reward night.", + message: bookingWidgetErrors.CODE_VOUCHER_REWARD_NIGHT_UNAVAILABLE, path: ["bookingCode.value"], }) } diff --git a/apps/scandic-web/components/TempDesignSystem/Form/Input/errors.ts b/apps/scandic-web/components/TempDesignSystem/Form/Input/errors.ts index 697873b40..d2d95c37c 100644 --- a/apps/scandic-web/components/TempDesignSystem/Form/Input/errors.ts +++ b/apps/scandic-web/components/TempDesignSystem/Form/Input/errors.ts @@ -1,3 +1,4 @@ +import { bookingWidgetErrors } from "@/components/Forms/BookingWidget/schema" import { editProfileErrors } from "@/components/Forms/Edit/Profile/schema" import { signupErrors } from "@/components/Forms/Signup/schema" import { multiroomErrors } from "@/components/HotelReservation/EnterDetails/Details/Multiroom/schema" @@ -16,6 +17,10 @@ export function getErrorMessage(intl: IntlShape, errorCode?: string) { return intl.formatMessage({ defaultMessage: "Invalid booking number", }) + case bookingWidgetErrors.BOOKING_CODE_INVALID: + return intl.formatMessage({ + defaultMessage: "Booking code is invalid", + }) case findMyBookingErrors.FIRST_NAME_REQUIRED: case signupErrors.FIRST_NAME_REQUIRED: case multiroomErrors.FIRST_NAME_REQUIRED: @@ -115,6 +120,41 @@ export function getErrorMessage(intl: IntlShape, errorCode?: string) { return intl.formatMessage({ defaultMessage: "Invalid membership number format", }) + case bookingWidgetErrors.AGE_REQUIRED: + return intl.formatMessage({ + defaultMessage: "Age is required", + }) + case bookingWidgetErrors.BED_CHOICE_REQUIRED: + return intl.formatMessage({ + defaultMessage: "Bed choice is required", + }) + case bookingWidgetErrors.CHILDREN_EXCEEDS_ADULTS: + return intl.formatMessage({ + defaultMessage: + "You cannot have more children in adults bed than adults in the room", + }) + case bookingWidgetErrors.REQUIRED: + return intl.formatMessage({ + defaultMessage: "Required", + }) + case bookingWidgetErrors.DESTINATION_REQUIRED: + return intl.formatMessage({ + defaultMessage: "Destination required", + }) + case bookingWidgetErrors.MULTIROOM_BOOKING_CODE_UNAVAILABLE: + return intl.formatMessage({ + defaultMessage: + "Multi-room booking is not available with this booking code.", + }) + case bookingWidgetErrors.MULTIROOM_REWARD_NIGHT_UNAVAILABLE: + return intl.formatMessage({ + defaultMessage: + "Multi-room booking is not available with reward night.", + }) + case bookingWidgetErrors.CODE_VOUCHER_REWARD_NIGHT_UNAVAILABLE: + return intl.formatMessage({ + defaultMessage: "Code and voucher is not available with reward night.", + }) default: console.warn("Error code not supported:", errorCode) return errorCode