feat: SW-602 Update states on filter changes

This commit is contained in:
Hrishikesh Vaipurkar
2024-11-15 12:18:16 +01:00
parent a17010a431
commit f432508112
3 changed files with 79 additions and 3 deletions

View File

@@ -1,6 +1,9 @@
"use client" "use client"
import { useEffect } from "react"
import { useIntl } from "react-intl" import { useIntl } from "react-intl"
import useRoomAvailableStore from "@/stores/roomAvailability"
import { mapFacilityToIcon } from "@/components/ContentType/HotelPage/data" import { mapFacilityToIcon } from "@/components/ContentType/HotelPage/data"
import ImageGallery from "@/components/ImageGallery" import ImageGallery from "@/components/ImageGallery"
import Alert from "@/components/TempDesignSystem/Alert" import Alert from "@/components/TempDesignSystem/Alert"
@@ -24,10 +27,23 @@ export default function HotelInfoCard({
const hotelAttributes = hotelData?.data.attributes const hotelAttributes = hotelData?.data.attributes
const intl = useIntl() const intl = useIntl()
const noRoomsAvailable = useRoomAvailableStore(
(state) => state.noRoomsAvailable
)
const setNoRoomsAvailable = useRoomAvailableStore(
(state) => state.setNoRoomsAvailable
)
const sortedFacilities = hotelAttributes?.detailedFacilities const sortedFacilities = hotelAttributes?.detailedFacilities
.sort((a, b) => b.sortOrder - a.sortOrder) .sort((a, b) => b.sortOrder - a.sortOrder)
.slice(0, 5) .slice(0, 5)
useEffect(() => {
if (noAvailability) {
setNoRoomsAvailable()
}
}, [noAvailability, setNoRoomsAvailable])
return ( return (
<article className={styles.container}> <article className={styles.container}>
{hotelAttributes && ( {hotelAttributes && (
@@ -101,7 +117,7 @@ export default function HotelInfoCard({
</div> </div>
) )
})} })}
{noAvailability ? ( {noRoomsAvailable ? (
<div className={styles.hotelAlert}> <div className={styles.hotelAlert}>
<Alert <Alert
type={AlertTypeEnum.Info} type={AlertTypeEnum.Info}

View File

@@ -2,6 +2,8 @@
import { useCallback, useState } from "react" import { useCallback, useState } from "react"
import useRoomAvailableStore from "@/stores/roomAvailability"
import RoomFilter from "../RoomFilter" import RoomFilter from "../RoomFilter"
import RoomSelection from "../RoomSelection" import RoomSelection from "../RoomSelection"
import { filterDuplicateRoomTypesByLowestPrice } from "./utils" import { filterDuplicateRoomTypesByLowestPrice } from "./utils"
@@ -35,6 +37,15 @@ export default function Rooms({
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>) => {
@@ -57,6 +68,10 @@ export default function Rooms({
}) })
} }
if (noRoomsAvailable) {
setRoomsAvailable()
}
return return
} }
@@ -65,7 +80,27 @@ export default function Rooms({
room.features.some((feature) => feature.code === filteredPackage) room.features.some((feature) => feature.code === filteredPackage)
) )
) )
setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms }) 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 = const petRoomPackage =
(filteredPackages.includes(RoomPackageCodeEnum.PET_ROOM) && (filteredPackages.includes(RoomPackageCodeEnum.PET_ROOM) &&
@@ -85,7 +120,15 @@ export default function Rooms({
}) })
} }
}, },
[roomsAvailability, visibleRooms, rateSummary, packages] [
roomsAvailability,
visibleRooms,
rateSummary,
packages,
noRoomsAvailable,
setNoRoomsAvailable,
setRoomsAvailable,
]
) )
return ( return (

View File

@@ -0,0 +1,17 @@
"use client"
import { create } from "zustand"
interface RoomAvailabilityState {
noRoomsAvailable: boolean
setNoRoomsAvailable: () => void
setRoomsAvailable: () => void
}
const useRoomAvailableStore = create<RoomAvailabilityState>((set) => ({
noRoomsAvailable: false,
setNoRoomsAvailable: () => set(() => ({ noRoomsAvailable: true })),
setRoomsAvailable: () => set(() => ({ noRoomsAvailable: false })),
}))
export default useRoomAvailableStore