"use client" import { Fragment } from "react" import { useIntl } from "react-intl" import { dt } from "@scandic-hotels/common/dt" import { Typography } from "@scandic-hotels/design-system/Typography" import { longDateFormat } from "@/constants/dateFormats" import useLang from "@/hooks/useLang" import BookingCodeRow from "./Row/BookingCode" import HeaderRow from "./Row/Header" import LargeRow from "./Row/Large" import CorporateChequePrice, { type CorporateChequePriceType, } from "./Row/Price/CorporateCheque" import RedemptionPrice, { type RedemptionPriceType, } from "./Row/Price/Redemption" import RegularPrice, { type RegularPriceType } from "./Row/Price/Regular" import VoucherPrice, { type VoucherPriceType } from "./Row/Price/Voucher" import VatRow from "./Row/Vat" import Breakfast from "./Breakfast" import Tbody from "./Tbody" import styles from "./priceDetailsTable.module.css" import type { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import type { Child } from "@scandic-hotels/trpc/types/child" import type { Packages } from "@scandic-hotels/trpc/types/packages" import type { RateDefinition } from "@scandic-hotels/trpc/types/roomAvailability" import type { BreakfastPackage } from "@/types/components/hotelReservation/breakfast" import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType" import type { Price } from "@/types/components/hotelReservation/price" type RoomPrice = | CorporateChequePriceType | RegularPriceType | RedemptionPriceType | VoucherPriceType export interface Room { adults: number bedType: BedTypeSchema | undefined breakfast: Omit | false | undefined | null breakfastChildren?: Omit | null breakfastIncluded: boolean childrenInRoom: Child[] | undefined packages: Packages | null price: RoomPrice rateDefinition: Pick roomType: string } export interface PriceDetailsTableProps { bookingCode?: string fromDate: string isCampaignRate?: boolean rooms: Room[] toDate: string totalPrice: Price vat: number defaultCurrency: CurrencyEnum } export default function PriceDetailsTable({ bookingCode, fromDate, isCampaignRate, rooms, toDate, totalPrice, vat, defaultCurrency, }: PriceDetailsTableProps) { const intl = useIntl() const lang = useLang() const nights = dt(toDate).diff(fromDate, "days") const nightsMsg = intl.formatMessage( { defaultMessage: "{totalNights, plural, one {# night} other {# nights}}" }, { totalNights: nights } ) const arrival = dt(fromDate).locale(lang).format(longDateFormat[lang]) const departue = dt(toDate).locale(lang).format(longDateFormat[lang]) const duration = ` ${arrival} - ${departue} (${nightsMsg})` const isAllBreakfastIncluded = rooms.every((room) => room.breakfastIncluded) const allPricesIsDiscounted = rooms.every((room) => { if (!("regular" in room.price)) { return false } if (room.rateDefinition.isMemberRate) { return true } if (!room.price.regular) { return false } return room.price.regular.pricePerStay > room.price.regular.pricePerStay }) return ( {rooms.map((room, idx) => { let currency = "" let chequePrice: CorporateChequePriceType["corporateCheque"] | undefined if ("corporateCheque" in room.price && room.price.corporateCheque) { chequePrice = room.price.corporateCheque if (room.price.corporateCheque.currency) { currency = room.price.corporateCheque.currency } } let isMemberRate = false let price: RegularPriceType["regular"] | undefined if ("regular" in room.price && room.price.regular) { price = room.price.regular currency = room.price.regular.currency isMemberRate = room.rateDefinition.isMemberRate } let redemptionPrice: RedemptionPriceType["redemption"] | undefined if ("redemption" in room.price && room.price.redemption) { redemptionPrice = room.price.redemption if (room.price.redemption.currency) { currency = room.price.redemption.currency } } let voucherPrice: VoucherPriceType["voucher"] | undefined if ("voucher" in room.price && room.price.voucher) { voucherPrice = room.price.voucher } if (!currency) { currency = defaultCurrency } if (!price && !voucherPrice && !chequePrice && !redemptionPrice) { return null } return ( {rooms.length > 1 && ( )} ) })}
{intl.formatMessage( { defaultMessage: "Room {roomIndex}" }, { roomIndex: idx + 1 } )}
) }