Merged in feat/SW-2113-allow-feature-combinations (pull request #1719)

Feat/SW-2113 allow feature combinations

* feat(SW-2113): Refactor features data to be fetched on filter room filter change

* feat(SW-2113): added loading state

* fix: now clear room selection when applying filter and room doesnt exists. And added room features to mobile summary

* fix

* fix: add package to price details

* feat(SW-2113): added buttons to room filter

* fix: active room

* fix: remove console log

* fix: added form and close handler to room package filter

* fix: add restriction so you cannot select pet room with allergy room and vice versa

* fix: fixes from review feedback

* fix

* fix: hide modify button if on nextcoming rooms if no selection is made, and adjust filter logic in togglePackage

* fix: forgot to use roomFeatureCodes from input..

* fix: naming


Approved-by: Simon.Emanuelsson
This commit is contained in:
Tobias Johansson
2025-04-07 11:36:34 +00:00
parent 8d34e1c8bb
commit e6ae6ff650
31 changed files with 725 additions and 359 deletions

View File

@@ -100,6 +100,10 @@ export default function PriceDetailsTable({
const isMainRoom = idx === 0
const getMemberRate = isMainRoom && isMember
if (!room) {
return null
}
let price
if (
getMemberRate &&
@@ -130,6 +134,17 @@ export default function PriceDetailsTable({
price.localPrice.currency
)}
/>
{room.packages?.map((pkg) => (
<Row
key={pkg.code}
label={pkg.description}
value={formatPrice(
intl,
+pkg.localPrice.totalPrice,
pkg.localPrice.currency
)}
/>
))}
<Row
bold
label={intl.formatMessage({ id: "Room charge" })}

View File

@@ -56,10 +56,11 @@ export default function Summary({
return null
}
const memberPrice = getMemberPrice(rooms[0].roomRate)
const memberPrice =
rooms.length === 1 && rooms[0] ? getMemberPrice(rooms[0].roomRate) : null
const containsBookingCodeRate = rooms.find((r) =>
isBookingCodeRate(r.roomRate)
const containsBookingCodeRate = rooms.find(
(r) => r && isBookingCodeRate(r.roomRate)
)
const showDiscounted = containsBookingCodeRate || isMember
@@ -93,6 +94,10 @@ export default function Summary({
</header>
<Divider color="primaryLightSubtle" />
{rooms.map((room, idx) => {
if (!room) {
return null
}
const roomNumber = idx + 1
const adults = room.adults
const childrenInRoom = room.childrenInRoom
@@ -137,6 +142,8 @@ export default function Summary({
guestsParts.push(childrenMsg)
}
const roomPackages = room.packages
return (
<Fragment key={idx}>
<div
@@ -245,6 +252,21 @@ export default function Summary({
</Body>
</div>
) : null}
{roomPackages?.map((pkg) => (
<div className={styles.entry} key={pkg.code}>
<div>
<Body color="uiTextHighContrast">{pkg.description}</Body>
</div>
<Body color="uiTextHighContrast">
{formatPrice(
intl,
pkg.localPrice.price,
pkg.localPrice.currency
)}
</Body>
</div>
))}
</div>
<Divider color="primaryLightSubtle" />
</Fragment>

View File

@@ -27,14 +27,21 @@ export default function MobileSummary({
const scrollY = useRef(0)
const [isSummaryOpen, setIsSummaryOpen] = useState(false)
const { booking, bookingRooms, roomsAvailability, rateSummary, vat } =
useRatesStore((state) => ({
booking: state.booking,
bookingRooms: state.booking.rooms,
roomsAvailability: state.roomsAvailability,
rateSummary: state.rateSummary,
vat: state.vat,
}))
const {
booking,
bookingRooms,
roomsAvailability,
rateSummary,
vat,
packages,
} = useRatesStore((state) => ({
booking: state.booking,
bookingRooms: state.booking.rooms,
roomsAvailability: state.roomsAvailability,
rateSummary: state.rateSummary,
vat: state.vat,
packages: state.packages,
}))
function toggleSummaryOpen() {
setIsSummaryOpen(!isSummaryOpen)
@@ -71,11 +78,11 @@ export default function MobileSummary({
}
const rooms = rateSummary.map((room, index) =>
mapRate(room, index, bookingRooms)
room ? mapRate(room, index, bookingRooms, packages) : null
)
const containsBookingCodeRate = rateSummary.find((r) =>
isBookingCodeRate(r.product)
const containsBookingCodeRate = rateSummary.find(
(r) => r && isBookingCodeRate(r.product)
)
const showDiscounted = containsBookingCodeRate || isUserLoggedIn

View File

@@ -3,8 +3,18 @@ import type {
Room,
} from "@/types/components/hotelReservation/selectRate/selectRate"
import { CurrencyEnum } from "@/types/enums/currency"
import type { Packages } from "@/types/requests/packages"
export function mapRate(
room: Rate,
index: number,
bookingRooms: Room[],
packages: NonNullable<Packages>
) {
const roomPackages = room.packages
.map((code) => packages.find((pkg) => pkg.code === code))
.filter((pkg): pkg is NonNullable<typeof pkg> => Boolean(pkg))
export function mapRate(room: Rate, index: number, bookingRooms: Room[]) {
const rate = {
adults: bookingRooms[index].adults,
cancellationText: room.product.rateDefinition?.cancellationText ?? "",
@@ -29,6 +39,7 @@ export function mapRate(room: Rate, index: number, bookingRooms: Room[]) {
},
roomRate: room.product,
roomType: room.roomType,
packages: roomPackages,
}
if ("corporateCheque" in room.product) {