import { cookies } from "next/headers" import { notFound } from "next/navigation" import { Typography } from "@scandic-hotels/design-system/Typography" import { env } from "@/env/server" import { dt } from "@/lib/dt" import { getAncillaryPackages, getBookingConfirmation, getLinkedReservations, getPackages, getProfileSafely, getSavedPaymentCardsSafely, } from "@/lib/trpc/memoizedRequests" import { decrypt } from "@/server/routers/utils/encryption" import AdditionalInfoForm from "@/components/HotelReservation/FindMyBooking/AdditionalInfoForm" import accessBooking, { ACCESS_GRANTED, ERROR_BAD_REQUEST, ERROR_UNAUTHORIZED, } from "@/components/HotelReservation/MyStay/accessBooking" import { Ancillaries } from "@/components/HotelReservation/MyStay/Ancillaries" import BookingSummary from "@/components/HotelReservation/MyStay/BookingSummary" import { Header } from "@/components/HotelReservation/MyStay/Header" import Promo from "@/components/HotelReservation/MyStay/Promo" import { ReferenceCard } from "@/components/HotelReservation/MyStay/ReferenceCard" import Rooms from "@/components/HotelReservation/MyStay/Rooms" import SidePeek from "@/components/HotelReservation/SidePeek" import Image from "@/components/Image" import { getIntl } from "@/i18n" import { setLang } from "@/i18n/serverContext" import MyStayProvider from "@/providers/MyStay" import { getCurrentWebUrl } from "@/utils/url" import styles from "./page.module.css" import { BreakfastPackageEnum } from "@/types/enums/breakfast" import type { LangParams, PageArgs } from "@/types/params" export default async function MyStay({ params, searchParams, }: PageArgs) { setLang(params.lang) const refId = searchParams.RefId if (!refId) { notFound() } const value = decrypt(refId) if (!value) { return notFound() } const [confirmationNumber, lastName] = value.split(",") const bookingConfirmation = await getBookingConfirmation(confirmationNumber) if (!bookingConfirmation) { return notFound() } const { additionalData, booking, hotel, roomCategories } = bookingConfirmation const user = await getProfileSafely() const bv = cookies().get("bv")?.value const intl = await getIntl() const access = accessBooking(booking.guest, lastName, user, bv) if (access === ACCESS_GRANTED) { const lang = params.lang const fromDate = dt(booking.checkInDate).format("YYYY-MM-DD") const toDate = dt(booking.checkOutDate).format("YYYY-MM-DD") const linkedReservationsPromise = getLinkedReservations({ rooms: booking.linkedReservations, }) const packagesInput = { adults: booking.adults, children: booking.childrenAges.length, endDate: toDate, hotelId: hotel.operaId, lang, startDate: fromDate, packageCodes: [ BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST, BreakfastPackageEnum.ANCILLARY_CHILD_PAYING_BREAKFAST, BreakfastPackageEnum.FREE_CHILD_BREAKFAST, ], } const supportedCards = hotel.merchantInformationData.cards const savedPaymentCardsInput = { supportedCards } const hasBreakfastPackage = booking.packages.find( (pkg) => pkg.code === BreakfastPackageEnum.REGULAR_BREAKFAST ) const breakfastIncluded = booking.rateDefinition.breakfastIncluded const shouldFetchBreakfastPackages = !hasBreakfastPackage && !breakfastIncluded if (shouldFetchBreakfastPackages) { void getPackages(packagesInput) } void getSavedPaymentCardsSafely(savedPaymentCardsInput) const ancillaryPackages = await getAncillaryPackages({ fromDate, hotelId: hotel.operaId, toDate, }) let breakfastPackages = null if (shouldFetchBreakfastPackages) { breakfastPackages = await getPackages(packagesInput) } const savedCreditCards = await getSavedPaymentCardsSafely( savedPaymentCardsInput ) const imageSrc = hotel.hotelContent.images.imageSizes.large ?? additionalData.gallery?.heroImages[0]?.imageSizes.large ?? hotel.galleryImages[0]?.imageSizes.large const baseUrl = env.PUBLIC_URL || "https://www.scandichotels.com" const promoUrl = env.HIDE_FOR_NEXT_RELEASE ? new URL(getCurrentWebUrl({ path: "/", lang })) : new URL(`${baseUrl}/${lang}/`) promoUrl.searchParams.set("hotel", hotel.operaId) return (
{imageSrc && ( {hotel.name} )}
{booking.showAncillaries && ( )}
) } if (access === ERROR_BAD_REQUEST) { return (
) } if (access === ERROR_UNAUTHORIZED) { return (

{intl.formatMessage({ defaultMessage: "You need to be logged in to view your booking", })}

{intl.formatMessage({ defaultMessage: "And you need to be logged in with the same member account that made the booking.", })}

) } return notFound() }