From d32a595e2eccf8fd33cd799c77ecff683a0d041c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20J=C3=A4derberg?= Date: Wed, 20 Nov 2024 11:25:11 +0100 Subject: [PATCH] feat: contain logic for selecting price at the top level instead of on individual room card --- .../SelectRate/HotelInfoCard/NoRoomsAlert.tsx | 6 +- .../RoomSelection/FlexibilityOption/index.tsx | 8 +- .../RoomSelection/RoomCard/index.tsx | 2 +- .../SelectRate/RoomSelection/index.tsx | 4 +- .../SelectRate/Rooms/index.tsx | 128 ++++++------------ .../selectRate/flexibilityOption.ts | 5 +- .../selectRate/hotelInfoCardProps.ts | 6 - .../hotelReservation/selectRate/roomCard.ts | 5 +- .../selectRate/roomSelection.ts | 5 +- 9 files changed, 63 insertions(+), 106 deletions(-) delete mode 100644 types/components/hotelReservation/selectRate/hotelInfoCardProps.ts diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx index bfca1364f..51578df8b 100644 --- a/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx +++ b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx @@ -40,14 +40,10 @@ export async function NoRoomsAlert({ }) ) - if (!availability) { + if (!availability || availabilityError) { return null } - if (availabilityError) { - // TODO: Handle error - } - const noRoomsAvailable = availability.roomConfigurations.reduce( (acc, room) => { return acc && room.status === "NotAvailable" diff --git a/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/index.tsx index 941d6257d..2194f8f35 100644 --- a/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/index.tsx +++ b/components/HotelReservation/SelectRate/RoomSelection/FlexibilityOption/index.tsx @@ -54,7 +54,13 @@ export default function FlexibilityOption({ member: memberPrice, features: petRoomPackage ? features : [], } - handleSelectRate(rate) + + console.log("Rate", rate) + + handleSelectRate({ + publicRateCode: publicPrice.rateCode, + roomTypeCode: roomTypeCode, + }) } return ( diff --git a/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx index fb713fddb..0f20cd65b 100644 --- a/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx +++ b/components/HotelReservation/SelectRate/RoomSelection/RoomCard/index.tsx @@ -161,7 +161,7 @@ export default function RoomCard({ {roomConfiguration.roomType} - {/* Out of scope for now + {/* Out of scope for now {descriptions?.short} */} diff --git a/components/HotelReservation/SelectRate/RoomSelection/index.tsx b/components/HotelReservation/SelectRate/RoomSelection/index.tsx index b3624552f..f7c530521 100644 --- a/components/HotelReservation/SelectRate/RoomSelection/index.tsx +++ b/components/HotelReservation/SelectRate/RoomSelection/index.tsx @@ -16,7 +16,7 @@ export default function RoomSelection({ user, packages, selectedPackages, - setRateSummary, + setRateCode, rateSummary, }: RoomSelectionProps) { const router = useRouter() @@ -70,7 +70,7 @@ export default function RoomSelection({ rateDefinitions={rateDefinitions} roomConfiguration={roomConfiguration} roomCategories={roomCategories} - handleSelectRate={setRateSummary} + handleSelectRate={setRateCode} selectedPackages={selectedPackages} packages={packages} /> diff --git a/components/HotelReservation/SelectRate/Rooms/index.tsx b/components/HotelReservation/SelectRate/Rooms/index.tsx index 78528db3e..7a661e385 100644 --- a/components/HotelReservation/SelectRate/Rooms/index.tsx +++ b/components/HotelReservation/SelectRate/Rooms/index.tsx @@ -1,6 +1,6 @@ "use client" -import { useCallback, useMemo, useState } from "react" +import { useCallback, useEffect, useMemo, useState } from "react" import RoomFilter from "../RoomFilter" import RoomSelection from "../RoomSelection" @@ -14,10 +14,7 @@ import { } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { SelectRateProps } from "@/types/components/hotelReservation/selectRate/roomSelection" import type { Rate } from "@/types/components/hotelReservation/selectRate/selectRate" -import type { - RoomConfiguration, - RoomsAvailability, -} from "@/server/routers/hotels/output" +import type { RoomConfiguration } from "@/server/routers/hotels/output" export default function Rooms({ roomsAvailability, @@ -27,7 +24,10 @@ export default function Rooms({ }: SelectRateProps) { const visibleRooms: RoomConfiguration[] = filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations) - const [rateSummary, setRateSummary] = useState(null) + // const [internalRateSummary, setRateSummary] = useState(null) + const [selectedRate, setSelectedRate] = useState< + { publicRateCode: string; roomTypeCode: string } | undefined + >(undefined) const [selectedPackages, setSelectedPackages] = useState( [] ) @@ -39,81 +39,9 @@ export default function Rooms({ ) as RoomPackageCodeEnum[] setSelectedPackages(filteredPackages) - - // if (filteredPackages.length === 0) { - // setRooms({ - // ...roomsAvailability, - // roomConfigurations: visibleRooms, - // }) - - // if (!!rateSummary) { - // setRateSummary({ - // ...rateSummary, - // features: [], - // }) - // } - - // if (noRoomsAvailable) { - // setRoomsAvailable() - // } - - // return - // } - - // const filteredRooms = visibleRooms.filter((room) => - // filteredPackages.every((filteredPackage) => - // room.features.some((feature) => feature.code === filteredPackage) - // ) - // ) - // let notAvailableRooms = visibleRooms.filter((room) => - // filteredPackages.every( - // (filteredPackage) => - // !room.features.some((feature) => feature.code === filteredPackage) - // ) - // ) - // // Clone nested object to keep original object intact and not messup the room data - // notAvailableRooms = JSON.parse(JSON.stringify(notAvailableRooms)) - // notAvailableRooms.forEach((room) => { - // room.status = "NotAvailable" - // }) - // setRooms({ - // ...roomsAvailability, - // roomConfigurations: [...filteredRooms, ...notAvailableRooms], - // }) - - // if (filteredRooms.length == 0) { - // setNoRoomsAvailable() - // } else if (noRoomsAvailable) { - // setRoomsAvailable() - // } - - // const petRoomPackage = - // (filteredPackages.includes(RoomPackageCodeEnum.PET_ROOM) && - // packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) || - // undefined - - // const features = filteredRooms.find((room) => - // room.features.some( - // (feature) => feature.code === RoomPackageCodeEnum.PET_ROOM - // ) - // )?.features - - // if (!!rateSummary) { - // setRateSummary({ - // ...rateSummary, - // features: petRoomPackage && features ? features : [], - // }) - // } + // setRateSummary(null) }, - [ - // roomsAvailability, - // visibleRooms, - // rateSummary, - // packages, - // noRoomsAvailable, - // setNoRoomsAvailable, - // setRoomsAvailable, - ] + [] ) const filteredRooms = useMemo(() => { @@ -150,7 +78,20 @@ export default function Rooms({ } }, [roomsAvailability, visibleRooms, selectedPackages, filteredRooms]) - const rSummary: Rate | null = useMemo(() => { + const rateSummary: Rate | null = useMemo(() => { + const room = filteredRooms.find( + (room) => room.roomTypeCode === selectedRate?.roomTypeCode + ) + + if (!room) return null + + const product = room.products.find( + (product) => + product.productType.public.rateCode === selectedRate?.publicRateCode + ) + + if (!product) return null + const petRoomPackage = (selectedPackages.includes(RoomPackageCodeEnum.PET_ROOM) && packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) || @@ -162,13 +103,24 @@ export default function Rooms({ ) )?.features - if (!rateSummary) return null - - return { - ...rateSummary, + const rateSummary: Rate = { features: petRoomPackage && features ? features : [], + priceName: room.roomType, + public: product.productType.public, + member: product.productType.member, + roomType: room.roomType, + roomTypeCode: room.roomTypeCode, } - }, [filteredRooms, rateSummary, packages, selectedPackages]) + + return rateSummary + }, [filteredRooms, packages, selectedPackages, selectedRate]) + + useEffect(() => { + if (rateSummary) return + if (!selectedRate) return + + setSelectedRate(undefined) + }, [rateSummary, selectedRate]) return (
@@ -183,8 +135,8 @@ export default function Rooms({ user={user} packages={packages} selectedPackages={selectedPackages} - setRateSummary={setRateSummary} - rateSummary={rSummary} + setRateCode={setSelectedRate} + rateSummary={rateSummary} />
) diff --git a/types/components/hotelReservation/selectRate/flexibilityOption.ts b/types/components/hotelReservation/selectRate/flexibilityOption.ts index 811afc139..5baef06a4 100644 --- a/types/components/hotelReservation/selectRate/flexibilityOption.ts +++ b/types/components/hotelReservation/selectRate/flexibilityOption.ts @@ -23,7 +23,10 @@ export type FlexibilityOptionProps = { roomTypeCode: RoomConfiguration["roomTypeCode"] features: RoomConfiguration["features"] petRoomPackage: RoomPackage | undefined - handleSelectRate: (rate: Rate) => void + handleSelectRate: (rateCode: { + publicRateCode: string + roomTypeCode: string + }) => void } export interface PriceListProps { diff --git a/types/components/hotelReservation/selectRate/hotelInfoCardProps.ts b/types/components/hotelReservation/selectRate/hotelInfoCardProps.ts deleted file mode 100644 index 088c54e51..000000000 --- a/types/components/hotelReservation/selectRate/hotelInfoCardProps.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { HotelData } from "@/types/hotel" - -export type HotelInfoCardProps = { - hotelData: HotelData | null - noAvailability: boolean -} diff --git a/types/components/hotelReservation/selectRate/roomCard.ts b/types/components/hotelReservation/selectRate/roomCard.ts index aa0d647be..cc7836a62 100644 --- a/types/components/hotelReservation/selectRate/roomCard.ts +++ b/types/components/hotelReservation/selectRate/roomCard.ts @@ -19,7 +19,10 @@ export type RoomCardProps = { roomCategories: RoomData[] selectedPackages: RoomPackageCodes[] packages: RoomPackageData | undefined - handleSelectRate: (rate: Rate) => void + handleSelectRate: (rateCode: { + publicRateCode: string + roomTypeCode: string + }) => void } type RoomPackagePriceSchema = z.output diff --git a/types/components/hotelReservation/selectRate/roomSelection.ts b/types/components/hotelReservation/selectRate/roomSelection.ts index 163bfd6fa..bfb750490 100644 --- a/types/components/hotelReservation/selectRate/roomSelection.ts +++ b/types/components/hotelReservation/selectRate/roomSelection.ts @@ -10,7 +10,10 @@ export interface RoomSelectionProps { user: SafeUser packages: RoomPackageData | undefined selectedPackages: RoomPackageCodes[] - setRateSummary: (rateSummary: Rate) => void + setRateCode: (rateCode: { + publicRateCode: string + roomTypeCode: string + }) => void rateSummary: Rate | null }