refactor(SW-302
This commit is contained in:
@@ -8,9 +8,9 @@ import styles from "./cardGrid.module.css"
|
|||||||
import type { CardGridProps } from "@/types/components/hotelPage/facilities"
|
import type { CardGridProps } from "@/types/components/hotelPage/facilities"
|
||||||
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
export default async function CardGrid({ facilities }: CardGridProps) {
|
export default function CardGrid({ facilityCardGid }: CardGridProps) {
|
||||||
const imageCard = sortCards(facilities)
|
const imageCard = sortCards(facilityCardGid)
|
||||||
const nrCards = facilities.length
|
const nrCards = facilityCardGid.length
|
||||||
|
|
||||||
function getCardClassName(card: CardProps): string {
|
function getCardClassName(card: CardProps): string {
|
||||||
if (nrCards === 1) {
|
if (nrCards === 1) {
|
||||||
@@ -24,7 +24,7 @@ export default async function CardGrid({ facilities }: CardGridProps) {
|
|||||||
return (
|
return (
|
||||||
<section id={imageCard.card?.id}>
|
<section id={imageCard.card?.id}>
|
||||||
<Grids.Stackable className={styles.desktopGrid}>
|
<Grids.Stackable className={styles.desktopGrid}>
|
||||||
{facilities.map((card: CardProps) => (
|
{facilityCardGid.map((card: CardProps) => (
|
||||||
<Card
|
<Card
|
||||||
theme={card.theme || "primaryDark"}
|
theme={card.theme || "primaryDark"}
|
||||||
key={card.id}
|
key={card.id}
|
||||||
|
|||||||
@@ -1,33 +1,49 @@
|
|||||||
import { activities } from "@/constants/routes/hotelPageParams"
|
|
||||||
|
|
||||||
import SectionContainer from "@/components/Section/Container"
|
import SectionContainer from "@/components/Section/Container"
|
||||||
import { getLang } from "@/i18n/serverContext"
|
import { getIntl } from "@/i18n"
|
||||||
|
import { setActivityCard, setFacilityCardGrids } from "@/utils/facilityCards"
|
||||||
|
|
||||||
import CardGrid from "./CardGrid"
|
import CardGrid from "./CardGrid"
|
||||||
|
|
||||||
import styles from "./facilities.module.css"
|
import styles from "./facilities.module.css"
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
|
FacilitiesProps,
|
||||||
FacilityCards,
|
FacilityCards,
|
||||||
FacilityProps,
|
|
||||||
} from "@/types/components/hotelPage/facilities"
|
} from "@/types/components/hotelPage/facilities"
|
||||||
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
export default async function Facilities({ facilities }: FacilityProps) {
|
export default async function Facilities({
|
||||||
const lang = getLang()
|
facilities,
|
||||||
|
activitiesCard,
|
||||||
|
}: FacilitiesProps) {
|
||||||
|
const intl = await getIntl()
|
||||||
|
|
||||||
// Put activities card at the end
|
const facilityCardGrids = setFacilityCardGrids(facilities)
|
||||||
const activitiesIdx = facilities.findIndex(
|
const updatedActivitiesCard =
|
||||||
(facility) => facility[0].id === activities[lang]
|
activitiesCard && setActivityCard(activitiesCard)
|
||||||
)
|
|
||||||
if (activitiesIdx !== -1) {
|
facilityCardGrids.map((cardGrid: FacilityCards) => {
|
||||||
facilities.push(facilities.splice(activitiesIdx, 1)[0])
|
cardGrid.map((card: CardProps) => {
|
||||||
}
|
card.heading = card.heading && intl.formatMessage({ id: card.heading })
|
||||||
|
card.secondaryButton
|
||||||
|
? (card.secondaryButton.title = intl.formatMessage({
|
||||||
|
id: card.secondaryButton.title,
|
||||||
|
}))
|
||||||
|
: null
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SectionContainer className={styles.grid}>
|
<SectionContainer className={styles.grid}>
|
||||||
{facilities.map((facilityCards: FacilityCards) => (
|
{facilityCardGrids.map((cardGrid: FacilityCards) => (
|
||||||
<CardGrid key={facilityCards[0].id} facilities={facilityCards} />
|
<CardGrid key={cardGrid[0].id} facilityCardGid={cardGrid} />
|
||||||
))}
|
))}
|
||||||
|
{updatedActivitiesCard && (
|
||||||
|
<CardGrid
|
||||||
|
key={updatedActivitiesCard.id}
|
||||||
|
facilityCardGid={[updatedActivitiesCard]}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</SectionContainer>
|
</SectionContainer>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,7 @@ import SidePeekProvider from "@/components/SidePeekProvider"
|
|||||||
import SidePeek from "@/components/TempDesignSystem/SidePeek"
|
import SidePeek from "@/components/TempDesignSystem/SidePeek"
|
||||||
import { getIntl } from "@/i18n"
|
import { getIntl } from "@/i18n"
|
||||||
import { getLang } from "@/i18n/serverContext"
|
import { getLang } from "@/i18n/serverContext"
|
||||||
import {
|
import { getRestaurantHeading } from "@/utils/facilityCards"
|
||||||
getRestaurantHeading,
|
|
||||||
setActivityCard,
|
|
||||||
setFacilityCards,
|
|
||||||
} from "@/utils/facilityCards"
|
|
||||||
|
|
||||||
import DynamicMap from "./Map/DynamicMap"
|
import DynamicMap from "./Map/DynamicMap"
|
||||||
import MapCard from "./Map/MapCard"
|
import MapCard from "./Map/MapCard"
|
||||||
@@ -48,12 +44,9 @@ export default async function HotelPage() {
|
|||||||
roomCategories,
|
roomCategories,
|
||||||
activitiesCard,
|
activitiesCard,
|
||||||
pointsOfInterest,
|
pointsOfInterest,
|
||||||
facilityCards,
|
facilities,
|
||||||
} = hotelData
|
} = hotelData
|
||||||
|
|
||||||
const facilities = setFacilityCards(facilityCards)
|
|
||||||
activitiesCard && facilities.push(setActivityCard(activitiesCard))
|
|
||||||
|
|
||||||
const topThreePois = pointsOfInterest.slice(0, 3)
|
const topThreePois = pointsOfInterest.slice(0, 3)
|
||||||
|
|
||||||
const coordinates = {
|
const coordinates = {
|
||||||
@@ -126,7 +119,7 @@ export default async function HotelPage() {
|
|||||||
<AmenitiesList detailedFacilities={hotelDetailedFacilities} />
|
<AmenitiesList detailedFacilities={hotelDetailedFacilities} />
|
||||||
</div>
|
</div>
|
||||||
<Rooms rooms={roomCategories} />
|
<Rooms rooms={roomCategories} />
|
||||||
<Facilities facilities={facilities} />
|
<Facilities facilities={facilities} activitiesCard={activitiesCard} />
|
||||||
</main>
|
</main>
|
||||||
{googleMapsApiKey ? (
|
{googleMapsApiKey ? (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ export const hotelQueryRouter = router({
|
|||||||
pointsOfInterest: hotelAttributes.pointsOfInterest,
|
pointsOfInterest: hotelAttributes.pointsOfInterest,
|
||||||
roomCategories,
|
roomCategories,
|
||||||
activitiesCard: activities?.upcoming_activities_card,
|
activitiesCard: activities?.upcoming_activities_card,
|
||||||
facilityCards: facilities,
|
facilities,
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
availability: router({
|
availability: router({
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
|
import type { Facility } from "@/types/hotel"
|
||||||
|
import type { ActivityCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
||||||
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
export type FacilityCards = CardProps[]
|
export type FacilityCards = CardProps[]
|
||||||
|
|
||||||
export type Facilities = FacilityCards[]
|
export type Facilities = FacilityCards[]
|
||||||
|
|
||||||
export type FacilityProps = {
|
export type FacilitiesProps = {
|
||||||
facilities: Facilities
|
facilities: Facility[]
|
||||||
|
activitiesCard?: ActivityCard
|
||||||
}
|
}
|
||||||
|
|
||||||
export type CardGridProps = {
|
export type CardGridProps = {
|
||||||
facilities: FacilityCards
|
facilityCardGid: FacilityCards
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum FacilityEnum {
|
export enum FacilityEnum {
|
||||||
|
|||||||
@@ -5,79 +5,67 @@ import {
|
|||||||
wellnessAndExercise,
|
wellnessAndExercise,
|
||||||
} from "@/constants/routes/hotelPageParams"
|
} from "@/constants/routes/hotelPageParams"
|
||||||
|
|
||||||
import { getIntl } from "@/i18n"
|
|
||||||
import { getLang } from "@/i18n/serverContext"
|
import { getLang } from "@/i18n/serverContext"
|
||||||
|
|
||||||
import {
|
import {
|
||||||
type Facilities,
|
type Facilities,
|
||||||
type FacilityCards,
|
|
||||||
FacilityEnum,
|
FacilityEnum,
|
||||||
FacilityIds,
|
FacilityIds,
|
||||||
RestaurantHeadings,
|
RestaurantHeadings,
|
||||||
} from "@/types/components/hotelPage/facilities"
|
} from "@/types/components/hotelPage/facilities"
|
||||||
import type { ImageVaultAsset } from "@/types/components/imageVault"
|
|
||||||
import type { Amenities, Facility } from "@/types/hotel"
|
import type { Amenities, Facility } from "@/types/hotel"
|
||||||
|
import { ActivityCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
||||||
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
type ActivityCard = {
|
export function setActivityCard(activitiesCard: ActivityCard): CardProps {
|
||||||
background_image?: ImageVaultAsset
|
|
||||||
scripted_title?: string
|
|
||||||
heading: string
|
|
||||||
body_text: string
|
|
||||||
cta_text: string
|
|
||||||
contentPage: { href: string }
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setActivityCard(activitiesCard: ActivityCard): FacilityCards {
|
|
||||||
const lang = getLang()
|
const lang = getLang()
|
||||||
const hasImage = activitiesCard.background_image
|
const hasImage = activitiesCard.background_image
|
||||||
return [
|
|
||||||
{
|
const updatedCard: CardProps = {
|
||||||
id: activities[lang],
|
id: activities[lang],
|
||||||
theme: hasImage ? "image" : "primaryDark",
|
theme: hasImage ? "image" : "primaryDark",
|
||||||
scriptedTopTitle: activitiesCard.scripted_title,
|
scriptedTopTitle: activitiesCard.scripted_title,
|
||||||
heading: activitiesCard.heading,
|
heading: activitiesCard.heading,
|
||||||
bodyText: activitiesCard.body_text,
|
bodyText: activitiesCard.body_text,
|
||||||
backgroundImage: hasImage ? activitiesCard.background_image : undefined,
|
backgroundImage: hasImage ? activitiesCard.background_image : undefined,
|
||||||
primaryButton: hasImage
|
primaryButton: hasImage
|
||||||
? {
|
? {
|
||||||
href: activitiesCard.contentPage.href,
|
href: activitiesCard.contentPage.href,
|
||||||
title: activitiesCard.cta_text,
|
title: activitiesCard.cta_text,
|
||||||
isExternal: false,
|
isExternal: false,
|
||||||
}
|
}
|
||||||
: undefined,
|
: undefined,
|
||||||
secondaryButton: hasImage
|
secondaryButton: hasImage
|
||||||
? undefined
|
? undefined
|
||||||
: {
|
: {
|
||||||
href: activitiesCard.contentPage.href,
|
href: activitiesCard.contentPage.href,
|
||||||
title: activitiesCard.cta_text,
|
title: activitiesCard.cta_text,
|
||||||
isExternal: false,
|
isExternal: false,
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
]
|
return updatedCard
|
||||||
}
|
}
|
||||||
|
|
||||||
async function setCardProps(
|
function setCardProps(
|
||||||
theme: CardProps["theme"],
|
theme: CardProps["theme"],
|
||||||
heading: string,
|
heading: string,
|
||||||
buttonText: string,
|
buttonText: string,
|
||||||
href: string
|
href: string
|
||||||
) {
|
) {
|
||||||
const intl = await getIntl()
|
|
||||||
const card: CardProps = {}
|
const card: CardProps = {}
|
||||||
|
|
||||||
card.theme = theme
|
card.theme = theme
|
||||||
card.id = href
|
card.id = href
|
||||||
card.heading = intl.formatMessage({ id: heading })
|
card.heading = heading
|
||||||
card.secondaryButton = {
|
card.secondaryButton = {
|
||||||
href: `?s=${href}`,
|
href: `?s=${href}`,
|
||||||
title: intl.formatMessage({ id: buttonText }),
|
title: buttonText,
|
||||||
isExternal: false,
|
isExternal: false,
|
||||||
}
|
}
|
||||||
return card
|
return card
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setFacilityCards(facilities: Facility[]) {
|
export function setFacilityCardGrids(facilities: Facility[]): Facilities {
|
||||||
const lang = getLang()
|
const lang = getLang()
|
||||||
const cards: Facilities = []
|
const cards: Facilities = []
|
||||||
|
|
||||||
@@ -104,7 +92,7 @@ export function setFacilityCards(facilities: Facility[]) {
|
|||||||
|
|
||||||
switch (facility.id) {
|
switch (facility.id) {
|
||||||
case FacilityEnum.wellness:
|
case FacilityEnum.wellness:
|
||||||
card = await setCardProps(
|
card = setCardProps(
|
||||||
"one",
|
"one",
|
||||||
"Sauna and gym",
|
"Sauna and gym",
|
||||||
"Read more about wellness & exercise",
|
"Read more about wellness & exercise",
|
||||||
@@ -115,7 +103,7 @@ export function setFacilityCards(facilities: Facility[]) {
|
|||||||
break
|
break
|
||||||
|
|
||||||
case FacilityEnum.conference:
|
case FacilityEnum.conference:
|
||||||
card = await setCardProps(
|
card = setCardProps(
|
||||||
"primaryDim",
|
"primaryDim",
|
||||||
"Events that make an impression",
|
"Events that make an impression",
|
||||||
"About meetings & conferences",
|
"About meetings & conferences",
|
||||||
@@ -127,7 +115,7 @@ export function setFacilityCards(facilities: Facility[]) {
|
|||||||
|
|
||||||
case FacilityEnum.restaurant:
|
case FacilityEnum.restaurant:
|
||||||
//const title = getRestaurantHeading(amenities) // TODO will be used later
|
//const title = getRestaurantHeading(amenities) // TODO will be used later
|
||||||
card = await setCardProps(
|
card = setCardProps(
|
||||||
"primaryDark",
|
"primaryDark",
|
||||||
"Enjoy relaxed restaurant experiences",
|
"Enjoy relaxed restaurant experiences",
|
||||||
"Read more & book a table",
|
"Read more & book a table",
|
||||||
|
|||||||
Reference in New Issue
Block a user