diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/map/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/map/page.tsx index 29caabded..2296489ac 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/map/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/map/page.tsx @@ -1,17 +1,12 @@ -import { notFound } from "next/navigation" import { Suspense } from "react" -import { getLocations } from "@/lib/trpc/memoizedRequests" - import { SelectHotelMapContainer } from "@/components/HotelReservation/SelectHotel/SelectHotelMap/SelectHotelMapContainer" import { SelectHotelMapContainerSkeleton } from "@/components/HotelReservation/SelectHotel/SelectHotelMap/SelectHotelMapContainerSkeleton" -import { - generateChildrenString, - getHotelReservationQueryParams, -} from "@/components/HotelReservation/SelectRate/RoomSelection/utils" import { MapContainer } from "@/components/MapContainer" import { setLang } from "@/i18n/serverContext" +import { getHotelSearchDetails } from "../../utils" + import styles from "./page.module.css" import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams" @@ -22,24 +17,9 @@ export default async function SelectHotelMapPage({ searchParams, }: PageArgs) { setLang(params.lang) - const locations = await getLocations() - - if (!locations || "error" in locations) { - return null - } - const city = locations.data.find( - (location) => - location.name.toLowerCase() === searchParams.city.toLowerCase() - ) - if (!city) return notFound() - - const selectHotelParams = new URLSearchParams(searchParams) - const selectHotelParamsObject = - getHotelReservationQueryParams(selectHotelParams) - const adultsInRoom = selectHotelParamsObject.room[0].adults // TODO: Handle multiple rooms - const childrenInRoom = selectHotelParamsObject.room[0].child - ? generateChildrenString(selectHotelParamsObject.room[0].child) - : undefined // TODO: Handle multiple rooms + const searchDetails = await getHotelSearchDetails({ searchParams }) + if (!searchDetails) return null + const { city, adultsInRoom, childrenInRoom } = searchDetails return (
diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/page.tsx index 3c3435dd4..04439fdf4 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-hotel/page.tsx @@ -1,16 +1,11 @@ -import { notFound } from "next/navigation" import { Suspense } from "react" -import { getLocations } from "@/lib/trpc/memoizedRequests" - import SelectHotel from "@/components/HotelReservation/SelectHotel" import { SelectHotelSkeleton } from "@/components/HotelReservation/SelectHotel/SelectHotelSkeleton" -import { - generateChildrenString, - getHotelReservationQueryParams, -} from "@/components/HotelReservation/SelectRate/RoomSelection/utils" import { setLang } from "@/i18n/serverContext" +import { getHotelSearchDetails } from "../utils" + import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams" import type { LangParams, PageArgs } from "@/types/params" @@ -19,39 +14,15 @@ export default async function SelectHotelPage({ searchParams, }: PageArgs) { setLang(params.lang) - const locations = await getLocations() - - if (!locations || "error" in locations) { - return null - } - const city = locations.data.find( - (location) => - location.name.toLowerCase() === searchParams.city.toLowerCase() - ) - - if (!city) return notFound() - - const selectHotelParams = new URLSearchParams(searchParams) - const selectHotelParamsObject = - getHotelReservationQueryParams(selectHotelParams) - - if ( - !selectHotelParamsObject.room || - selectHotelParamsObject.room.length === 0 - ) { - return notFound() - } - - const adultsParams = selectHotelParamsObject.room[0].adults // TODO: Handle multiple rooms - const childrenParams = selectHotelParamsObject.room[0].child - ? generateChildrenString(selectHotelParamsObject.room[0].child) - : undefined // TODO: Handle multiple rooms + const searchDetails = await getHotelSearchDetails({ searchParams }) + if (!searchDetails) return null + const { city, urlSearchParams, adultsInRoom, childrenInRoom } = searchDetails const reservationParams = { - selectHotelParams, + selectHotelParams: urlSearchParams, searchParams, - adultsParams, - childrenParams, + adultsInRoom, + childrenInRoom, } return ( diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx index fa32a54cd..c916ae231 100644 --- a/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/select-rate/page.tsx @@ -1,15 +1,11 @@ -import { notFound } from "next/navigation" import { Suspense } from "react" -import { getHotelData, getLocations } from "@/lib/trpc/memoizedRequests" - import HotelInfoCard from "@/components/HotelReservation/SelectRate/HotelInfoCard" import { RoomsContainer } from "@/components/HotelReservation/SelectRate/Rooms/RoomsContainer" import { RoomsContainerSkeleton } from "@/components/HotelReservation/SelectRate/Rooms/RoomsContainerSkeleton" -import { getHotelReservationQueryParams } from "@/components/HotelReservation/SelectRate/RoomSelection/utils" import { setLang } from "@/i18n/serverContext" -import { safeTry } from "@/utils/safeTry" +import { getHotelSearchDetails } from "../utils" import { getValidDates } from "./getValidDates" import type { SelectRateSearchParams } from "@/types/components/hotelReservation/selectRate/selectRate" @@ -20,43 +16,16 @@ export default async function SelectRatePage({ searchParams, }: PageArgs) { setLang(params.lang) - - const locations = await getLocations() - if (!locations || "error" in locations) { - return null - } - const hotel = locations.data.find( - (location) => - "operaId" in location && location.operaId == searchParams.hotel - ) - if (!hotel) { - return notFound() - } - const selectRoomParams = new URLSearchParams(searchParams) - const selectRoomParamsObject = - getHotelReservationQueryParams(selectRoomParams) - - if (!selectRoomParamsObject.room) { - return notFound() - } + const searchDetails = await getHotelSearchDetails({ searchParams }) + if (!searchDetails) return null + const { hotel, adultsInRoom, childrenInRoomArray } = searchDetails const { fromDate, toDate } = getValidDates( searchParams.fromDate, searchParams.toDate ) - const adults = selectRoomParamsObject.room[0].adults || 1 // TODO: Handle multiple rooms - const children = selectRoomParamsObject.room[0].child // TODO: Handle multiple rooms - - const [hotelData, hotelDataError] = await safeTry( - getHotelData({ hotelId: searchParams.hotel, language: params.lang }) - ) - - if (!hotelData && !hotelDataError) { - return notFound() - } - - const hotelId = +searchParams.hotel + const hotelId = +hotel.id return ( <> }> @@ -74,8 +43,8 @@ export default async function SelectRatePage({ lang={params.lang} fromDate={fromDate.toDate()} toDate={toDate.toDate()} - adultCount={adults} - childArray={children} + adultCount={adultsInRoom} + childArray={childrenInRoomArray} /> diff --git a/app/[lang]/(live)/(public)/hotelreservation/(standard)/utils.ts b/app/[lang]/(live)/(public)/hotelreservation/(standard)/utils.ts new file mode 100644 index 000000000..d2f9271b3 --- /dev/null +++ b/app/[lang]/(live)/(public)/hotelreservation/(standard)/utils.ts @@ -0,0 +1,77 @@ +import { notFound } from "next/navigation" + +import { getLocations } from "@/lib/trpc/memoizedRequests" + +import { + generateChildrenString, + getHotelReservationQueryParams, +} from "@/components/HotelReservation/SelectRate/RoomSelection/utils" + +import type { SelectHotelSearchParams } from "@/types/components/hotelReservation/selectHotel/selectHotelSearchParams" +import type { + Child, + SelectRateSearchParams, +} from "@/types/components/hotelReservation/selectRate/selectRate" +import type { Location } from "@/types/trpc/routers/hotel/locations" + +interface HotelSearchDetails { + city: Location + hotel: Location + urlSearchParams?: URLSearchParams + adultsInRoom: number + childrenInRoom?: string + childrenInRoomArray?: Child[] +} + +export async function getHotelSearchDetails({ + searchParams, +}: { + searchParams: + | (SelectHotelSearchParams & { + [key: string]: string + }) + | (SelectRateSearchParams & { + [key: string]: string + }) +}): Promise { + const locations = await getLocations() + + if (!locations || "error" in locations) return null + + const city = locations.data.find( + (location) => + location.name.toLowerCase() === searchParams.city?.toLowerCase() + ) + const hotel = locations.data.find( + (location) => + "operaId" in location && location.operaId == searchParams.hotel + ) + + if (!city && !hotel) return notFound() + + const urlSearchParams = new URLSearchParams(searchParams) + const searchParamsObject = getHotelReservationQueryParams(urlSearchParams) + + let adultsInRoom = 1 + let childrenInRoom: string | undefined = undefined + let childrenInRoomArray: Child[] | undefined = undefined + + if (searchParamsObject.room && searchParamsObject.room.length > 0) { + adultsInRoom = searchParamsObject.room[0].adults // TODO: Handle multiple rooms + childrenInRoom = searchParamsObject.room[0].child + ? generateChildrenString(searchParamsObject.room[0].child) + : undefined // TODO: Handle multiple rooms + childrenInRoomArray = searchParamsObject.room[0].child + ? searchParamsObject.room[0].child + : undefined // TODO: Handle multiple rooms + } + + return { + city: city!, + hotel: hotel!, + urlSearchParams, + adultsInRoom, + childrenInRoom, + childrenInRoomArray, + } +} diff --git a/components/HotelReservation/SelectHotel/index.tsx b/components/HotelReservation/SelectHotel/index.tsx index 2795d0c00..16c17520e 100644 --- a/components/HotelReservation/SelectHotel/index.tsx +++ b/components/HotelReservation/SelectHotel/index.tsx @@ -34,7 +34,7 @@ export default async function SelectHotel({ params, reservationParams, }: SelectHotelProps) { - const { selectHotelParams, searchParams, adultsParams, childrenParams } = + const { selectHotelParams, searchParams, adultsInRoom, childrenInRoom } = reservationParams const intl = await getIntl() @@ -44,8 +44,8 @@ export default async function SelectHotel({ cityId: city.id, roomStayStartDate: searchParams.fromDate, roomStayEndDate: searchParams.toDate, - adults: adultsParams, - children: childrenParams?.toString(), + adults: adultsInRoom, + children: childrenInRoom, }) ) diff --git a/types/components/hotelReservation/selectHotel/selectHotel.ts b/types/components/hotelReservation/selectHotel/selectHotel.ts index 016645813..4303d65a7 100644 --- a/types/components/hotelReservation/selectHotel/selectHotel.ts +++ b/types/components/hotelReservation/selectHotel/selectHotel.ts @@ -1,7 +1,6 @@ -import { Lang } from "@/constants/languages" - import type { CheckInData, Hotel, ParkingData } from "@/types/hotel" import type { Location } from "@/types/trpc/routers/hotel/locations" +import type { Lang } from "@/constants/languages" import type { SelectHotelSearchParams } from "./selectHotelSearchParams" export enum AvailabilityEnum { @@ -46,9 +45,9 @@ export interface SelectHotelProps { lang: Lang } reservationParams: { - selectHotelParams: URLSearchParams + selectHotelParams: URLSearchParams | undefined searchParams: SelectHotelSearchParams - adultsParams: number - childrenParams: string | undefined + adultsInRoom: number + childrenInRoom: string | undefined } }