fix: send correct values to create booking

This commit is contained in:
Christel Westerberg
2024-11-05 16:41:13 +01:00
parent 591cfc7e13
commit 6d051629d3
6 changed files with 70 additions and 51 deletions

View File

@@ -1,8 +1,7 @@
import { z } from "zod"
export const bedTypeSchema = z.object({
description: z.string(),
roomTypeCode: z.string(),
bedType: z.object({ description: z.string(), roomTypeCode: z.string() }),
})
export const bedTypeFormSchema = z.object({
bedType: z.string(),

View File

@@ -1,8 +1,9 @@
"use client"
import { zodResolver } from "@hookform/resolvers/zod"
import { isValidPhoneNumber, parsePhoneNumber } from "libphonenumber-js"
import { useRouter, useSearchParams } from "next/navigation"
import { useEffect, useMemo, useState } from "react"
import { useEffect, useState } from "react"
import { Label as AriaLabel } from "react-aria-components"
import { FormProvider, useForm } from "react-hook-form"
import { useIntl } from "react-intl"
@@ -36,7 +37,9 @@ import { PaymentFormData, paymentSchema } from "./schema"
import styles from "./payment.module.css"
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
import { PaymentProps } from "@/types/components/hotelReservation/selectRate/section"
import { BreakfastPackageEnum } from "@/types/enums/breakfast"
const maxRetries = 40
const retryInterval = 2000
@@ -55,8 +58,22 @@ export default function Payment({
const lang = useLang()
const intl = useIntl()
const queryParams = useSearchParams()
const { firstName, lastName, email, phoneNumber, countryCode } =
useEnterDetailsStore((state) => state.userData)
const { userData, roomData } = useEnterDetailsStore((state) => ({
userData: state.userData,
roomData: state.roomData,
}))
const {
firstName,
lastName,
email,
phoneNumber,
countryCode,
breakfast,
bedType,
} = userData
const { toDate, fromDate, rooms: rooms, hotel } = roomData
const [confirmationNumber, setConfirmationNumber] = useState<string>("")
const methods = useForm<PaymentFormData>({
@@ -114,34 +131,46 @@ export default function Payment({
(card) => card.id === data.paymentMethod
)
let phone: string
let phoneCountryCodePrefix: string | null = null
if (isValidPhoneNumber(phoneNumber)) {
const parsedPhone = parsePhoneNumber(phoneNumber)
phone = parsedPhone.nationalNumber
phoneCountryCodePrefix = parsedPhone.countryCallingCode
} else {
phone = phoneNumber
}
initiateBooking.mutate({
hotelId: hotelId,
checkInDate: "2024-12-10",
checkOutDate: "2024-12-11",
rooms: [
{
adults: 1,
childrenAges: [],
rateCode: "SAVEEU",
roomTypeCode: "QC",
guest: {
title: "Mr", // TODO: do we need title?
firstName,
lastName,
email,
phoneCountryCodePrefix: phoneNumber.slice(0, 3),
phoneNumber: phoneNumber.slice(3),
countryCode,
},
packages: {
breakfast: true,
allergyFriendly: true,
petFriendly: true,
accessibility: true,
},
smsConfirmationRequested: data.smsConfirmation,
checkInDate: fromDate,
checkOutDate: toDate,
rooms: rooms.map((room) => ({
adults: room.adults,
children: room.children,
rateCode: room.rateCode,
roomTypeCode: bedType!.roomTypeCode,
guest: {
title: "", // TODO: do we need title?
firstName,
lastName,
email,
phoneCountryCodePrefix,
phoneNumber: phone,
countryCode,
},
],
packages: {
breakfast: breakfast !== BreakfastPackageEnum.NO_BREAKFAST,
allergyFriendly:
room.packages?.includes(RoomPackageCodeEnum.ALLERGY_ROOM) ?? false,
petFriendly:
room.packages?.includes(RoomPackageCodeEnum.PET_ROOM) ?? false,
accessibility:
room.packages?.includes(RoomPackageCodeEnum.ALLERGY_ROOM) ?? false,
},
smsConfirmationRequested: data.smsConfirmation,
})),
payment: {
paymentMethod,
card: savedCreditCard
@@ -151,12 +180,7 @@ export default function Payment({
cardType: savedCreditCard.cardType,
}
: undefined,
cardHolder: {
email: "test.user@scandichotels.com",
name: "Test User",
phoneCountryCode: "",
phoneSubscriber: "",
},
success: `${env.NEXT_PUBLIC_PAYMENT_CALLBACK_URL}/${lang}/success`,
error: `${env.NEXT_PUBLIC_PAYMENT_CALLBACK_URL}/${lang}/error${allQueryParams}`,
cancel: `${env.NEXT_PUBLIC_PAYMENT_CALLBACK_URL}/${lang}/cancel${allQueryParams}`,

View File

@@ -18,7 +18,7 @@ const roomsSchema = z.array(
firstName: z.string(),
lastName: z.string(),
email: z.string().email(),
phoneCountryCodePrefix: z.string(),
phoneCountryCodePrefix: z.string().nullable(),
phoneNumber: z.string(),
countryCode: z.string(),
membershipNumber: z.string().optional(),
@@ -42,12 +42,14 @@ const paymentSchema = z.object({
cardType: z.string(),
})
.optional(),
cardHolder: z.object({
email: z.string().email(),
name: z.string(),
phoneCountryCode: z.string(),
phoneSubscriber: z.string(),
}),
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(),

View File

@@ -19,4 +19,4 @@ export type BedTypeProps = {
export interface BedTypeFormSchema extends z.output<typeof bedTypeFormSchema> {}
export interface BedTypeSchema extends z.output<typeof bedTypeSchema> {}
export type BedTypeSchema = z.output<typeof bedTypeSchema>["bedType"]

View File

@@ -1,10 +1,5 @@
import { BedTypeEnum } from "../../bookingWidget/enums"
import { RoomPackageCodeEnum } from "../selectRate/roomFilter"
interface Child {
bed: BedTypeEnum
age: number
}
import { Child } from "../selectRate/selectRate"
interface Room {
adults: number

View File

@@ -28,7 +28,6 @@ export interface BreakfastSelectionProps extends SectionProps {
export interface DetailsProps extends SectionProps {}
export interface PaymentProps {
hotelId: string
otherPaymentOptions: string[]
savedCreditCards: CreditCard[] | null
mustBeGuaranteed: boolean