diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/index.tsx index 63af2242c..5b79eed45 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/index.tsx @@ -37,7 +37,7 @@ export default function Details() { })) const { - actions: { updateDetails, setIncomplete }, + actions: { updateDetails, updatePartialGuestData, setIncomplete }, idx, room, roomNr, @@ -93,6 +93,7 @@ export default function Details() { formState: { isValid, errors }, setValue, watch, + getValues, } = methods const { trackFormSubmit } = useFormTracking( @@ -114,9 +115,21 @@ export default function Details() { if (isValid) { handleSubmit(updateDetails)() } else { + updatePartialGuestData({ + firstName: getValues("firstName")?.toString(), + lastName: getValues("lastName")?.toString(), + membershipNo: getValues("membershipNo")?.toString(), + }) setIncomplete() } - }, [handleSubmit, isValid, setIncomplete, updateDetails]) + }, [ + handleSubmit, + isValid, + setIncomplete, + updateDetails, + updatePartialGuestData, + getValues, + ]) useEffect(updateDetailsStore, [updateDetailsStore]) diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/schema.ts b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/schema.ts index 830513eb1..b0c0dca61 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/schema.ts +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/Multiroom/schema.ts @@ -26,8 +26,8 @@ export const multiroomErrors = { } as const export type CrossValidationData = { - firstName: string - lastName: string + firstName: string | undefined + lastName: string | undefined membershipNo: string | undefined } @@ -73,8 +73,8 @@ export function getMultiroomDetailsSchema( (data) => !crossValidationData.some( (room) => - room.firstName.toLowerCase() === data.firstName.toLowerCase() && - room.lastName.toLowerCase() === data.lastName.toLowerCase() + room.firstName?.toLowerCase() === data.firstName.toLowerCase() && + room.lastName?.toLowerCase() === data.lastName.toLowerCase() ), { message: multiroomErrors.FIRST_AND_LAST_NAME_UNIQUE, @@ -85,8 +85,8 @@ export function getMultiroomDetailsSchema( (data) => !crossValidationData.some( (room) => - room.firstName.toLowerCase() === data.firstName.toLowerCase() && - room.lastName.toLowerCase() === data.lastName.toLowerCase() + room.firstName?.toLowerCase() === data.firstName.toLowerCase() && + room.lastName?.toLowerCase() === data.lastName.toLowerCase() ), { message: multiroomErrors.FIRST_AND_LAST_NAME_UNIQUE, diff --git a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/RoomOne/index.tsx b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/RoomOne/index.tsx index d4c81a49f..f504d5e29 100644 --- a/apps/scandic-web/components/HotelReservation/EnterDetails/Details/RoomOne/index.tsx +++ b/apps/scandic-web/components/HotelReservation/EnterDetails/Details/RoomOne/index.tsx @@ -43,7 +43,7 @@ export default function Details({ user }: DetailsProps) { })) const { - actions: { updateDetails, setIncomplete }, + actions: { updateDetails, updatePartialGuestData, setIncomplete }, room, roomNr, idx, @@ -89,6 +89,7 @@ export default function Details({ user }: DetailsProps) { subscribe, setValue, watch, + getValues, } = methods const { trackFormSubmit } = useFormTracking( @@ -117,9 +118,21 @@ export default function Details({ user }: DetailsProps) { if (formState.isValid) { handleSubmit(onSubmit)() } else { + updatePartialGuestData({ + firstName: getValues("firstName")?.toString(), + lastName: getValues("lastName")?.toString(), + membershipNo: getValues("membershipNo")?.toString(), + }) setIncomplete() } - }, [handleSubmit, formState.isValid, onSubmit, setIncomplete]) + }, [ + handleSubmit, + formState.isValid, + onSubmit, + setIncomplete, + updatePartialGuestData, + getValues, + ]) useEffect(updateDetailsStore, [updateDetailsStore]) const countryCode = watch("countryCode") diff --git a/apps/scandic-web/stores/enter-details/index.ts b/apps/scandic-web/stores/enter-details/index.ts index 2467be355..3a434fa79 100644 --- a/apps/scandic-web/stores/enter-details/index.ts +++ b/apps/scandic-web/stores/enter-details/index.ts @@ -258,6 +258,21 @@ export function createDetailsStore( }) ) }, + updatePartialGuestData(data) { + return set( + produce((state: DetailsState) => { + const currentRoom = state.rooms[idx].room + + //Update only the parts that are relevant for cross-validation + if (data.firstName !== undefined) + currentRoom.guest.firstName = data.firstName + if (data.lastName !== undefined) + currentRoom.guest.lastName = data.lastName + if (data.membershipNo !== undefined) + currentRoom.guest.membershipNo = data.membershipNo + }) + ) + }, updateDetails(data) { return set( produce((state: DetailsState) => { diff --git a/apps/scandic-web/types/stores/enter-details.ts b/apps/scandic-web/types/stores/enter-details.ts index aced9125c..80ef9d0b3 100644 --- a/apps/scandic-web/types/stores/enter-details.ts +++ b/apps/scandic-web/types/stores/enter-details.ts @@ -17,6 +17,7 @@ import type { SignedInDetailsSchema, } from "@/types/components/hotelReservation/enterDetails/details" import type { StepEnum } from "@/types/enums/step" +import type { CrossValidationData } from "@/components/HotelReservation/EnterDetails/Details/Multiroom/schema" import type { Price } from "../components/hotelReservation/price" export interface InitialRoomData { @@ -64,6 +65,7 @@ export interface RoomState { updateJoin: (join: boolean) => void updatePriceForMembershipNo: (membershipNo: string, isValid: boolean) => void updateDetails: (data: DetailsSchema) => void + updatePartialGuestData: (data: CrossValidationData) => void } isComplete: boolean room: Room