chore (SW-834): Upgrade to Next 15 * wip: apply codemod and upgrade swc plugin * wip: design-system to react 19, fix issues from async (search)params * wip: fix remaining issues from codemod serverClient is now async because context use headers() getLang is now async because it uses headers() * Minor cleanup * Inline react-material-symbols package Package is seemingly not maintained any more and doesn't support React 19. This copies the package source into `design-system`, makes the necessary changes for 19 and export it for others to use. * Fix missing awaits * Disable modal exit animations Enabling modal exit animations via isExiting prop is causing modals to be rendered in "hidden" state and never unmount. Seems to be an issue with react-aria-components, see https://github.com/adobe/react-spectrum/issues/7563. Can probably be fixed by rewriting to a solution similar to https://react-spectrum.adobe.com/react-aria/examples/framer-modal-sheet.html * Remove unstable cache implementation and use in memory cache locally * Fix ref type in SelectFilter * Use cloneElement to add key prop to element Approved-by: Linus Flood
111 lines
3.0 KiB
TypeScript
111 lines
3.0 KiB
TypeScript
"use client"
|
|
|
|
import { useRef } from "react"
|
|
import { useIntl } from "react-intl"
|
|
|
|
import { createBookingConfirmationStore } from "@/stores/booking-confirmation"
|
|
|
|
import { BookingConfirmationContext } from "@/contexts/BookingConfirmation"
|
|
import { formatPrice } from "@/utils/numberFormatting"
|
|
|
|
import type { BookingConfirmationStore } from "@/types/contexts/booking-confirmation"
|
|
import { CurrencyEnum } from "@/types/enums/currency"
|
|
import type { BookingConfirmationProviderProps } from "@/types/providers/booking-confirmation"
|
|
|
|
export default function BookingConfirmationProvider({
|
|
bookingCode,
|
|
children,
|
|
currencyCode,
|
|
fromDate,
|
|
toDate,
|
|
roomCategories,
|
|
rooms,
|
|
vat,
|
|
}: BookingConfirmationProviderProps) {
|
|
const intl = useIntl()
|
|
const storeRef = useRef<BookingConfirmationStore>(undefined)
|
|
|
|
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) {
|
|
isVatCurrency = false
|
|
formattedTotalCost = formatPrice(
|
|
intl,
|
|
totalBookingPoints,
|
|
CurrencyEnum.POINTS,
|
|
totalBookingPrice,
|
|
currencyCode
|
|
)
|
|
} 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,
|
|
formattedTotalCost,
|
|
totalBookingPrice,
|
|
totalBookingCheques,
|
|
}
|
|
|
|
storeRef.current = createBookingConfirmationStore(initialData)
|
|
}
|
|
|
|
return (
|
|
<BookingConfirmationContext.Provider value={storeRef.current}>
|
|
{children}
|
|
</BookingConfirmationContext.Provider>
|
|
)
|
|
}
|