feat: contain logic for selecting price at the top level instead of on individual room card
This commit is contained in:
@@ -40,14 +40,10 @@ export async function NoRoomsAlert({
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!availability) {
|
if (!availability || availabilityError) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availabilityError) {
|
|
||||||
// TODO: Handle error
|
|
||||||
}
|
|
||||||
|
|
||||||
const noRoomsAvailable = availability.roomConfigurations.reduce(
|
const noRoomsAvailable = availability.roomConfigurations.reduce(
|
||||||
(acc, room) => {
|
(acc, room) => {
|
||||||
return acc && room.status === "NotAvailable"
|
return acc && room.status === "NotAvailable"
|
||||||
|
|||||||
@@ -54,7 +54,13 @@ export default function FlexibilityOption({
|
|||||||
member: memberPrice,
|
member: memberPrice,
|
||||||
features: petRoomPackage ? features : [],
|
features: petRoomPackage ? features : [],
|
||||||
}
|
}
|
||||||
handleSelectRate(rate)
|
|
||||||
|
console.log("Rate", rate)
|
||||||
|
|
||||||
|
handleSelectRate({
|
||||||
|
publicRateCode: publicPrice.rateCode,
|
||||||
|
roomTypeCode: roomTypeCode,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ export default function RoomSelection({
|
|||||||
user,
|
user,
|
||||||
packages,
|
packages,
|
||||||
selectedPackages,
|
selectedPackages,
|
||||||
setRateSummary,
|
setRateCode,
|
||||||
rateSummary,
|
rateSummary,
|
||||||
}: RoomSelectionProps) {
|
}: RoomSelectionProps) {
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
@@ -70,7 +70,7 @@ export default function RoomSelection({
|
|||||||
rateDefinitions={rateDefinitions}
|
rateDefinitions={rateDefinitions}
|
||||||
roomConfiguration={roomConfiguration}
|
roomConfiguration={roomConfiguration}
|
||||||
roomCategories={roomCategories}
|
roomCategories={roomCategories}
|
||||||
handleSelectRate={setRateSummary}
|
handleSelectRate={setRateCode}
|
||||||
selectedPackages={selectedPackages}
|
selectedPackages={selectedPackages}
|
||||||
packages={packages}
|
packages={packages}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client"
|
"use client"
|
||||||
|
|
||||||
import { useCallback, useMemo, useState } from "react"
|
import { useCallback, useEffect, useMemo, useState } from "react"
|
||||||
|
|
||||||
import RoomFilter from "../RoomFilter"
|
import RoomFilter from "../RoomFilter"
|
||||||
import RoomSelection from "../RoomSelection"
|
import RoomSelection from "../RoomSelection"
|
||||||
@@ -14,10 +14,7 @@ import {
|
|||||||
} from "@/types/components/hotelReservation/selectRate/roomFilter"
|
} from "@/types/components/hotelReservation/selectRate/roomFilter"
|
||||||
import type { SelectRateProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
|
import type { SelectRateProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
|
||||||
import type { Rate } from "@/types/components/hotelReservation/selectRate/selectRate"
|
import type { Rate } from "@/types/components/hotelReservation/selectRate/selectRate"
|
||||||
import type {
|
import type { RoomConfiguration } from "@/server/routers/hotels/output"
|
||||||
RoomConfiguration,
|
|
||||||
RoomsAvailability,
|
|
||||||
} from "@/server/routers/hotels/output"
|
|
||||||
|
|
||||||
export default function Rooms({
|
export default function Rooms({
|
||||||
roomsAvailability,
|
roomsAvailability,
|
||||||
@@ -27,7 +24,10 @@ export default function Rooms({
|
|||||||
}: SelectRateProps) {
|
}: SelectRateProps) {
|
||||||
const visibleRooms: RoomConfiguration[] =
|
const visibleRooms: RoomConfiguration[] =
|
||||||
filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations)
|
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[]>(
|
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
@@ -39,81 +39,9 @@ export default function Rooms({
|
|||||||
) as RoomPackageCodeEnum[]
|
) as RoomPackageCodeEnum[]
|
||||||
|
|
||||||
setSelectedPackages(filteredPackages)
|
setSelectedPackages(filteredPackages)
|
||||||
|
// setRateSummary(null)
|
||||||
// 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 : [],
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
},
|
},
|
||||||
[
|
[]
|
||||||
// roomsAvailability,
|
|
||||||
// visibleRooms,
|
|
||||||
// rateSummary,
|
|
||||||
// packages,
|
|
||||||
// noRoomsAvailable,
|
|
||||||
// setNoRoomsAvailable,
|
|
||||||
// setRoomsAvailable,
|
|
||||||
]
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const filteredRooms = useMemo(() => {
|
const filteredRooms = useMemo(() => {
|
||||||
@@ -150,7 +78,20 @@ export default function Rooms({
|
|||||||
}
|
}
|
||||||
}, [roomsAvailability, visibleRooms, selectedPackages, filteredRooms])
|
}, [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 =
|
const petRoomPackage =
|
||||||
(selectedPackages.includes(RoomPackageCodeEnum.PET_ROOM) &&
|
(selectedPackages.includes(RoomPackageCodeEnum.PET_ROOM) &&
|
||||||
packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) ||
|
packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) ||
|
||||||
@@ -162,13 +103,24 @@ export default function Rooms({
|
|||||||
)
|
)
|
||||||
)?.features
|
)?.features
|
||||||
|
|
||||||
if (!rateSummary) return null
|
const rateSummary: Rate = {
|
||||||
|
|
||||||
return {
|
|
||||||
...rateSummary,
|
|
||||||
features: petRoomPackage && features ? features : [],
|
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 (
|
return (
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
@@ -183,8 +135,8 @@ export default function Rooms({
|
|||||||
user={user}
|
user={user}
|
||||||
packages={packages}
|
packages={packages}
|
||||||
selectedPackages={selectedPackages}
|
selectedPackages={selectedPackages}
|
||||||
setRateSummary={setRateSummary}
|
setRateCode={setSelectedRate}
|
||||||
rateSummary={rSummary}
|
rateSummary={rateSummary}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -23,7 +23,10 @@ export type FlexibilityOptionProps = {
|
|||||||
roomTypeCode: RoomConfiguration["roomTypeCode"]
|
roomTypeCode: RoomConfiguration["roomTypeCode"]
|
||||||
features: RoomConfiguration["features"]
|
features: RoomConfiguration["features"]
|
||||||
petRoomPackage: RoomPackage | undefined
|
petRoomPackage: RoomPackage | undefined
|
||||||
handleSelectRate: (rate: Rate) => void
|
handleSelectRate: (rateCode: {
|
||||||
|
publicRateCode: string
|
||||||
|
roomTypeCode: string
|
||||||
|
}) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PriceListProps {
|
export interface PriceListProps {
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
import type { HotelData } from "@/types/hotel"
|
|
||||||
|
|
||||||
export type HotelInfoCardProps = {
|
|
||||||
hotelData: HotelData | null
|
|
||||||
noAvailability: boolean
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,10 @@ export type RoomCardProps = {
|
|||||||
roomCategories: RoomData[]
|
roomCategories: RoomData[]
|
||||||
selectedPackages: RoomPackageCodes[]
|
selectedPackages: RoomPackageCodes[]
|
||||||
packages: RoomPackageData | undefined
|
packages: RoomPackageData | undefined
|
||||||
handleSelectRate: (rate: Rate) => void
|
handleSelectRate: (rateCode: {
|
||||||
|
publicRateCode: string
|
||||||
|
roomTypeCode: string
|
||||||
|
}) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
type RoomPackagePriceSchema = z.output<typeof packagePriceSchema>
|
type RoomPackagePriceSchema = z.output<typeof packagePriceSchema>
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ export interface RoomSelectionProps {
|
|||||||
user: SafeUser
|
user: SafeUser
|
||||||
packages: RoomPackageData | undefined
|
packages: RoomPackageData | undefined
|
||||||
selectedPackages: RoomPackageCodes[]
|
selectedPackages: RoomPackageCodes[]
|
||||||
setRateSummary: (rateSummary: Rate) => void
|
setRateCode: (rateCode: {
|
||||||
|
publicRateCode: string
|
||||||
|
roomTypeCode: string
|
||||||
|
}) => void
|
||||||
rateSummary: Rate | null
|
rateSummary: Rate | null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user