"use client" import { useRef } from "react" import { useIntl } from "react-intl" import { CurrencyEnum } from "@scandic-hotels/common/constants/currency" import { formatPrice } from "@scandic-hotels/common/utils/numberFormatting" import { BookingConfirmationContext } from "../contexts/BookingConfirmation" import { createBookingConfirmationStore } from "../stores/booking-confirmation" import type { BookingConfirmationStore } from "../types/contexts/booking-confirmation" import type { BookingConfirmationProviderProps } from "../types/providers/booking-confirmation" export function BookingConfirmationProvider({ bookingCode, children, currencyCode, fromDate, hotelOffersBreakfast, toDate, roomCategories, rooms, vat, }: BookingConfirmationProviderProps) { const intl = useIntl() const storeRef = useRef(undefined) // eslint-disable-next-line react-hooks/refs if (!storeRef.current) { const totalBookingPrice = rooms.reduce((acc, room) => { const reservationTotalPrice = room?.totalPrice || 0 return acc + reservationTotalPrice }, 0) let formattedTotalCost = formatPrice(intl, totalBookingPrice, currencyCode) const totalBookingPoints = rooms.reduce((acc, room) => { return acc + (room?.roomPoints ?? 0) }, 0) const totalBookingCheques = rooms.reduce((acc, room) => { return acc + (room?.cheques ?? 0) }, 0) const totalBookingVouchers = rooms.reduce((acc, room) => { return acc + (room?.vouchers ?? 0) }, 0) let isVatCurrency = true if (totalBookingPoints) { // We can assume all rooms have the same point type const pointsType = rooms?.[0]?.pointsType isVatCurrency = false formattedTotalCost = formatPrice( intl, totalBookingPoints, CurrencyEnum.POINTS, totalBookingPrice, currencyCode, pointsType ) } else if (totalBookingCheques) { isVatCurrency = false formattedTotalCost = formatPrice( intl, totalBookingCheques, CurrencyEnum.CC, totalBookingPrice, currencyCode ) } else if (totalBookingVouchers) { const room = rooms?.[0] if (room?.packages) { const pkgsSum = room.packages.reduce( (total, pkg) => total + pkg.totalPrice, 0 ) const currency = room.packages.find((pkg) => pkg.currency)?.currency isVatCurrency = false formattedTotalCost = formatPrice( intl, totalBookingVouchers, CurrencyEnum.Voucher, pkgsSum, currency ) } else { isVatCurrency = false formattedTotalCost = formatPrice( intl, totalBookingVouchers, CurrencyEnum.Voucher ) } } const initialData = { bookingCode, currencyCode, fromDate, toDate, roomCategories, rooms, vat, isVatCurrency, hotelOffersBreakfast, formattedTotalCost, totalBookingPrice, totalBookingCheques, } storeRef.current = createBookingConfirmationStore(initialData) } return ( // eslint-disable-next-line react-hooks/refs {children} ) }