feat: contain logic for selecting price at the top level instead of on individual room card

This commit is contained in:
Joakim Jäderberg
2024-11-20 11:25:11 +01:00
parent dfdbdb7621
commit d32a595e2e
9 changed files with 63 additions and 106 deletions

View File

@@ -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"

View File

@@ -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 (

View File

@@ -161,7 +161,7 @@ export default function RoomCard({
<Subtitle className={styles.name} type="two">
{roomConfiguration.roomType}
</Subtitle>
{/* Out of scope for now
{/* Out of scope for now
<Body>{descriptions?.short}</Body>
*/}
</div>

View File

@@ -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}
/>

View File

@@ -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<Rate | null>(null)
// const [internalRateSummary, setRateSummary] = useState<Rate | null>(null)
const [selectedRate, setSelectedRate] = useState<
{ publicRateCode: string; roomTypeCode: string } | undefined
>(undefined)
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
[]
)
@@ -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 (
<div className={styles.content}>
@@ -183,8 +135,8 @@ export default function Rooms({
user={user}
packages={packages}
selectedPackages={selectedPackages}
setRateSummary={setRateSummary}
rateSummary={rSummary}
setRateCode={setSelectedRate}
rateSummary={rateSummary}
/>
</div>
)