Merged in feat/SW-2113-allow-feature-combinations (pull request #1719)

Feat/SW-2113 allow feature combinations

* feat(SW-2113): Refactor features data to be fetched on filter room filter change

* feat(SW-2113): added loading state

* fix: now clear room selection when applying filter and room doesnt exists. And added room features to mobile summary

* fix

* fix: add package to price details

* feat(SW-2113): added buttons to room filter

* fix: active room

* fix: remove console log

* fix: added form and close handler to room package filter

* fix: add restriction so you cannot select pet room with allergy room and vice versa

* fix: fixes from review feedback

* fix

* fix: hide modify button if on nextcoming rooms if no selection is made, and adjust filter logic in togglePackage

* fix: forgot to use roomFeatureCodes from input..

* fix: naming


Approved-by: Simon.Emanuelsson
This commit is contained in:
Tobias Johansson
2025-04-07 11:36:34 +00:00
parent 8d34e1c8bb
commit e6ae6ff650
31 changed files with 725 additions and 359 deletions
@@ -1,10 +1,6 @@
import { useSearchParams } from "next/navigation"
import { useEffect, useMemo, useState } from "react"
import { REDEMPTION } from "@/constants/booking"
import { trpc } from "@/lib/trpc/client"
import { convertSearchParamsToObj, searchParamsToRecord } from "@/utils/url"
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
import type { SelectRateSearchParams } from "@/types/components/hotelReservation/selectRate/selectRate"
import type { Lang } from "@/constants/languages"
@@ -17,79 +13,30 @@ export function useRoomsAvailability(
toDateString: string,
lang: Lang,
childArray: ChildrenInRoom,
bookingCode?: string,
redemption?: boolean
booking: SelectRateSearchParams
) {
const searchParams = useSearchParams()
const searchParamsObj = convertSearchParamsToObj<SelectRateSearchParams>(
searchParamsToRecord(searchParams)
const redemption = booking.searchType
? booking.searchType === REDEMPTION
: undefined
const roomFeatureCodesArray = booking.rooms.map(
(room) => room.packages ?? null
)
const hasPackagesParam = searchParamsObj.rooms.some((room) => room.packages)
const [hasRoomFeatures, setHasRoomFeatures] = useState(hasPackagesParam)
useEffect(() => {
setHasRoomFeatures(hasPackagesParam)
}, [hasPackagesParam, setHasRoomFeatures])
const { data: roomFeatures, isPending: isRoomFeaturesPending } =
trpc.hotel.availability.roomFeatures.useQuery(
{
hotelId,
startDate: fromDateString,
endDate: toDateString,
adultsCount,
childArray,
},
{
enabled: hasRoomFeatures,
}
)
const { data: roomsAvailability, isPending: isRoomsAvailabiltyPending } =
const roomsAvailability =
trpc.hotel.availability.roomsCombinedAvailability.useQuery({
adultsCount,
bookingCode,
childArray,
hotelId,
lang,
redemption,
roomStayEndDate: toDateString,
roomStayStartDate: fromDateString,
bookingCode: booking.bookingCode,
roomFeatureCodesArray,
})
const combinedData = useMemo(() => {
if (!roomsAvailability) {
return undefined
}
if (!roomFeatures) {
return roomsAvailability
}
return roomsAvailability.map((room, idx) => {
if ("error" in room) {
return room
}
return {
...room,
roomConfigurations: room.roomConfigurations.map((config) => ({
...config,
features:
roomFeatures?.[idx]?.find(
(r) => r.roomTypeCode === config.roomTypeCode
)?.features ?? [],
})),
}
})
}, [roomFeatures, roomsAvailability])
return {
data: combinedData,
isPending: hasRoomFeatures
? isRoomsAvailabiltyPending || isRoomFeaturesPending
: isRoomsAvailabiltyPending,
}
return roomsAvailability
}
export function useHotelPackages(