Fix(SW-1467): Remove translation of hotel page sidepeek slugs * fix(SW-1467): remove translation of sidepeek slugs * fix: update enums Approved-by: Erik Tiekstra Approved-by: Fredrik Thorsson
230 lines
6.3 KiB
TypeScript
230 lines
6.3 KiB
TypeScript
import {
|
|
type Facilities,
|
|
type FacilityCard,
|
|
FacilityCardButtonText,
|
|
type FacilityCardType,
|
|
FacilityCardTypeEnum,
|
|
type FacilityGrid,
|
|
type FacilityImage,
|
|
HealthFacilitiesEnum,
|
|
RestaurantHeadings,
|
|
WellnessHeadings,
|
|
} from "@/types/components/hotelPage/facilities"
|
|
import { SidepeekSlugs } from "@/types/components/hotelPage/hotelPage"
|
|
import { HotelHashValues } from "@/types/components/hotelPage/tabNavigation"
|
|
import { FacilityEnum } from "@/types/enums/facilities"
|
|
import type {
|
|
Amenities,
|
|
Facility,
|
|
FacilityData,
|
|
HealthFacilities,
|
|
} from "@/types/hotel"
|
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
|
|
|
export function setFacilityCards(
|
|
restaurantImages: FacilityData | undefined,
|
|
conferencesAndMeetings: FacilityData | undefined,
|
|
healthAndWellness: FacilityData | undefined,
|
|
hasRestaurants: boolean,
|
|
hasMeetingRooms: boolean,
|
|
hasWellness: boolean
|
|
): Facility[] {
|
|
const facilities = []
|
|
if (hasRestaurants) {
|
|
facilities.push(
|
|
setFacilityCard(restaurantImages, FacilityCardTypeEnum.restaurant)
|
|
)
|
|
}
|
|
if (hasMeetingRooms) {
|
|
facilities.push(
|
|
setFacilityCard(conferencesAndMeetings, FacilityCardTypeEnum.conference)
|
|
)
|
|
}
|
|
if (hasWellness) {
|
|
facilities.push(
|
|
setFacilityCard(healthAndWellness, FacilityCardTypeEnum.wellness)
|
|
)
|
|
}
|
|
return facilities
|
|
}
|
|
|
|
function setFacilityCard(
|
|
facility: FacilityData | undefined,
|
|
type: FacilityCardTypeEnum
|
|
): Facility {
|
|
return {
|
|
...facility,
|
|
id: type,
|
|
headingText: facility?.headingText ?? "",
|
|
heroImages: facility?.heroImages ?? [],
|
|
}
|
|
}
|
|
|
|
export function isFacilityCard(card: FacilityCardType): card is FacilityCard {
|
|
return "heading" in card
|
|
}
|
|
|
|
export function isFacilityImage(card: FacilityCardType): card is FacilityImage {
|
|
return "backgroundImage" in card
|
|
}
|
|
|
|
function setCardProps(
|
|
theme: CardProps["theme"],
|
|
buttonText: (typeof FacilityCardButtonText)[keyof typeof FacilityCardButtonText],
|
|
href: HotelHashValues,
|
|
heading: string,
|
|
slug: SidepeekSlugs,
|
|
scriptedTopTitle?: string
|
|
): FacilityCard {
|
|
return {
|
|
theme,
|
|
id: href,
|
|
heading,
|
|
scriptedTopTitle,
|
|
secondaryButton: {
|
|
href: `#s-${slug}`,
|
|
title: buttonText,
|
|
isExternal: false,
|
|
scrollOnClick: false,
|
|
},
|
|
}
|
|
}
|
|
|
|
export function setFacilityCardGrids(
|
|
facilities: Facility[],
|
|
amenities: Amenities,
|
|
healthFacilities: HealthFacilities
|
|
): Facilities {
|
|
const cards: Facilities = facilities
|
|
.filter((fac) => !!fac.headingText)
|
|
.map((facility) => {
|
|
let card: FacilityCard
|
|
|
|
const grid: FacilityGrid = facility.heroImages
|
|
.slice(0, 2)
|
|
.map((image) => {
|
|
// Can be a maximum 2 images per grid
|
|
const img: FacilityImage = {
|
|
backgroundImage: {
|
|
url: image.imageSizes.large,
|
|
title: image.metaData.title,
|
|
meta: {
|
|
alt: image.metaData.altText,
|
|
caption: image.metaData.altText_En,
|
|
},
|
|
id: image.imageSizes.large,
|
|
},
|
|
theme: "image",
|
|
id: image.imageSizes.large,
|
|
}
|
|
return img
|
|
})
|
|
|
|
switch (facility.id) {
|
|
case FacilityCardTypeEnum.wellness:
|
|
const wellnessTitle = getWellnessHeading(healthFacilities)
|
|
card = setCardProps(
|
|
"one",
|
|
FacilityCardButtonText.WELLNESS,
|
|
HotelHashValues.wellness,
|
|
facility.headingText,
|
|
SidepeekSlugs.wellness,
|
|
wellnessTitle
|
|
)
|
|
grid.unshift(card)
|
|
break
|
|
|
|
case FacilityCardTypeEnum.conference:
|
|
card = setCardProps(
|
|
"primaryDim",
|
|
FacilityCardButtonText.MEETINGS,
|
|
HotelHashValues.meetings,
|
|
facility.headingText,
|
|
SidepeekSlugs.meetings,
|
|
"Events that make an impression"
|
|
)
|
|
grid.push(card)
|
|
break
|
|
|
|
case FacilityCardTypeEnum.restaurant:
|
|
const restaurantTitle = getRestaurantHeading(amenities)
|
|
card = setCardProps(
|
|
"primaryDark",
|
|
FacilityCardButtonText.RESTAURANT,
|
|
HotelHashValues.restaurant,
|
|
facility.headingText,
|
|
SidepeekSlugs.restaurant,
|
|
restaurantTitle
|
|
)
|
|
grid.unshift(card)
|
|
break
|
|
}
|
|
return grid
|
|
})
|
|
return cards
|
|
}
|
|
|
|
function getRestaurantHeading(amenities: Amenities): RestaurantHeadings {
|
|
const hasBar = amenities.some(
|
|
(facility) =>
|
|
facility.id === FacilityEnum.Bar ||
|
|
facility.id === FacilityEnum.RooftopBar ||
|
|
facility.id === FacilityEnum.Skybar
|
|
)
|
|
const hasRestaurant = amenities.some(
|
|
(facility) => facility.id === FacilityEnum.Restaurant
|
|
)
|
|
|
|
if (hasBar && hasRestaurant) {
|
|
return RestaurantHeadings.restaurantAndBar
|
|
} else if (hasBar) {
|
|
return RestaurantHeadings.bar
|
|
} else if (hasRestaurant) {
|
|
return RestaurantHeadings.restaurant
|
|
}
|
|
return RestaurantHeadings.breakfastRestaurant
|
|
}
|
|
|
|
export function getWellnessHeading(
|
|
healthFacilities: HealthFacilities
|
|
): WellnessHeadings | undefined {
|
|
const hasGym = healthFacilities.some(
|
|
(facility) => facility.type === HealthFacilitiesEnum.Gym
|
|
)
|
|
const hasSauna = healthFacilities.some(
|
|
(faility) => faility.type === HealthFacilitiesEnum.Sauna
|
|
)
|
|
const hasRelax = healthFacilities.some(
|
|
(facility) => facility.type === HealthFacilitiesEnum.Relax
|
|
)
|
|
const hasJacuzzi = healthFacilities.some(
|
|
(facility) => facility.type === HealthFacilitiesEnum.Jacuzzi
|
|
)
|
|
const hasPool = healthFacilities.some(
|
|
(facility) =>
|
|
facility.type === HealthFacilitiesEnum.IndoorPool ||
|
|
facility.type === HealthFacilitiesEnum.OutdoorPool
|
|
)
|
|
|
|
if (hasGym && hasJacuzzi && hasSauna && hasRelax) {
|
|
return WellnessHeadings.GymJacuzziSaunaRelax
|
|
} else if (hasGym && hasPool && hasSauna && hasRelax) {
|
|
return WellnessHeadings.GymPoolSaunaRelax
|
|
} else if (hasGym && hasSauna) {
|
|
return WellnessHeadings.GymSauna
|
|
} else if (hasGym && hasPool) {
|
|
return WellnessHeadings.GymPool
|
|
}
|
|
return undefined
|
|
}
|
|
|
|
export function filterFacilityCards(cards: FacilityGrid) {
|
|
const card = cards.filter((card) => isFacilityCard(card))
|
|
const images = cards.filter((card) => isFacilityImage(card))
|
|
|
|
return {
|
|
card: card[0] as FacilityCard,
|
|
images: images as FacilityImage[],
|
|
}
|
|
}
|