Merged in fix/SW-2249-missing-currency (pull request #2159)

fix(SW-2249): Added default currency to summary and price details modal

* fix(SW-2249): Added default currency to summary and price details modal


Approved-by: Hrishikesh Vaipurkar
This commit is contained in:
Tobias Johansson
2025-05-26 06:51:57 +00:00
parent 2ddf31cbed
commit f77202f58b
13 changed files with 77 additions and 67 deletions

View File

@@ -132,6 +132,7 @@ export default function PriceDetails() {
toDate={checkOutDate}
totalPrice={totalPrice}
vat={vat}
defaultCurrency={currency}
/>
)
}

View File

@@ -13,12 +13,14 @@ export default function DesktopSummary({ isMember }: SummaryProps) {
(state) => state.actions.toggleSummaryOpen
)
const { booking, rooms, totalPrice, vat } = useEnterDetailsStore((state) => ({
booking: state.booking,
rooms: state.rooms,
totalPrice: state.totalPrice,
vat: state.vat,
}))
const { booking, rooms, totalPrice, vat, defaultCurrency } =
useEnterDetailsStore((state) => ({
booking: state.booking,
rooms: state.rooms,
totalPrice: state.totalPrice,
vat: state.vat,
defaultCurrency: state.defaultCurrency,
}))
return (
<SidePanel variant="summary">
@@ -29,6 +31,7 @@ export default function DesktopSummary({ isMember }: SummaryProps) {
totalPrice={totalPrice}
vat={vat}
toggleSummaryOpen={toggleSummaryOpen}
defaultCurrency={defaultCurrency}
/>
</SidePanel>
)

View File

@@ -19,12 +19,14 @@ export default function MobileSummary({ isMember }: SummaryProps) {
})
)
const { booking, rooms, totalPrice, vat } = useEnterDetailsStore((state) => ({
booking: state.booking,
rooms: state.rooms,
totalPrice: state.totalPrice,
vat: state.vat,
}))
const { booking, rooms, totalPrice, vat, defaultCurrency } =
useEnterDetailsStore((state) => ({
booking: state.booking,
rooms: state.rooms,
totalPrice: state.totalPrice,
vat: state.vat,
defaultCurrency: state.defaultCurrency,
}))
const showPromo =
!isMember &&
@@ -58,6 +60,7 @@ export default function MobileSummary({ isMember }: SummaryProps) {
totalPrice={totalPrice}
vat={vat}
toggleSummaryOpen={toggleSummaryOpen}
defaultCurrency={defaultCurrency}
/>
</div>
</SummaryBottomSheet>

View File

@@ -28,14 +28,6 @@ import styles from "./ui.module.css"
import { ChildBedMapEnum } from "@/types/components/bookingWidget/enums"
import type { RoomRate } from "@/types/components/hotelReservation/enterDetails/details"
import type { EnterDetailsSummaryProps } from "@/types/components/hotelReservation/summary"
import { CurrencyEnum } from "@/types/enums/currency"
const notDisplayableCurrencies = [
CurrencyEnum.CC,
CurrencyEnum.POINTS,
CurrencyEnum.Voucher,
CurrencyEnum.Unknown,
]
export default function SummaryUI({
booking,
@@ -44,6 +36,7 @@ export default function SummaryUI({
isMember,
vat,
toggleSummaryOpen,
defaultCurrency,
}: EnterDetailsSummaryProps) {
const intl = useIntl()
const lang = useLang()
@@ -190,10 +183,6 @@ export default function SummaryUI({
const guests = guestsParts.join(", ")
const hideBedCurrency = notDisplayableCurrencies.includes(
room.roomPrice.perStay.local.currency
)
let rateDetails = room.rateDetails
if (room.memberRateDetails) {
if (isMember || room.guest.join) {
@@ -201,6 +190,8 @@ export default function SummaryUI({
}
}
const zeroPrice = formatPrice(intl, 0, defaultCurrency)
return (
<Fragment key={idx}>
<div
@@ -314,15 +305,7 @@ export default function SummaryUI({
{room.bedType.description}
</Body>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
0,
hideBedCurrency
? ""
: room.roomPrice.perStay.local.currency
)}
</Body>
<Body color="uiTextHighContrast">{zeroPrice}</Body>
</div>
) : null}
{childBedCrib ? (
@@ -342,13 +325,7 @@ export default function SummaryUI({
})}
</Caption>
</div>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
0,
room.roomPrice.perStay.local.currency
)}
</Body>
<Body color="uiTextHighContrast">{zeroPrice}</Body>
</div>
) : null}
{childBedExtraBed ? (
@@ -365,13 +342,7 @@ export default function SummaryUI({
)}
</Body>
</div>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
0,
room.roomPrice.perStay.local.currency
)}
</Body>
<Body color="uiTextHighContrast">{zeroPrice}</Body>
</div>
) : null}
<Breakfast
@@ -405,6 +376,7 @@ export default function SummaryUI({
toDate={booking.toDate}
totalPrice={totalPrice}
vat={vat}
defaultCurrency={defaultCurrency}
/>
</div>
<div>

View File

@@ -36,6 +36,7 @@ export default function PriceDetails() {
toDate={toDate}
totalPrice={totalPrice}
vat={bookedRoom.vatPercentage}
defaultCurrency={bookedRoom.currencyCode}
/>
</div>
)

View File

@@ -31,6 +31,7 @@ import type { BreakfastPackage } from "@/types/components/hotelReservation/break
import type { BedTypeSchema } from "@/types/components/hotelReservation/enterDetails/bedType"
import type { Price } from "@/types/components/hotelReservation/price"
import type { Child } from "@/types/components/hotelReservation/selectRate/selectRate"
import type { CurrencyEnum } from "@/types/enums/currency"
import type { Package, Packages } from "@/types/requests/packages"
type RoomPrice =
@@ -59,6 +60,7 @@ export interface PriceDetailsTableProps {
toDate: string
totalPrice: Price
vat: number
defaultCurrency: CurrencyEnum
}
export default function PriceDetailsTable({
@@ -69,6 +71,7 @@ export default function PriceDetailsTable({
toDate,
totalPrice,
vat,
defaultCurrency,
}: PriceDetailsTableProps) {
const intl = useIntl()
const lang = useLang()
@@ -122,11 +125,7 @@ export default function PriceDetailsTable({
}
if (!currency) {
if (room.packages?.length) {
currency = room.packages[0].localPrice.currency
} else if (room.breakfast) {
currency = room.breakfast.localPrice.currency
}
currency = defaultCurrency
}
if (!price && !voucherPrice && !chequePrice && !redemptionPrice) {

View File

@@ -36,7 +36,10 @@ export default function Summary({
vat,
toggleSummaryOpen,
}: SelectRateSummaryProps) {
const rateSummary = useRatesStore((state) => state.rateSummary)
const { rateSummary, defaultCurrency } = useRatesStore((state) => ({
rateSummary: state.rateSummary,
defaultCurrency: state.defaultCurrency,
}))
const intl = useIntl()
const lang = useLang()
@@ -153,6 +156,7 @@ export default function Summary({
}
const roomPackages = room.packages
const zeroPrice = formatPrice(intl, 0, defaultCurrency)
return (
<Fragment key={idx}>
@@ -247,13 +251,7 @@ export default function Summary({
})}
</Caption>
</div>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
0,
room.roomPrice.perStay.local.currency
)}
</Body>
<Body color="uiTextHighContrast">{zeroPrice}</Body>
</div>
) : null}
{childBedExtraBed ? (
@@ -270,13 +268,7 @@ export default function Summary({
)}
</Body>
</div>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
0,
room.roomPrice.perStay.local.currency
)}
</Body>
<Body color="uiTextHighContrast">{zeroPrice}</Body>
</div>
) : null}
{roomPackages?.map((pkg) => (
@@ -317,6 +309,7 @@ export default function Summary({
toDate={booking.toDate}
totalPrice={totalPrice}
vat={vat}
defaultCurrency={defaultCurrency}
/>
</div>
<div>

View File

@@ -378,6 +378,7 @@ export function createDetailsStore(
searchParamString: searchParams,
totalPrice: initialTotalPrice,
vat: initialState.vat,
defaultCurrency: breakfastPackages[0].localPrice.currency,
preSubmitCallbacks: {},
actions: {

View File

@@ -1,8 +1,10 @@
import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectRate/roomFilter"
import { CurrencyEnum } from "@/types/enums/currency"
import type { AvailabilityError } from "@/types/stores/rates"
import type {
Product,
RoomConfiguration,
RoomsAvailability,
} from "@/types/trpc/routers/hotel/roomAvailability"
export function findProduct(
@@ -117,3 +119,28 @@ export function clearRoomSelectionFromUrl(
searchParams.delete(`room[${roomIdx}].roomtype`)
return searchParams
}
export function findDefaultCurrency(
roomsAvailability: (RoomsAvailability | AvailabilityError)[] | undefined
) {
if (!roomsAvailability || !roomsAvailability.length) {
return CurrencyEnum.Unknown
}
const availability = roomsAvailability.filter(
(room): room is RoomsAvailability => {
if ("error" in room) {
return false
}
return true
}
)[0]
const pkg = availability?.packages.find((pkg) => pkg.localPrice.currency)
if (!pkg) {
return CurrencyEnum.Unknown
}
const defaultCurrency = pkg.localPrice.currency
return defaultCurrency
}

View File

@@ -8,6 +8,7 @@ import { RatesContext } from "@/contexts/Rates"
import {
clearRoomSelectionFromUrl,
findDefaultCurrency,
findProductInRoom,
findSelectedRate,
} from "./helpers"
@@ -118,6 +119,8 @@ export function createRatesStore({
const isRedemptionBooking = booking.searchType === REDEMPTION
const defaultCurrency = findDefaultCurrency(roomsAvailability)
return create<RatesState>()((set) => {
return {
activeRoom,
@@ -133,6 +136,7 @@ export function createRatesStore({
roomsAvailability,
searchParams,
vat,
defaultCurrency,
rooms: booking.rooms.map((room, idx) => {
const roomConfiguration = roomConfigurations[idx]
const roomPackages = roomsPackages[idx]

View File

@@ -1,3 +1,4 @@
import type { CurrencyEnum } from "@/types/enums/currency"
import type { Packages } from "@/types/requests/packages"
import type { RoomState } from "@/types/stores/enter-details"
import type { RoomPrice, RoomRate } from "./enterDetails/details"
@@ -25,6 +26,7 @@ export interface EnterDetailsSummaryProps {
vat: number
rooms: RoomState[]
toggleSummaryOpen: () => void
defaultCurrency: CurrencyEnum
}
export interface SelectRateSummaryProps {

View File

@@ -13,6 +13,7 @@ import type {
RoomRate,
SignedInDetailsSchema,
} from "@/types/components/hotelReservation/enterDetails/details"
import type { CurrencyEnum } from "@/types/enums/currency"
import type { StepEnum } from "@/types/enums/step"
import type { Price } from "../components/hotelReservation/price"
import type {
@@ -102,6 +103,7 @@ export interface DetailsState {
searchParamString: string
totalPrice: Price
vat: number
defaultCurrency: CurrencyEnum
preSubmitCallbacks: Record<string, () => void>
}

View File

@@ -4,6 +4,7 @@ import type {
Room as RoomBooking,
SelectRateSearchParams,
} from "@/types/components/hotelReservation/selectRate/selectRate"
import type { CurrencyEnum } from "@/types/enums/currency"
import type { Room } from "@/types/hotel"
import type { Package, PackageEnum } from "@/types/requests/packages"
import type {
@@ -66,6 +67,7 @@ export interface RatesState {
roomsAvailability: (RoomsAvailability | AvailabilityError)[] | undefined
searchParams: URLSearchParams
vat: number
defaultCurrency: CurrencyEnum
}
export interface InitialState