Files
web/packages/booking-flow/lib/providers/BookingConfirmationProvider.tsx
Anton Gunnarsson 16fbdb7ae0 Merged in fix/refactor-currency-display (pull request #3434)
fix(SW-3616): Handle EuroBonus point type everywhere

* Add tests to formatPrice

* formatPrice

* More work replacing config with api points type

* More work replacing config with api points type

* More fixing with currency

* maybe actually fixed it

* Fix MyStay

* Clean up

* Fix comments

* Merge branch 'master' into fix/refactor-currency-display

* Fix calculateTotalPrice for EB points + SF points + cash


Approved-by: Joakim Jäderberg
2026-01-15 09:32:17 +00:00

118 lines
3.3 KiB
TypeScript

"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<BookingConfirmationStore>(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
<BookingConfirmationContext.Provider value={storeRef.current}>
{children}
</BookingConfirmationContext.Provider>
)
}