Merged in feat/SW-2033-implement-new-room-feature-request (pull request #1665)

feat(SW-2033): Added new route for fetching room features, and merged the data with existing availability data

* feat(SW-2033): Added new route for fetching room features, and merged the data with existing availability data

* fix: issue with total price not including room features

* fix: add return null

* fix

* fix

* fixes from PR feedback


Approved-by: Arvid Norlin
This commit is contained in:
Tobias Johansson
2025-03-31 11:20:49 +00:00
parent 81f579bbfe
commit 7434f30c20
9 changed files with 232 additions and 12 deletions

View File

@@ -1,6 +1,12 @@
import { useSearchParams } from "next/navigation"
import { useEffect, useMemo, useState } from "react"
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"
import type { ChildrenInRoom } from "@/utils/hotelSearchDetails"
@@ -14,16 +20,76 @@ export function useRoomsAvailability(
bookingCode?: string,
redemption?: boolean
) {
return trpc.hotel.availability.roomsCombinedAvailability.useQuery({
adultsCount,
bookingCode,
childArray,
hotelId,
lang,
redemption,
roomStayEndDate: toDateString,
roomStayStartDate: fromDateString,
})
const searchParams = useSearchParams()
const searchParamsObj = convertSearchParamsToObj<SelectRateSearchParams>(
searchParamsToRecord(searchParams)
)
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 } =
trpc.hotel.availability.roomsCombinedAvailability.useQuery({
adultsCount,
bookingCode,
childArray,
hotelId,
lang,
redemption,
roomStayEndDate: toDateString,
roomStayStartDate: fromDateString,
})
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,
}
}
export function useHotelPackages(