From 6d051629d3e7c5a8daaa7fb471f2b27646ee6845 Mon Sep 17 00:00:00 2001 From: Christel Westerberg Date: Tue, 5 Nov 2024 16:41:13 +0100 Subject: [PATCH] fix: send correct values to create booking --- .../EnterDetails/BedType/schema.ts | 3 +- .../EnterDetails/Payment/index.tsx | 92 ++++++++++++------- server/routers/booking/input.ts | 16 ++-- .../hotelReservation/enterDetails/bedType.ts | 2 +- .../enterDetails/bookingData.ts | 7 +- .../hotelReservation/selectRate/section.ts | 1 - 6 files changed, 70 insertions(+), 51 deletions(-) diff --git a/components/HotelReservation/EnterDetails/BedType/schema.ts b/components/HotelReservation/EnterDetails/BedType/schema.ts index 7433b39da..9567d8c7d 100644 --- a/components/HotelReservation/EnterDetails/BedType/schema.ts +++ b/components/HotelReservation/EnterDetails/BedType/schema.ts @@ -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(), diff --git a/components/HotelReservation/EnterDetails/Payment/index.tsx b/components/HotelReservation/EnterDetails/Payment/index.tsx index f4ea2b9f9..d6ac1ac33 100644 --- a/components/HotelReservation/EnterDetails/Payment/index.tsx +++ b/components/HotelReservation/EnterDetails/Payment/index.tsx @@ -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("") const methods = useForm({ @@ -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}`, diff --git a/server/routers/booking/input.ts b/server/routers/booking/input.ts index cbda7d3ef..0ea7f4476 100644 --- a/server/routers/booking/input.ts +++ b/server/routers/booking/input.ts @@ -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(), diff --git a/types/components/hotelReservation/enterDetails/bedType.ts b/types/components/hotelReservation/enterDetails/bedType.ts index 5553924dd..a222ece2b 100644 --- a/types/components/hotelReservation/enterDetails/bedType.ts +++ b/types/components/hotelReservation/enterDetails/bedType.ts @@ -19,4 +19,4 @@ export type BedTypeProps = { export interface BedTypeFormSchema extends z.output {} -export interface BedTypeSchema extends z.output {} +export type BedTypeSchema = z.output["bedType"] diff --git a/types/components/hotelReservation/enterDetails/bookingData.ts b/types/components/hotelReservation/enterDetails/bookingData.ts index 720dcff3a..6aad97085 100644 --- a/types/components/hotelReservation/enterDetails/bookingData.ts +++ b/types/components/hotelReservation/enterDetails/bookingData.ts @@ -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 diff --git a/types/components/hotelReservation/selectRate/section.ts b/types/components/hotelReservation/selectRate/section.ts index 85dc2a55d..66331816c 100644 --- a/types/components/hotelReservation/selectRate/section.ts +++ b/types/components/hotelReservation/selectRate/section.ts @@ -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