feat(SW-2043): Added new room packages filter

* feat(SW-2043): Added new room packages filter

* fix(SW-2043): Fixed issue with not updating price when selecting pet room

Approved-by: Tobias Johansson
Approved-by: Matilda Landström
This commit is contained in:
Erik Tiekstra
2025-04-01 09:54:09 +00:00
parent 35c1724afb
commit df32c08350
29 changed files with 489 additions and 222 deletions

View File

@@ -29,7 +29,7 @@ export function createRatesStore({
searchParams,
vat,
}: InitialState) {
const filterOptions = [
const packageOptions = [
{
code: RoomPackageCodeEnum.ACCESSIBILITY_ROOM,
description: labels.accessibilityRoom,
@@ -84,10 +84,10 @@ export function createRatesStore({
rateSummary[idx] = {
features: selectedRoom.features,
product,
packages: room.packages ?? [],
rate: product.rate,
roomType: selectedRoom.roomType,
roomTypeCode: selectedRoom.roomTypeCode,
package: room.packages?.[0],
}
}
}
@@ -106,7 +106,7 @@ export function createRatesStore({
return {
activeRoom,
booking,
filterOptions,
packageOptions,
hotelType,
isUserLoggedIn,
packages,
@@ -132,14 +132,16 @@ export function createRatesStore({
// Since features are fetched async based on query string, we need to read from query string to apply correct filtering
const packagesParam = searchParams.get(`room[${idx}].packages`)
const selectedPackage = isRoomPackageCode(packagesParam)
? packagesParam
: undefined
const selectedPackages = packagesParam
? packagesParam.split(",").filter(isRoomPackageCode)
: []
let rooms: RoomConfiguration[] = roomConfiguration
if (selectedPackage) {
if (selectedPackages.length) {
rooms = roomConfiguration.filter((r) =>
r.features.find((f) => f.code === selectedPackage)
selectedPackages.some((pkg) =>
r.features.find((f) => f.code === pkg)
)
)
}
@@ -203,35 +205,48 @@ export function createRatesStore({
})
)
},
selectPackage(code) {
togglePackage(code) {
return set(
produce((state: RatesState) => {
state.rooms[idx].selectedPackage = code
const isSelected =
state.rooms[idx].selectedPackages.includes(code)
const selectedPackages = isSelected
? state.rooms[idx].selectedPackages.filter(
(pkg) => pkg !== code
)
: [...state.rooms[idx].selectedPackages, code]
state.rooms[idx].selectedPackages = selectedPackages
const roomConfiguration = state.roomConfigurations[idx]
if (roomConfiguration) {
const searchParams = new URLSearchParams(state.searchParams)
if (code) {
if (selectedPackages.length) {
state.rooms[idx].rooms = roomConfiguration.filter(
(room) =>
room.features.find((feat) => feat.code === code)
selectedPackages.every((pkg) =>
room.features.find((feat) => feat.code === pkg)
)
)
searchParams.set(
`room[${idx}].packages`,
selectedPackages.join(",")
)
searchParams.set(`room[${idx}].packages`, code)
if (state.rateSummary[idx]) {
state.rateSummary[idx].package = code
state.rateSummary[idx].packages = selectedPackages
}
} else {
state.rooms[idx].rooms = roomConfiguration
searchParams.delete(`room[${idx}].packages`)
if (state.rateSummary[idx]) {
state.rateSummary[idx].package = undefined
state.rateSummary[idx].packages = []
}
searchParams.delete(`room[${idx}].packages`)
}
state.searchParams = new ReadonlyURLSearchParams(
searchParams
)
window.history.pushState(
{},
"",
@@ -251,7 +266,7 @@ export function createRatesStore({
state.rooms[idx].selectedRate = selectedRate
state.rateSummary[idx] = {
features: selectedRate.features,
package: state.rooms[idx].selectedPackage,
packages: state.rooms[idx].selectedPackages,
product: selectedRate.product,
rate: selectedRate.product.rate,
roomType: selectedRate.roomType,
@@ -346,11 +361,12 @@ export function createRatesStore({
selectedFilter: booking.bookingCode
? BookingCodeFilterEnum.Discounted
: BookingCodeFilterEnum.All,
selectedPackage,
selectedPackages,
selectedRate:
selectedRate && product
? {
features: selectedRate.features,
packages: selectedPackages,
product,
roomType: selectedRate.roomType,
roomTypeCode: selectedRate.roomTypeCode,