import { Fragment } from "react" import { useIntl } from "react-intl" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import Accordion from "@scandic-hotels/design-system/Accordion" import AccordionItem from "@scandic-hotels/design-system/Accordion/AccordionItem" import { Divider } from "@scandic-hotels/design-system/Divider" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import Subtitle from "@scandic-hotels/design-system/Subtitle" import { Typography } from "@scandic-hotels/design-system/Typography" import { BreakfastPackageEnum } from "@scandic-hotels/trpc/enums/breakfast" 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 extras", id: "myStay.addedAncillaries.title", })} {booking.ancillary?.deliveryTime && (

{intl.formatMessage({ id: "ancillaries.deliveredAt", defaultMessage: "Delivered at:", })}

{booking.ancillary?.deliveryTime}

)}
{addedAncillaries.map((ancillary) => { const ancillaryTitle = `${ ancillary.code === BreakfastPackageEnum.ANCILLARY_REGULAR_BREAKFAST ? intl.formatMessage({ id: "common.breakfast", defaultMessage: "Breakfast", }) : (ancillaries?.find( (a) => a.id === ancillary.code || a.loyaltyCode === ancillary.code )?.title ?? "") } X${ancillary.totalUnit}` return ( } >
{ancillary.comment && ( <>

{intl.formatMessage({ id: "common.otherRequests", defaultMessage: "Other requests", })} {/* eslint-disable-next-line formatjs/no-literal-string-in-jsx */} {":"}

{ancillary.comment}

)}

{intl.formatMessage({ id: "common.total", defaultMessage: "Total", })}

{ancillary.currency.toLowerCase() === "points" ? intl.formatMessage( { id: "common.numberOfPoints", defaultMessage: "{points, plural, one {# point} other {# points}}", }, { points: ancillary.totalPrice, } ) : 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({ id: "common.total", defaultMessage: "Total", })}

{ancillary.currency.toLowerCase() === "points" ? intl.formatMessage( { id: "common.numberOfPoints", defaultMessage: "{points, plural, one {# point} other {# points}}", }, { points: ancillary.totalPrice, } ) : formatPrice( intl, ancillary.totalPrice, ancillary.currency )}

{ancillary.comment && ( <>

{intl.formatMessage({ id: "common.otherRequests", 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] }