From f43250811210095bbf23a71f103e8cbff8057d1d Mon Sep 17 00:00:00 2001 From: Hrishikesh Vaipurkar Date: Fri, 15 Nov 2024 12:18:16 +0100 Subject: [PATCH] feat: SW-602 Update states on filter changes --- .../SelectRate/HotelInfoCard/index.tsx | 18 ++++++- .../SelectRate/Rooms/index.tsx | 47 ++++++++++++++++++- stores/roomAvailability.ts | 17 +++++++ 3 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 stores/roomAvailability.ts diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx index 8eabe85ba..946b82ad2 100644 --- a/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx +++ b/components/HotelReservation/SelectRate/HotelInfoCard/index.tsx @@ -1,6 +1,9 @@ "use client" +import { useEffect } from "react" import { useIntl } from "react-intl" +import useRoomAvailableStore from "@/stores/roomAvailability" + import { mapFacilityToIcon } from "@/components/ContentType/HotelPage/data" import ImageGallery from "@/components/ImageGallery" import Alert from "@/components/TempDesignSystem/Alert" @@ -24,10 +27,23 @@ export default function HotelInfoCard({ const hotelAttributes = hotelData?.data.attributes const intl = useIntl() + const noRoomsAvailable = useRoomAvailableStore( + (state) => state.noRoomsAvailable + ) + const setNoRoomsAvailable = useRoomAvailableStore( + (state) => state.setNoRoomsAvailable + ) + const sortedFacilities = hotelAttributes?.detailedFacilities .sort((a, b) => b.sortOrder - a.sortOrder) .slice(0, 5) + useEffect(() => { + if (noAvailability) { + setNoRoomsAvailable() + } + }, [noAvailability, setNoRoomsAvailable]) + return (
{hotelAttributes && ( @@ -101,7 +117,7 @@ export default function HotelInfoCard({ ) })} - {noAvailability ? ( + {noRoomsAvailable ? (
( [] ) + const noRoomsAvailable = useRoomAvailableStore( + (state) => state.noRoomsAvailable + ) + const setNoRoomsAvailable = useRoomAvailableStore( + (state) => state.setNoRoomsAvailable + ) + const setRoomsAvailable = useRoomAvailableStore( + (state) => state.setRoomsAvailable + ) const handleFilter = useCallback( (filter: Record) => { @@ -57,6 +68,10 @@ export default function Rooms({ }) } + if (noRoomsAvailable) { + setRoomsAvailable() + } + return } @@ -65,7 +80,27 @@ export default function Rooms({ 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 = (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 ( diff --git a/stores/roomAvailability.ts b/stores/roomAvailability.ts new file mode 100644 index 000000000..ad01453e4 --- /dev/null +++ b/stores/roomAvailability.ts @@ -0,0 +1,17 @@ +"use client" + +import { create } from "zustand" + +interface RoomAvailabilityState { + noRoomsAvailable: boolean + setNoRoomsAvailable: () => void + setRoomsAvailable: () => void +} + +const useRoomAvailableStore = create((set) => ({ + noRoomsAvailable: false, + setNoRoomsAvailable: () => set(() => ({ noRoomsAvailable: true })), + setRoomsAvailable: () => set(() => ({ noRoomsAvailable: false })), +})) + +export default useRoomAvailableStore