import { Fragment } from "react" import { useIntl } from "react-intl" import { Divider } from "@scandic-hotels/design-system/Divider" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast" import Accordion from "@/components/TempDesignSystem/Accordion" import AccordionItem from "@/components/TempDesignSystem/Accordion/AccordionItem" import Body from "@/components/TempDesignSystem/Text/Body" import Subtitle from "@/components/TempDesignSystem/Text/Subtitle" import { formatPrice } from "@/utils/numberFormatting" import { getBreakfastPackagesFromAncillaryFlow } from "../../utils/hasBreakfastPackage" import RemoveButton from "./RemoveButton" import styles from "./addedAncillaries.module.css" import type { PackageSchema } from "@scandic-hotels/trpc/types/bookingConfirmation" import type { AddedAncillariesProps } from "@/types/components/myPages/myStay/ancillaries" import type { Room } from "@/types/stores/my-stay" export function AddedAncillaries({ ancillaries, booking, }: AddedAncillariesProps) { const intl = useIntl() const addedBreakfastPackages = getBreakfastPackagesFromAncillaryFlow( booking.originalPackages ) const addedAncillaries = getAddedAncillaries(booking, addedBreakfastPackages) if (addedAncillaries.length === 0) { return null } return (
{intl.formatMessage({ defaultMessage: "My Add-on's", })} {booking.ancillary?.deliveryTime && (
{intl.formatMessage({ defaultMessage: "Delivered at:", })} {booking.ancillary?.deliveryTime}
)}
{addedAncillaries.map((ancillary) => { const ancillaryTitle = `${ ancillary.code === BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST ? intl.formatMessage({ defaultMessage: "Breakfast", }) : (ancillaries?.find( (a) => a.id === ancillary.code || a.loyaltyCode === ancillary.code )?.title ?? "") } X${ancillary.totalUnit}` return ( } >
{ancillary.comment && ( <>
{intl.formatMessage({ defaultMessage: "Other requests", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"} {ancillary.comment}
)}
{intl.formatMessage({ defaultMessage: "Total", })} {ancillary.currency.toLowerCase() === "points" ? // eslint-disable-next-line formatjs/no-literal-string-in-jsx `${ancillary.totalPrice} ${intl.formatMessage({ defaultMessage: "Points", })}` : formatPrice( intl, ancillary.totalPrice, ancillary.currency )}
{booking.confirmationNumber && ancillary.code ? (
p.code) : [ancillary.code] } title={ancillaryTitle} booking={booking} ancillary={ancillary} addedBreakfastPackages={addedBreakfastPackages} />
) : null}
{ancillaryTitle}
{intl.formatMessage({ defaultMessage: "Total", })} {ancillary.currency.toLowerCase() === "points" ? // eslint-disable-next-line formatjs/no-literal-string-in-jsx `${ancillary.totalPrice} ${intl.formatMessage({ defaultMessage: "Points", })}` : formatPrice( intl, ancillary.totalPrice, ancillary.currency )}
{ancillary.comment && ( <> {intl.formatMessage({ defaultMessage: "Other requests", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"} {ancillary.comment} )}
{booking.confirmationNumber && ancillary.code && booking.canModifyAncillaries ? (
p.code) : [ancillary.code] } title={ancillaryTitle} booking={booking} ancillary={ancillary} addedBreakfastPackages={addedBreakfastPackages} />
) : null}
) })}
) } /** * All ancillaries that are added to the booking * * Adding a special ancillary for breakfast, calculated from * all breakfast packages that has been added as ancillaries, * not in the booking flow. */ function getAddedAncillaries( booking: Room, addedBreakfastPackages: PackageSchema[] | undefined ) { if (!addedBreakfastPackages?.length) { return booking.ancillaries } const combinedBreakfastPackageAsAncillary: PackageSchema = { code: BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST, unitPrice: 0, currency: addedBreakfastPackages[0].currency, type: addedBreakfastPackages[0].type, description: addedBreakfastPackages[0].description, comment: addedBreakfastPackages[0].comment, totalPrice: addedBreakfastPackages.reduce( (acc, curr) => acc + curr.totalPrice, 0 ), unit: addedBreakfastPackages.reduce((acc, curr) => acc + curr.unit, 0), totalUnit: addedBreakfastPackages.reduce( (acc, curr) => acc + curr.totalUnit, 0 ), } return [combinedBreakfastPackageAsAncillary, ...booking.ancillaries] }