From 260be9b6412dd1eea947b46f66008fb296c75639 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20J=C3=A4derberg?= Date: Mon, 18 Nov 2024 14:52:22 +0100 Subject: [PATCH] fix: load room availabiltity separately --- .../HotelInfoCard/NoRoomsAlert.module.css | 5 + .../SelectRate/HotelInfoCard/NoRoomsAlert.tsx | 73 ++++++++++++++ .../SelectRate/Rooms/RoomsContainer.tsx | 96 +++++++++++++++++++ utils/safeTry.ts | 11 +++ 4 files changed, 185 insertions(+) create mode 100644 components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.module.css create mode 100644 components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx create mode 100644 components/HotelReservation/SelectRate/Rooms/RoomsContainer.tsx create mode 100644 utils/safeTry.ts diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.module.css b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.module.css new file mode 100644 index 000000000..3bb1f51a7 --- /dev/null +++ b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.module.css @@ -0,0 +1,5 @@ +.hotelAlert { + max-width: var(--max-width-navigation); + margin: 0 auto; + padding-top: var(--Spacing-x-one-and-half); +} diff --git a/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx new file mode 100644 index 000000000..bfca1364f --- /dev/null +++ b/components/HotelReservation/SelectRate/HotelInfoCard/NoRoomsAlert.tsx @@ -0,0 +1,73 @@ +import { Lang } from "@/constants/languages" +import { dt } from "@/lib/dt" +import { getRoomAvailability } from "@/lib/trpc/memoizedRequests" + +import Alert from "@/components/TempDesignSystem/Alert" +import { getIntl } from "@/i18n" +import { safeTry } from "@/utils/safeTry" + +import { generateChildrenString } from "../RoomSelection/utils" + +import styles from "./NoRoomsAlert.module.css" + +import { Child } from "@/types/components/hotelReservation/selectRate/selectRate" +import { AlertTypeEnum } from "@/types/enums/alert" + +type Props = { + hotelId: number + lang: Lang + adultCount: number + childArray: Child[] + fromDate: Date + toDate: Date +} + +export async function NoRoomsAlert({ + hotelId, + fromDate, + toDate, + childArray, + adultCount, + lang, +}: Props) { + const [availability, availabilityError] = await safeTry( + getRoomAvailability({ + hotelId: hotelId, + roomStayStartDate: dt(fromDate).format("YYYY-MM-DD"), + roomStayEndDate: dt(toDate).format("YYYY-MM-DD"), + adults: adultCount, + children: generateChildrenString(childArray), // TODO: Handle multiple rooms, + }) + ) + + if (!availability) { + return null + } + + if (availabilityError) { + // TODO: Handle error + } + + const noRoomsAvailable = availability.roomConfigurations.reduce( + (acc, room) => { + return acc && room.status === "NotAvailable" + }, + true + ) + + if (!noRoomsAvailable) { + return null + } + + const intl = await getIntl(lang) + return ( +
+ +
+ ) +} diff --git a/components/HotelReservation/SelectRate/Rooms/RoomsContainer.tsx b/components/HotelReservation/SelectRate/Rooms/RoomsContainer.tsx new file mode 100644 index 000000000..d0c662431 --- /dev/null +++ b/components/HotelReservation/SelectRate/Rooms/RoomsContainer.tsx @@ -0,0 +1,96 @@ +import { Lang } from "@/constants/languages" +import { dt } from "@/lib/dt" +import { + getHotelData, + getPackages, + getProfileSafely, + getRoomAvailability, +} from "@/lib/trpc/memoizedRequests" +import { serverClient } from "@/lib/trpc/server" + +import { safeTry } from "@/utils/safeTry" + +import { generateChildrenString } from "../RoomSelection/utils" +import Rooms from "." + +import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter" +import { Child } from "@/types/components/hotelReservation/selectRate/selectRate" + +export type Props = { + hotelId: number + fromDate: Date + toDate: Date + adultCount: number + childArray: Child[] + lang: Lang +} + +export async function RoomsContainer({ + hotelId, + fromDate, + toDate, + adultCount, + childArray, + lang, +}: Props) { + const user = await getProfileSafely() + + const fromDateString = dt(fromDate).format("YYYY-MM-DD") + const toDateString = dt(toDate).format("YYYY-MM-DD") + + const hotelDataPromise = safeTry( + getHotelData({ hotelId: hotelId.toString(), language: lang }) + ) + + const packagesPromise = safeTry( + getPackages({ + hotelId: hotelId.toString(), + startDate: fromDateString, + endDate: toDateString, + adults: adultCount, + children: childArray.length > 0 ? childArray.length : undefined, + packageCodes: [ + RoomPackageCodeEnum.ACCESSIBILITY_ROOM, + RoomPackageCodeEnum.PET_ROOM, + RoomPackageCodeEnum.ALLERGY_ROOM, + ], + }) + ) + + const roomsAvailabilityPromise = safeTry( + getRoomAvailability({ + hotelId: hotelId, + roomStayStartDate: fromDateString, + roomStayEndDate: toDateString, + adults: adultCount, + children: generateChildrenString(childArray), + }) + ) + + const [hotelData, hotelDataError] = await hotelDataPromise + const [packages, packagesError] = await packagesPromise + const [roomsAvailability, roomsAvailabilityError] = + await roomsAvailabilityPromise + + if (packagesError) { + console.error("packagesError", { ...packagesError }) + + return ( +
Unable to get packages. {JSON.stringify({ ...packagesError })}
+ ) + } + + if (roomsAvailabilityError || !roomsAvailability) { + console.error("roomsAvailabilityError", roomsAvailabilityError) + return
Unable to get room availability
+ } + + return ( + + ) +} diff --git a/utils/safeTry.ts b/utils/safeTry.ts new file mode 100644 index 000000000..d3bb81596 --- /dev/null +++ b/utils/safeTry.ts @@ -0,0 +1,11 @@ +export type SafeTryResult = Promise< + [T, undefined] | [undefined, Error | unknown] +> + +export async function safeTry(func: Promise): SafeTryResult { + try { + return [await func, undefined] + } catch (err) { + return [undefined, err] + } +}