import { trpc } from "@/lib/trpc/client" import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" import type { Child } from "@/types/components/hotelReservation/selectRate/selectRate" import type { RoomsAvailability } from "@/types/trpc/routers/hotel/roomAvailability" import type { Lang } from "@/constants/languages" export function combineRoomAvailabilities( availabilityResults: PromiseSettledResult[] ) { return availabilityResults.reduce((acc, result) => { if (result.status === "fulfilled" && result.value) { if (acc) { acc = { ...acc, roomConfigurations: [ ...acc.roomConfigurations, ...result.value.roomConfigurations, ], } } else { acc = result.value } } // Ping monitoring about fail? if (result.status === "rejected") { console.info(`RoomAvailability fetch failed`) console.error(result.reason) } return acc }, null) } export function useRoomsAvailability( uniqueAdultsCount: number[], hotelId: number, fromDateString: string, toDateString: string, lang: Lang, childArray?: Child[], bookingCode?: string ) { const returnValue = trpc.hotel.availability.roomsCombinedAvailability.useQuery({ hotelId, roomStayStartDate: fromDateString, roomStayEndDate: toDateString, uniqueAdultsCount, childArray, lang, bookingCode, }) const combinedAvailability = returnValue.data?.length ? combineRoomAvailabilities( returnValue.data as PromiseSettledResult[] ) : null return { ...returnValue, data: combinedAvailability, } } export function useHotelPackages( adultArray: number[], childArray: Child[] | undefined, fromDateString: string, toDateString: string, hotelId: number, lang: Lang ) { return trpc.hotel.packages.get.useQuery({ adults: adultArray[0], // Using the first adult count children: childArray ? childArray.length : undefined, endDate: toDateString, hotelId: hotelId.toString(), packageCodes: [ RoomPackageCodeEnum.ACCESSIBILITY_ROOM, RoomPackageCodeEnum.PET_ROOM, RoomPackageCodeEnum.ALLERGY_ROOM, ], startDate: fromDateString, lang: lang, }) }