This commit is contained in:
Joakim Jäderberg
2024-11-19 13:40:51 +01:00
parent 0c6371d805
commit c4caccae5a

View File

@@ -1,8 +1,6 @@
"use client" "use client"
import { useCallback, useState } from "react" import { useCallback, useMemo, useState } from "react"
import useRoomAvailableStore from "@/stores/roomAvailability"
import RoomFilter from "../RoomFilter" import RoomFilter from "../RoomFilter"
import RoomSelection from "../RoomSelection" import RoomSelection from "../RoomSelection"
@@ -30,22 +28,9 @@ export default function Rooms({
const visibleRooms: RoomConfiguration[] = const visibleRooms: RoomConfiguration[] =
filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations) filterDuplicateRoomTypesByLowestPrice(roomsAvailability.roomConfigurations)
const [rateSummary, setRateSummary] = useState<Rate | null>(null) const [rateSummary, setRateSummary] = useState<Rate | null>(null)
const [rooms, setRooms] = useState<RoomsAvailability>({
...roomsAvailability,
roomConfigurations: visibleRooms,
})
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>( const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
[] []
) )
const noRoomsAvailable = useRoomAvailableStore(
(state) => state.noRoomsAvailable
)
const setNoRoomsAvailable = useRoomAvailableStore(
(state) => state.setNoRoomsAvailable
)
const setRoomsAvailable = useRoomAvailableStore(
(state) => state.setRoomsAvailable
)
const handleFilter = useCallback( const handleFilter = useCallback(
(filter: Record<RoomPackageCodeEnum, boolean | undefined>) => { (filter: Record<RoomPackageCodeEnum, boolean | undefined>) => {
@@ -55,81 +40,135 @@ export default function Rooms({
setSelectedPackages(filteredPackages) setSelectedPackages(filteredPackages)
if (filteredPackages.length === 0) { // if (filteredPackages.length === 0) {
setRooms({ // setRooms({
...roomsAvailability, // ...roomsAvailability,
roomConfigurations: visibleRooms, // roomConfigurations: visibleRooms,
}) // })
if (!!rateSummary) { // if (!!rateSummary) {
setRateSummary({ // setRateSummary({
...rateSummary, // ...rateSummary,
features: [], // features: [],
}) // })
} // }
if (noRoomsAvailable) { // if (noRoomsAvailable) {
setRoomsAvailable() // setRoomsAvailable()
} // }
return // return
} // }
const filteredRooms = visibleRooms.filter((room) => // const filteredRooms = visibleRooms.filter((room) =>
filteredPackages.every((filteredPackage) => // filteredPackages.every((filteredPackage) =>
room.features.some((feature) => feature.code === 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(() => {
return visibleRooms.filter((room) =>
selectedPackages.every((filteredPackage) =>
room.features.some((feature) => feature.code === filteredPackage)
) )
let notAvailableRooms = visibleRooms.filter((room) => )
filteredPackages.every( }, [visibleRooms, selectedPackages])
const rooms = useMemo(() => {
if (selectedPackages.length === 0) {
return {
...roomsAvailability,
roomConfigurations: visibleRooms,
}
}
let notAvailableRooms = visibleRooms
.filter((room) =>
selectedPackages.every(
(filteredPackage) => (filteredPackage) =>
!room.features.some((feature) => feature.code === filteredPackage) !room.features.some((feature) => feature.code === filteredPackage)
) )
) )
// Clone nested object to keep original object intact and not messup the room data .map((room) => ({
notAvailableRooms = JSON.parse(JSON.stringify(notAvailableRooms)) ...room,
notAvailableRooms.forEach((room) => { status: "NotAvailable",
room.status = "NotAvailable" }))
})
setRooms({
...roomsAvailability,
roomConfigurations: [...filteredRooms, ...notAvailableRooms],
})
if (filteredRooms.length == 0) { return {
setNoRoomsAvailable() ...roomsAvailability,
} else if (noRoomsAvailable) { roomConfigurations: [...filteredRooms, ...notAvailableRooms],
setRoomsAvailable() }
} }, [roomsAvailability, visibleRooms, selectedPackages, filteredRooms])
const petRoomPackage = const rSummary: Rate | null = useMemo(() => {
(filteredPackages.includes(RoomPackageCodeEnum.PET_ROOM) && const petRoomPackage =
packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) || (selectedPackages.includes(RoomPackageCodeEnum.PET_ROOM) &&
undefined packages.find((pkg) => pkg.code === RoomPackageCodeEnum.PET_ROOM)) ||
undefined
const features = filteredRooms.find((room) => const features = filteredRooms.find((room) =>
room.features.some( room.features.some(
(feature) => feature.code === RoomPackageCodeEnum.PET_ROOM (feature) => feature.code === RoomPackageCodeEnum.PET_ROOM
) )
)?.features )?.features
if (!!rateSummary) { if (!rateSummary) return null
setRateSummary({
...rateSummary, return {
features: petRoomPackage && features ? features : [], ...rateSummary,
}) features: petRoomPackage && features ? features : [],
} }
}, }, [filteredRooms, rateSummary, packages, selectedPackages])
[
roomsAvailability,
visibleRooms,
rateSummary,
packages,
noRoomsAvailable,
setNoRoomsAvailable,
setRoomsAvailable,
]
)
return ( return (
<div className={styles.content}> <div className={styles.content}>
@@ -145,7 +184,7 @@ export default function Rooms({
packages={packages} packages={packages}
selectedPackages={selectedPackages} selectedPackages={selectedPackages}
setRateSummary={setRateSummary} setRateSummary={setRateSummary}
rateSummary={rateSummary} rateSummary={rSummary}
/> />
</div> </div>
) )