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" import { z } from "zod"
export const bedTypeSchema = z.object({ export const bedTypeSchema = z.object({
description: z.string(), bedType: z.object({ description: z.string(), roomTypeCode: z.string() }),
roomTypeCode: z.string(),
}) })
export const bedTypeFormSchema = z.object({ export const bedTypeFormSchema = z.object({
bedType: z.string(), bedType: z.string(),

View File

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

View File

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

View File

@@ -19,4 +19,4 @@ export type BedTypeProps = {
export interface BedTypeFormSchema extends z.output<typeof bedTypeFormSchema> {} 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" import { RoomPackageCodeEnum } from "../selectRate/roomFilter"
import { Child } from "../selectRate/selectRate"
interface Child {
bed: BedTypeEnum
age: number
}
interface Room { interface Room {
adults: number adults: number

View File

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