"use client" import { type IntlShape, useIntl } from "react-intl" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { PointType } from "@scandic-hotels/common/constants/pointType" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import BoldRow from "../Bold" import RegularRow from "../Regular" import BedTypeRow from "./BedType" import PackagesRow from "./Packages" import type { SharedPriceRowProps } from "./price" export interface RedemptionPriceType { redemption?: { additionalPricePerStay?: number currency?: CurrencyEnum pointsPerNight: number pointsPerStay: number pointsType: PointType } } interface RedemptionPriceProps extends SharedPriceRowProps { currency: CurrencyEnum nights: number price: RedemptionPriceType["redemption"] } export default function RedemptionPrice({ bedType, currency, nights, packages, price, }: RedemptionPriceProps) { const intl = useIntl() if (!price) { return null } const averagePriceTitle = intl.formatMessage({ id: "priceDetails.averagePricePerNight", defaultMessage: "Average price per night", }) const additionalPricePerStay = price.additionalPricePerStay const averageAdditionalPricePerNight = additionalPricePerStay ? Math.ceil(additionalPricePerStay / nights) : null const actualCurrency = price.currency || currency const formattedCurrency = getCurrencyText( price.pointsPerStay, actualCurrency, price.pointsType, intl ) let averagePricePerNight = `${price.pointsPerNight} ${formattedCurrency}` if (averageAdditionalPricePerNight) { averagePricePerNight = `${averagePricePerNight} + ${averageAdditionalPricePerNight} ${formattedCurrency}` } return ( <> {nights > 1 ? ( ) : null} ) } function getCurrencyText( points: number, currency: CurrencyEnum | undefined, pointsType: PointType, intl: IntlShape ) { if (!currency) return currency if (currency === CurrencyEnum.POINTS) { switch (pointsType) { case PointType.SCANDIC: { return intl.formatMessage( { id: "price.numberOfScandicPoints", defaultMessage: "{numberOfScandicPoints, plural, one {Point} other {Points}}", }, { numberOfScandicPoints: points, } ) } case PointType.EUROBONUS: { return intl.formatMessage( { id: "price.numberOfEuroBonusPoints", defaultMessage: "{numberOfEuroBonusPoints, plural, one {EB Point} other {EB Points}}", }, { numberOfEuroBonusPoints: points, } ) } default: { const _exhaustiveCheck: never = pointsType return currency } } } return currency }