Merged in feat/SW-874-show-correct-rooms (pull request #883)
Feat/SW-874 show correct rooms Approved-by: Niclas Edenvin
This commit is contained in:
@@ -56,7 +56,7 @@ export default function FlexibilityOption({
|
|||||||
priceName: name,
|
priceName: name,
|
||||||
public: publicPrice,
|
public: publicPrice,
|
||||||
member: memberPrice,
|
member: memberPrice,
|
||||||
features,
|
features: petRoomPackage ? features : [],
|
||||||
}
|
}
|
||||||
handleSelectRate(rate)
|
handleSelectRate(rate)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,9 @@
|
|||||||
|
|
||||||
import { useCallback, useState } from "react"
|
import { useCallback, useState } from "react"
|
||||||
|
|
||||||
import { RoomsAvailability } from "@/server/routers/hotels/output"
|
|
||||||
|
|
||||||
import RoomFilter from "../RoomFilter"
|
import RoomFilter from "../RoomFilter"
|
||||||
import RoomSelection from "../RoomSelection"
|
import RoomSelection from "../RoomSelection"
|
||||||
|
import { filterDuplicateRoomTypesByLowestPrice } from "./utils"
|
||||||
|
|
||||||
import styles from "./rooms.module.css"
|
import styles from "./rooms.module.css"
|
||||||
|
|
||||||
@@ -14,6 +13,10 @@ import {
|
|||||||
type RoomPackageCodes,
|
type RoomPackageCodes,
|
||||||
} from "@/types/components/hotelReservation/selectRate/roomFilter"
|
} from "@/types/components/hotelReservation/selectRate/roomFilter"
|
||||||
import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
|
import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
|
||||||
|
import type {
|
||||||
|
RoomConfiguration,
|
||||||
|
RoomsAvailability,
|
||||||
|
} from "@/server/routers/hotels/output"
|
||||||
|
|
||||||
export default function Rooms({
|
export default function Rooms({
|
||||||
roomsAvailability,
|
roomsAvailability,
|
||||||
@@ -21,10 +24,12 @@ export default function Rooms({
|
|||||||
user,
|
user,
|
||||||
packages,
|
packages,
|
||||||
}: Omit<RoomSelectionProps, "selectedPackages">) {
|
}: Omit<RoomSelectionProps, "selectedPackages">) {
|
||||||
const defaultRooms = roomsAvailability.roomConfigurations
|
const visibleRooms: RoomConfiguration[] =
|
||||||
|
filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations)
|
||||||
|
|
||||||
const [rooms, setRooms] = useState<RoomsAvailability>({
|
const [rooms, setRooms] = useState<RoomsAvailability>({
|
||||||
...roomsAvailability,
|
...roomsAvailability,
|
||||||
roomConfigurations: defaultRooms,
|
roomConfigurations: visibleRooms,
|
||||||
})
|
})
|
||||||
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
|
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
|
||||||
[]
|
[]
|
||||||
@@ -41,20 +46,19 @@ export default function Rooms({
|
|||||||
if (filteredPackages.length === 0) {
|
if (filteredPackages.length === 0) {
|
||||||
setRooms({
|
setRooms({
|
||||||
...roomsAvailability,
|
...roomsAvailability,
|
||||||
roomConfigurations: defaultRooms,
|
roomConfigurations: visibleRooms,
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const filteredRooms = roomsAvailability.roomConfigurations.filter(
|
const filteredRooms = visibleRooms.filter((room) =>
|
||||||
(room) =>
|
filteredPackages.every((filteredPackage) =>
|
||||||
filteredPackages.every((filteredPackage) =>
|
room.features.some((feature) => feature.code === filteredPackage)
|
||||||
room.features.some((feature) => feature.code === filteredPackage)
|
)
|
||||||
)
|
|
||||||
)
|
)
|
||||||
setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms })
|
setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms })
|
||||||
},
|
},
|
||||||
[roomsAvailability, defaultRooms]
|
[roomsAvailability, visibleRooms]
|
||||||
)
|
)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
102
components/HotelReservation/SelectRate/Rooms/utils.ts
Normal file
102
components/HotelReservation/SelectRate/Rooms/utils.ts
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
import { RoomConfiguration } from "@/server/routers/hotels/output"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the lowest priced room for each room type that appears more than once.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function filterDuplicateRoomTypesByLowestPrice(
|
||||||
|
roomConfigurations: RoomConfiguration[]
|
||||||
|
) {
|
||||||
|
const roomTypeCount = roomConfigurations.reduce(
|
||||||
|
(acc, room) => {
|
||||||
|
acc[room.roomType] = (acc[room.roomType] || 0) + 1
|
||||||
|
return acc
|
||||||
|
},
|
||||||
|
{} as Record<string, number>
|
||||||
|
)
|
||||||
|
|
||||||
|
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 previousLowest = 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 (
|
||||||
|
!previousLowest ||
|
||||||
|
currentRequestedPrice <
|
||||||
|
Math.min(
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.public.requestedPrice
|
||||||
|
.pricePerNight
|
||||||
|
) ?? Infinity,
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.member?.requestedPrice
|
||||||
|
?.pricePerNight
|
||||||
|
) ?? Infinity
|
||||||
|
) ||
|
||||||
|
(currentRequestedPrice ===
|
||||||
|
Math.min(
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.public.requestedPrice
|
||||||
|
.pricePerNight
|
||||||
|
) ?? Infinity,
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.member?.requestedPrice
|
||||||
|
?.pricePerNight
|
||||||
|
) ?? Infinity
|
||||||
|
) &&
|
||||||
|
currentLocalPrice <
|
||||||
|
Math.min(
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.public.localPrice
|
||||||
|
.pricePerNight
|
||||||
|
) ?? Infinity,
|
||||||
|
Number(
|
||||||
|
previousLowest.products[0].productType.member?.localPrice
|
||||||
|
?.pricePerNight
|
||||||
|
) ?? Infinity
|
||||||
|
))
|
||||||
|
) {
|
||||||
|
roomMap.set(roomType, room)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
return Array.from(roomMap.values())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user