diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/BookingCodeFilter/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/BookingCodeFilter/index.tsx index 245e5d6eb..fe48cf38d 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/BookingCodeFilter/index.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/BookingCodeFilter/index.tsx @@ -29,11 +29,11 @@ export default function BookingCodeFilter() { value: BookingCodeFilterEnum.Discounted, }, { - label: intl.formatMessage({ id: "Full price rooms" }), + label: intl.formatMessage({ id: "Full-priced rooms" }), value: BookingCodeFilterEnum.Regular, }, { - label: intl.formatMessage({ id: "See all" }), + label: intl.formatMessage({ id: "All rooms" }), value: BookingCodeFilterEnum.All, }, ] diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx index 06fddbd07..cc4e83bc9 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Campaign.tsx @@ -44,6 +44,14 @@ export default function Campaign({ const night = intl.formatMessage({ id: "night" }).toUpperCase() + if (selectedFilter === BookingCodeFilterEnum.Discounted) { + campaign = campaign.filter((product) => product.bookingCode) + } + + if (selectedFilter === BookingCodeFilterEnum.Regular) { + campaign = campaign.filter((product) => !product.bookingCode) + } + return campaign.map((product) => { if (!product.public) { return ( diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx index 1ce4e73fa..28c8184c9 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Code.tsx @@ -17,6 +17,7 @@ import { import { calculatePricePerNightPriceProduct } from "./totalPricePerNight" import type { SharedRateCardProps } from "@/types/components/hotelReservation/selectRate/rates" +import { BookingCodeFilterEnum } from "@/types/enums/bookingCodeFilter" import type { CodeProduct } from "@/types/trpc/routers/hotel/roomAvailability" interface CodeProps extends SharedRateCardProps { @@ -31,11 +32,15 @@ export default function Code({ roomTypeCode, }: CodeProps) { const intl = useIntl() - const { roomNr, selectedRate } = useRoomContext() + const { roomNr, selectedFilter, selectedRate } = useRoomContext() const bookingCode = useRatesStore((state) => state.booking.bookingCode) const rateTitles = useRateTitles() const night = intl.formatMessage({ id: "night" }).toUpperCase() + if (selectedFilter === BookingCodeFilterEnum.Regular) { + return null + } + return code.map((product) => { let bannerText = "" if (product.rateDefinition.breakfastIncluded) { diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx index 88f7944c9..7610df3e8 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/Redemptions.tsx @@ -25,6 +25,7 @@ export default function Redemptions({ if ( selectedFilter === BookingCodeFilterEnum.Discounted || + selectedFilter === BookingCodeFilterEnum.Regular || !redemptions.length ) { return null diff --git a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/index.tsx b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/index.tsx index 2f99c54d9..938046a6d 100644 --- a/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/index.tsx +++ b/apps/scandic-web/components/HotelReservation/SelectRate/RoomsContainer/Rooms/RoomsList/RoomListItem/Rates/index.tsx @@ -58,11 +58,16 @@ export default function Rates({ roomTypeCode, } const showAllRates = selectedFilter === BookingCodeFilterEnum.All + const showRegularRates = selectedFilter === BookingCodeFilterEnum.Regular const hasBookingCodeRates = !!(campaign.length || code.length) const hasRegularRates = !!regular.length + const notDiscountedPrice = showAllRates || showRegularRates + const notDiscountedAndHasRates = + notDiscountedPrice && hasBookingCodeRates && hasRegularRates + const isFetchingAndOnlyShowingRegularRates = + isFetchingAdditionalRate && !showRegularRates const showDivider = - (showAllRates && hasBookingCodeRates && hasRegularRates) || - isFetchingAdditionalRate + notDiscountedAndHasRates || isFetchingAndOnlyShowingRegularRates return ( <> diff --git a/apps/scandic-web/i18n/dictionaries/en.json b/apps/scandic-web/i18n/dictionaries/en.json index fa149e9ff..9fad48400 100644 --- a/apps/scandic-web/i18n/dictionaries/en.json +++ b/apps/scandic-web/i18n/dictionaries/en.json @@ -48,6 +48,7 @@ "All hotels and offices": "All hotels and offices", "All locations": "All locations", "All our breakfast buffets offer gluten free, vegan, and allergy-friendly options.": "All our breakfast buffets offer gluten free, vegan, and allergy-friendly options.", + "All rooms": "All rooms", "All-day breakfast": "All-day breakfast", "Allergy-friendly room": "Allergy-friendly room", "Already a friend?": "Already a friend?", @@ -323,6 +324,7 @@ "From": "From", "Full circle": "Full circle", "Full price rooms": "Full price rooms", + "Full-priced rooms": "Full-priced rooms", "Garage": "Garage", "Get directions": "Get directions", "Get hotel directions": "Get hotel directions", diff --git a/apps/scandic-web/providers/SelectRate/RoomProvider.tsx b/apps/scandic-web/providers/SelectRate/RoomProvider.tsx index 7660df079..204f750da 100644 --- a/apps/scandic-web/providers/SelectRate/RoomProvider.tsx +++ b/apps/scandic-web/providers/SelectRate/RoomProvider.tsx @@ -1,6 +1,7 @@ "use client" import { useEffect } from "react" +import { REDEMPTION } from "@/constants/booking" import { trpc } from "@/lib/trpc/client" import { useRatesStore } from "@/stores/select-rate" @@ -17,17 +18,27 @@ export default function RoomProvider({ room, }: RoomProviderProps) { const lang = useLang() - const { activeRoom, booking, roomAvailability, selectedFilter } = - useRatesStore((state) => ({ - activeRoom: state.activeRoom, - booking: state.booking, - roomAvailability: state.roomsAvailability?.[idx], - selectedFilter: state.rooms[idx].selectedFilter, - })) + const { + activeRoom, + booking, + roomAvailability, + searchParams, + selectedFilter, + } = useRatesStore((state) => ({ + activeRoom: state.activeRoom, + booking: state.booking, + roomAvailability: state.roomsAvailability?.[idx], + searchParams: state.searchParams, + selectedFilter: state.rooms[idx].selectedFilter, + })) const { appendRegularRates, ...actions } = room.actions const roomNr = idx + 1 - const hasRedemptionRates = room.rooms.some((room) => room.redemptions.length) + const redemptionSearch = searchParams.has("searchType") + ? searchParams.get("searchType") === REDEMPTION + : false + const hasRedemptionRates = + redemptionSearch || room.rooms.some((room) => room.redemptions.length) const hasCorporateChequeOrVoucherRates = room.rooms.some((room) => room.code.some((product) => { if ("corporateCheque" in product) { @@ -48,7 +59,7 @@ export default function RoomProvider({ // duplicate data const enabled = !!( booking.bookingCode && - selectedFilter === BookingCodeFilterEnum.All && + selectedFilter !== BookingCodeFilterEnum.Discounted && !dontShowRegularRates ) // Extra query needed to fetch regular rates upon user diff --git a/apps/scandic-web/stores/select-rate/index.ts b/apps/scandic-web/stores/select-rate/index.ts index 4b0587d73..7906fc12d 100644 --- a/apps/scandic-web/stores/select-rate/index.ts +++ b/apps/scandic-web/stores/select-rate/index.ts @@ -15,7 +15,10 @@ import { RoomPackageCodeEnum } from "@/types/components/hotelReservation/selectR import { BookingCodeFilterEnum } from "@/types/enums/bookingCodeFilter" import { RateTypeEnum } from "@/types/enums/rateType" import type { InitialState, RatesState } from "@/types/stores/rates" -import type { RoomConfiguration } from "@/types/trpc/routers/hotel/roomAvailability" +import type { + PriceProduct, + RoomConfiguration, +} from "@/types/trpc/routers/hotel/roomAvailability" export function createRatesStore({ booking, @@ -169,12 +172,23 @@ export function createRatesStore({ ) if (incomingRoom) { + let campaign = currentRoom.campaign + if (incomingRoom.campaign.length) { + const newCampaign = [ + ...campaign, + ...incomingRoom.campaign, + ].reduce((cpns, cpn) => { + if (cpns.has(cpn.rateDefinition.rateCode)) { + return cpns + } + cpns.set(cpn.rateDefinition.rateCode, cpn) + return cpns + }, new Map()) + campaign = Array.from(newCampaign.values()) + } return { ...currentRoom, - campaign: [ - ...currentRoom.campaign, - ...incomingRoom.campaign, - ], + campaign, products: [ ...currentRoom.products, ...incomingRoom.products,