Merged in fix/SW-3194-cross-validation-enter-details (pull request #2604)

fix(SW-3194): crossvalidation for multiroom enter details

* fix(SW-3194): crossvalidation for multiroom enter details

* fix(SW-3194): use getValues


Approved-by: Hrishikesh Vaipurkar
This commit is contained in:
Bianca Widstam
2025-08-08 11:50:14 +00:00
parent 329debf115
commit b704aa7936
5 changed files with 53 additions and 10 deletions

View File

@@ -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])

View File

@@ -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,

View File

@@ -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")

View File

@@ -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) => {

View File

@@ -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