diff --git a/components/HotelReservation/SelectRate/Rooms/index.tsx b/components/HotelReservation/SelectRate/Rooms/index.tsx index 8c122a9c0..a3454818a 100644 --- a/components/HotelReservation/SelectRate/Rooms/index.tsx +++ b/components/HotelReservation/SelectRate/Rooms/index.tsx @@ -2,10 +2,9 @@ import { useCallback, useState } from "react" -import { RoomsAvailability } from "@/server/routers/hotels/output" - import RoomFilter from "../RoomFilter" import RoomSelection from "../RoomSelection" +import { getLowestPricedRooms } from "./utils" import styles from "./rooms.module.css" @@ -14,6 +13,10 @@ import { type RoomPackageCodes, } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection" +import type { + RoomConfiguration, + RoomsAvailability, +} from "@/server/routers/hotels/output" export default function Rooms({ roomsAvailability, @@ -21,7 +24,12 @@ export default function Rooms({ user, packages, }: Omit) { - const defaultRooms = roomsAvailability.roomConfigurations + console.log("roomsAvailability", roomsAvailability) + const visibleRooms: RoomConfiguration[] = getLowestPricedRooms( + roomsAvailability.roomConfigurations + ) + + const defaultRooms = visibleRooms const [rooms, setRooms] = useState({ ...roomsAvailability, roomConfigurations: defaultRooms, @@ -46,15 +54,14 @@ export default function Rooms({ return } - const filteredRooms = roomsAvailability.roomConfigurations.filter( - (room) => - filteredPackages.every((filteredPackage) => - room.features.some((feature) => feature.code === filteredPackage) - ) + const filteredRooms = visibleRooms.filter((room) => + filteredPackages.every((filteredPackage) => + room.features.some((feature) => feature.code === filteredPackage) + ) ) setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms }) }, - [roomsAvailability, defaultRooms] + [roomsAvailability, defaultRooms, visibleRooms] ) return ( diff --git a/components/HotelReservation/SelectRate/Rooms/utils.ts b/components/HotelReservation/SelectRate/Rooms/utils.ts new file mode 100644 index 000000000..bb1ff48c9 --- /dev/null +++ b/components/HotelReservation/SelectRate/Rooms/utils.ts @@ -0,0 +1,71 @@ +import { RoomConfiguration } from "@/server/routers/hotels/output" + +export function getLowestPricedRooms(roomConfigurations: RoomConfiguration[]) { + const roomTypeCount = roomConfigurations.reduce( + (acc, room) => { + acc[room.roomType] = (acc[room.roomType] || 0) + 1 + return acc + }, + {} as Record + ) + + const duplicateRoomTypes = new Set( + Object.keys(roomTypeCount).filter((roomType) => roomTypeCount[roomType] > 1) + ) + + const roomMap = new Map() + + roomConfigurations.forEach((room) => { + const { roomType, products } = room + + if (!duplicateRoomTypes.has(roomType)) { + roomMap.set(roomType, room) + return + } + + products.forEach((product) => { + const { productType } = product + const publicProduct = productType.public + const memberProduct = productType.member || { + requestedPrice: null, + localPrice: null, + } + + const { + requestedPrice: publicRequestedPrice, + localPrice: publicLocalPrice, + } = publicProduct + const { + requestedPrice: memberRequestedPrice, + localPrice: memberLocalPrice, + } = memberProduct + + const currentLowest = roomMap.get(roomType) + + const currentRequestedPrice = Math.min( + Number(publicRequestedPrice.pricePerNight) ?? Infinity, + Number(memberRequestedPrice?.pricePerNight) ?? Infinity + ) + const currentLocalPrice = Math.min( + Number(publicLocalPrice.pricePerNight) ?? Infinity, + Number(memberLocalPrice?.pricePerNight) ?? Infinity + ) + + if ( + !currentLowest || + currentRequestedPrice < currentLowest.requestedPrice || + (currentRequestedPrice === currentLowest.requestedPrice && + currentLocalPrice < currentLowest.localPrice) + ) { + roomMap.set(roomType, { + ...room, + product, + requestedPrice: currentRequestedPrice, + localPrice: currentLocalPrice, + }) + } + }) + }) + + return Array.from(roomMap.values()) +}