"use client" import { cx } from "class-variance-authority" import { useEffect, useRef, useState } from "react" import { Button as ButtonRAC } from "react-aria-components" import { useIntl } from "react-intl" import { Button } from "@scandic-hotels/design-system/Button" import { MaterialIcon } from "@scandic-hotels/design-system/Icons/MaterialIcon" import { Typography } from "@scandic-hotels/design-system/Typography" import { useRatesStore } from "@/stores/select-rate" import { formatPrice } from "@/utils/numberFormatting" import SummaryContent from "./Content" import { mapRate } from "./mapRate" import { isBookingCodeRate } from "./utils" import styles from "./mobileSummary.module.css" import type { RoomsAvailability } from "@scandic-hotels/trpc/types/roomAvailability" import type { MobileSummaryProps } from "@/types/components/hotelReservation/selectRate/rateSummary" export default function MobileSummary({ isAllRoomsSelected, isUserLoggedIn, totalPriceToShow, }: MobileSummaryProps) { const intl = useIntl() const scrollY = useRef(0) const [isSummaryOpen, setIsSummaryOpen] = useState(false) const { booking, bookingRooms, roomsAvailability, rateSummary, vat } = useRatesStore((state) => ({ booking: state.booking, bookingRooms: state.booking.rooms, roomsAvailability: state.roomsAvailability, rateSummary: state.rateSummary, vat: state.vat, })) function toggleSummaryOpen() { setIsSummaryOpen(!isSummaryOpen) } useEffect(() => { if (isSummaryOpen) { scrollY.current = window.scrollY document.body.style.position = "fixed" document.body.style.top = `-${scrollY.current}px` document.body.style.width = "100%" } else { document.body.style.position = "" document.body.style.top = "" document.body.style.width = "" window.scrollTo({ top: scrollY.current, left: 0, behavior: "instant", }) } return () => { document.body.style.position = "" document.body.style.top = "" document.body.style.width = "" } }, [isSummaryOpen]) const roomRateDefinitions = roomsAvailability?.find( (ra): ra is RoomsAvailability => "rateDefinitions" in ra ) if (!roomRateDefinitions) { return null } const rooms = rateSummary.map((room, index) => room ? mapRate(room, index, bookingRooms, room.packages) : null ) const containsBookingCodeRate = rateSummary.find( (r) => r && isBookingCodeRate(r.product) ) const showDiscounted = containsBookingCodeRate || isUserLoggedIn return (
{intl.formatMessage({ defaultMessage: "Total price", })} {formatPrice( intl, totalPriceToShow.local.price, totalPriceToShow.local.currency, totalPriceToShow.local.additionalPrice, totalPriceToShow.local.additionalPriceCurrency )} {showDiscounted && totalPriceToShow.local.regularPrice ? ( {formatPrice( intl, totalPriceToShow.local.regularPrice, totalPriceToShow.local.currency )} ) : null} {intl.formatMessage({ defaultMessage: "See details", })}
) }