fix(sw-453): Correct view of cards and icons when filter

This commit is contained in:
Pontus Dreij
2024-11-01 10:58:11 +01:00
parent 644ce369aa
commit f79eb7d5a9
5 changed files with 38 additions and 20 deletions

View File

@@ -23,6 +23,7 @@ export default function RoomCard({
rateDefinitions, rateDefinitions,
roomConfiguration, roomConfiguration,
roomCategories, roomCategories,
selectedPackages,
handleSelectRate, handleSelectRate,
}: RoomCardProps) { }: RoomCardProps) {
const intl = useIntl() const intl = useIntl()
@@ -133,15 +134,17 @@ export default function RoomCard({
>{`${roomConfiguration.roomsLeft} ${intl.formatMessage({ id: "Left" })}`}</Footnote> >{`${roomConfiguration.roomsLeft} ${intl.formatMessage({ id: "Left" })}`}</Footnote>
</span> </span>
)} )}
{roomConfiguration.features.map((feature) => ( {roomConfiguration.features
<span className={styles.chip} key={feature.code}> .filter((feature) => selectedPackages.includes(feature.code))
{createElement(getIconForFeatureCode(feature.code), { .map((feature) => (
width: 16, <span className={styles.chip} key={feature.code}>
height: 16, {createElement(getIconForFeatureCode(feature.code), {
color: "burgundy", width: 16,
})} height: 16,
</span> color: "burgundy",
))} })}
</span>
))}
</div> </div>
{/*NOTE: images from the test API are hosted on test3.scandichotels.com, {/*NOTE: images from the test API are hosted on test3.scandichotels.com,
which can't be accessed unless on Scandic's Wifi or using Citrix. */} which can't be accessed unless on Scandic's Wifi or using Citrix. */}

View File

@@ -16,6 +16,7 @@ export default function RoomSelection({
roomCategories, roomCategories,
user, user,
packages, packages,
selectedPackages,
}: RoomSelectionProps) { }: RoomSelectionProps) {
const [rateSummary, setRateSummary] = useState<Rate | null>(null) const [rateSummary, setRateSummary] = useState<Rate | null>(null)
@@ -67,6 +68,7 @@ export default function RoomSelection({
roomConfiguration={roomConfiguration} roomConfiguration={roomConfiguration}
roomCategories={roomCategories} roomCategories={roomCategories}
handleSelectRate={setRateSummary} handleSelectRate={setRateSummary}
selectedPackages={selectedPackages}
/> />
</li> </li>
))} ))}

View File

@@ -9,6 +9,10 @@ import RoomSelection from "../RoomSelection"
import styles from "./rooms.module.css" import styles from "./rooms.module.css"
import {
RoomPackageCodeEnum,
type RoomPackageCodes,
} from "@/types/components/hotelReservation/selectRate/roomFilter"
import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection" import type { RoomSelectionProps } from "@/types/components/hotelReservation/selectRate/roomSelection"
export default function Rooms({ export default function Rooms({
@@ -16,20 +20,25 @@ export default function Rooms({
roomCategories = [], roomCategories = [],
user, user,
packages, packages,
}: RoomSelectionProps) { }: Omit<RoomSelectionProps, "selectedPackages">) {
const defaultRooms = roomsAvailability.roomConfigurations.filter( const defaultRooms = roomsAvailability.roomConfigurations
(room) => room.features.length === 0
)
const [rooms, setRooms] = useState<RoomsAvailability>({ const [rooms, setRooms] = useState<RoomsAvailability>({
...roomsAvailability, ...roomsAvailability,
roomConfigurations: defaultRooms, roomConfigurations: defaultRooms,
}) })
const [selectedPackages, setSelectedPackages] = useState<RoomPackageCodes[]>(
[]
)
const handleFilter = useCallback( const handleFilter = useCallback(
(filter: Record<string, boolean | undefined>) => { (filter: Record<RoomPackageCodeEnum, boolean | undefined>) => {
const selectedCodes = Object.keys(filter).filter((key) => filter[key]) const filteredPackages = Object.keys(filter).filter(
(key) => filter[key as RoomPackageCodeEnum]
) as RoomPackageCodeEnum[]
if (selectedCodes.length === 0) { setSelectedPackages(filteredPackages)
if (filteredPackages.length === 0) {
setRooms({ setRooms({
...roomsAvailability, ...roomsAvailability,
roomConfigurations: defaultRooms, roomConfigurations: defaultRooms,
@@ -39,8 +48,8 @@ export default function Rooms({
const filteredRooms = roomsAvailability.roomConfigurations.filter( const filteredRooms = roomsAvailability.roomConfigurations.filter(
(room) => (room) =>
selectedCodes.every((selectedCode) => filteredPackages.every((filteredPackage) =>
room.features.some((feature) => feature.code === selectedCode) room.features.some((feature) => feature.code === filteredPackage)
) )
) )
setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms }) setRooms({ ...roomsAvailability, roomConfigurations: filteredRooms })
@@ -60,6 +69,7 @@ export default function Rooms({
roomCategories={roomCategories} roomCategories={roomCategories}
user={user} user={user}
packages={packages} packages={packages}
selectedPackages={selectedPackages}
/> />
</div> </div>
) )

View File

@@ -5,11 +5,13 @@ import {
import { Rate } from "./selectRate" import { Rate } from "./selectRate"
import { RoomData } from "@/types/hotel" import type { RoomData } from "@/types/hotel"
import type { RoomPackageCodes } from "./roomFilter"
export type RoomCardProps = { export type RoomCardProps = {
roomConfiguration: RoomConfiguration roomConfiguration: RoomConfiguration
rateDefinitions: RateDefinition[] rateDefinitions: RateDefinition[]
roomCategories: RoomData[] roomCategories: RoomData[]
selectedPackages: RoomPackageCodes[]
handleSelectRate: (rate: Rate) => void handleSelectRate: (rate: Rate) => void
} }

View File

@@ -1,11 +1,12 @@
import type { RoomData } from "@/types/hotel" import type { RoomData } from "@/types/hotel"
import type { SafeUser } from "@/types/user" import type { SafeUser } from "@/types/user"
import type { RoomsAvailability } from "@/server/routers/hotels/output" import type { RoomsAvailability } from "@/server/routers/hotels/output"
import type { RoomPackageData } from "./roomFilter" import type { RoomPackageCodes, RoomPackageData } from "./roomFilter"
export interface RoomSelectionProps { export interface RoomSelectionProps {
roomsAvailability: RoomsAvailability roomsAvailability: RoomsAvailability
roomCategories: RoomData[] roomCategories: RoomData[]
user: SafeUser user: SafeUser
packages: RoomPackageData packages: RoomPackageData
selectedPackages: RoomPackageCodes[]
} }