Merged in feat/SW-964-Sticky-summary-multiroom (pull request #1231)

Feat/SW-964 Sticky summary multiroom (UX)

* feat(SW-964) Multiroom support for summary in select-rate

* feat(SW-964) added utils for calculateTotalPrice

* feat(SW-964) Removed duplicated code


Approved-by: Tobias Johansson
This commit is contained in:
Pontus Dreij
2025-01-31 11:09:46 +00:00
parent f82de5aad7
commit b6d8431e82
5 changed files with 143 additions and 75 deletions

View File

@@ -14,7 +14,6 @@ import { convertObjToSearchParams, convertSearchParamsToObj } from "@/utils/url"
import RateSummary from "../RateSummary"
import { RoomSelectionPanel } from "../RoomSelectionPanel"
import SelectedRoomPanel from "../SelectedRoomPanel"
import { filterDuplicateRoomTypesByLowestPrice } from "./utils"
import { roomSelectionPanelVariants } from "./variants"
import styles from "./rooms.module.css"
@@ -25,7 +24,6 @@ import {
} from "@/types/components/hotelReservation/selectRate/roomFilter"
import type { SelectRateProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
import type { SelectRateSearchParams } from "@/types/components/hotelReservation/selectRate/selectRate"
import type { RoomConfiguration } from "@/types/trpc/routers/hotel/roomAvailability"
export default function Rooms({
availablePackages,
@@ -37,6 +35,7 @@ export default function Rooms({
const router = useRouter()
const pathname = usePathname()
const searchParams = useSearchParams()
const intl = useIntl()
const hotelId = searchParams.get("hotel")
const arrivalDate = searchParams.get("fromDate")
@@ -47,6 +46,7 @@ export default function Rooms({
const {
selectedPackagesByRoom,
visibleRooms,
setVisibleRooms,
setRoomsAvailability,
getFilteredRooms,
@@ -62,33 +62,10 @@ export default function Rooms({
const isMultipleRooms = bookingWidgetSearchData.rooms.length > 1
const intl = useIntl()
useEffect(() => {
initializeRates(bookingWidgetSearchData.rooms.length)
}, [initializeRates, bookingWidgetSearchData.rooms.length])
const visibleRooms: RoomConfiguration[] = useMemo(() => {
const deduped = filterDuplicateRoomTypesByLowestPrice(
roomsAvailability.roomConfigurations
)
const separated = deduped.reduce<{
available: RoomConfiguration[]
notAvailable: RoomConfiguration[]
}>(
(acc, curr) => {
if (curr.status === "NotAvailable") {
return { ...acc, notAvailable: [...acc.notAvailable, curr] }
}
return { ...acc, available: [...acc.available, curr] }
},
{ available: [], notAvailable: [] }
)
return [...separated.available, ...separated.notAvailable]
}, [roomsAvailability.roomConfigurations])
const defaultPackages: DefaultFilterOptions[] = useMemo(
() => [
{
@@ -197,7 +174,9 @@ export default function Rooms({
const SCROLL_OFFSET = 100
const roomElements = document.querySelectorAll(`.${styles.roomContainer}`)
const index = selectedRates.findIndex((rate) => rate === undefined)
const selectedRoom = roomElements[index - 1]
const targetIndex = index === -1 ? selectedRates.length - 1 : index - 1
const selectedRoom = roomElements[targetIndex]
if (selectedRoom) {
const elementPosition = selectedRoom.getBoundingClientRect().top
@@ -286,6 +265,7 @@ export default function Rooms({
isUserLoggedIn={isUserLoggedIn}
packages={availablePackages}
roomsAvailability={roomsAvailability}
rooms={bookingWidgetSearchData.rooms}
/>
</form>
)}