import { cookies } from "next/headers" import { notFound } from "next/navigation" import ScandicLogoIcon from "@scandic-hotels/design-system/Icons/ScandicLogoIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { dt } from "@/lib/dt" import { findBooking, getAncillaryPackages, getBookingConfirmation, getProfileSafely, } from "@/lib/trpc/memoizedRequests" import { getIntl } from "@/i18n" import { isLoggedInUser } from "@/utils/isLoggedInUser" import * as maskValue from "@/utils/maskValue" import { parseRefId } from "@/utils/refId" import AdditionalInfoForm from "../../FindMyBooking/AdditionalInfoForm" import accessBooking, { ACCESS_GRANTED, ERROR_BAD_REQUEST, ERROR_UNAUTHORIZED, } from "../accessBooking" import Footer from "./Footer" import Specification from "./Specification" import Total from "./Total" import Tracking from "./tracking" import styles from "./receipt.module.css" import { CurrencyEnum } from "@/types/enums/currency" import type { BookingConfirmation } from "@/types/trpc/routers/booking/confirmation" export async function Receipt({ refId }: { refId: string }) { const { confirmationNumber, lastName } = parseRefId(refId) if (!confirmationNumber) { return notFound() } const isLoggedIn = await isLoggedInUser() const cookieStore = await cookies() const bv = cookieStore.get("bv")?.value let bookingConfirmation if (isLoggedIn) { bookingConfirmation = await getBookingConfirmation(refId) } else if (bv) { const params = new URLSearchParams(bv) const firstName = params.get("firstName") const email = params.get("email") if (firstName && email) { bookingConfirmation = await findBooking( confirmationNumber, lastName, firstName, email ) } else { return ( ) } } else { return ( ) } if (!bookingConfirmation) { return notFound() } const { hotel, room, booking } = bookingConfirmation const user = await getProfileSafely() const intl = await getIntl() const access = accessBooking(booking.guest, lastName, user, bv) if (access === ACCESS_GRANTED) { const ancillaryPackages = await getAncillaryPackages({ fromDate: dt(booking.checkInDate).format("YYYY-MM-DD"), hotelId: hotel.operaId, toDate: dt(booking.checkOutDate).format("YYYY-MM-DD"), }) const currency = booking.currencyCode !== CurrencyEnum.POINTS ? booking.currencyCode : (booking.ancillaries.find((a) => a.currency !== CurrencyEnum.POINTS) ?.currency ?? booking.packages.find((p) => p.currency !== CurrencyEnum.POINTS) ?.currency) const maskedBookingConfirmation = { ...bookingConfirmation, booking: { ...bookingConfirmation.booking, guest: { ...bookingConfirmation.booking.guest, email: maskValue.email(bookingConfirmation.booking.guest.email), phoneNumber: maskValue.phone( bookingConfirmation.booking.guest.phoneNumber ?? "" ), }, }, } satisfies BookingConfirmation const { booking: maskedBooking } = maskedBookingConfirmation return (
{hotel.name}
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {`${hotel.address.streetAddress}, ${hotel.address.zipCode} ${hotel.address.city}`}
{hotel.contactInformation.email}
{hotel.contactInformation.phoneNumber}
{/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${maskedBooking.guest.firstName} ${maskedBooking.guest.lastName}`}
{maskedBooking.guest.membershipNumber && ( {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */}
{`${intl.formatMessage({ defaultMessage: "Member", })} ${maskedBooking.guest.membershipNumber}`}
)}
{maskedBooking.guest.email}
{maskedBooking.guest.phoneNumber}

) } 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() } function RenderAdditionalInfoForm({ confirmationNumber, lastName, }: { confirmationNumber: string lastName: string }) { return (
) }