Merged in feat/SW-1001-multiple-activity-cards (pull request #1191)
Feat(SW-1001): Multiple activity cards on hotel page * chore(SW-1001): render all activity cards * chore(SW-1001): add sidepeek CTA text to CS * feat(SW-1001): add slug from CS Approved-by: Erik Tiekstra Approved-by: Fredrik Thorsson
This commit is contained in:
@@ -20,7 +20,7 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
|
|||||||
theme: hasImage ? "image" : "primaryDark",
|
theme: hasImage ? "image" : "primaryDark",
|
||||||
primaryButton: hasImage
|
primaryButton: hasImage
|
||||||
? {
|
? {
|
||||||
href: `#s-${activities[lang]}`,
|
href: `#s-${activitiesCard.sidepeekSlug}`,
|
||||||
title: activitiesCard.ctaText,
|
title: activitiesCard.ctaText,
|
||||||
isExternal: false,
|
isExternal: false,
|
||||||
scrollOnClick: false,
|
scrollOnClick: false,
|
||||||
@@ -29,7 +29,7 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
|
|||||||
secondaryButton: hasImage
|
secondaryButton: hasImage
|
||||||
? undefined
|
? undefined
|
||||||
: {
|
: {
|
||||||
href: `#s-${activities[lang]}`,
|
href: `#s-${activitiesCard.sidepeekSlug}`,
|
||||||
title: activitiesCard.ctaText,
|
title: activitiesCard.ctaText,
|
||||||
isExternal: false,
|
isExternal: false,
|
||||||
scrollOnClick: false,
|
scrollOnClick: false,
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ import type {
|
|||||||
|
|
||||||
export default async function Facilities({
|
export default async function Facilities({
|
||||||
facilities,
|
facilities,
|
||||||
activitiesCard,
|
|
||||||
amenities,
|
amenities,
|
||||||
healthFacilities,
|
healthFacilities,
|
||||||
|
activitiesCards,
|
||||||
}: FacilitiesProps) {
|
}: FacilitiesProps) {
|
||||||
const intl = await getIntl()
|
const intl = await getIntl()
|
||||||
|
|
||||||
@@ -56,7 +56,12 @@ export default async function Facilities({
|
|||||||
facilitiesCardGrid={cardGrid}
|
facilitiesCardGrid={cardGrid}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
{activitiesCard && <ActivitiesCardGrid {...activitiesCard} />}
|
{activitiesCards.map((card) => (
|
||||||
|
<ActivitiesCardGrid
|
||||||
|
key={card.upcoming_activities_card.contentPage.href}
|
||||||
|
{...card.upcoming_activities_card}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
</SectionContainer>
|
</SectionContainer>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,20 +13,22 @@ import type { ActivitiesSidePeekProps } from "@/types/components/hotelPage/sidep
|
|||||||
|
|
||||||
export default async function ActivitiesSidePeek({
|
export default async function ActivitiesSidePeek({
|
||||||
contentPage,
|
contentPage,
|
||||||
|
sidepeekCTA,
|
||||||
|
sidepeekSlug,
|
||||||
}: ActivitiesSidePeekProps) {
|
}: ActivitiesSidePeekProps) {
|
||||||
const lang = getLang()
|
const lang = getLang()
|
||||||
const intl = await getIntl()
|
const intl = await getIntl()
|
||||||
const { href, preamble } = contentPage
|
const { href, preamble } = contentPage
|
||||||
return (
|
return (
|
||||||
<SidePeek
|
<SidePeek
|
||||||
contentKey={activities[lang]}
|
contentKey={sidepeekSlug}
|
||||||
title={intl.formatMessage({ id: "Activities" })}
|
title={intl.formatMessage({ id: "Activities" })}
|
||||||
>
|
>
|
||||||
<Preamble>{preamble}</Preamble>
|
<Preamble>{preamble}</Preamble>
|
||||||
<div className={styles.buttonContainer}>
|
<div className={styles.buttonContainer}>
|
||||||
<Button theme="base" intent="secondary" asChild>
|
<Button theme="base" intent="secondary" asChild>
|
||||||
<Link href={href} color="burgundy" weight="bold">
|
<Link href={href} color="burgundy" weight="bold">
|
||||||
{intl.formatMessage({ id: "Show activities calendar" })}
|
{sidepeekCTA}
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
|
|||||||
const images = gallery?.smallerImages
|
const images = gallery?.smallerImages
|
||||||
const description = hotelContent.texts.descriptions.medium
|
const description = hotelContent.texts.descriptions.medium
|
||||||
|
|
||||||
const { spaPage, activitiesCard } = content
|
const { spaPage, activitiesCards } = content
|
||||||
|
|
||||||
const facilities: Facility[] = [
|
const facilities: Facility[] = [
|
||||||
{
|
{
|
||||||
@@ -140,7 +140,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
|
|||||||
</header>
|
</header>
|
||||||
<TabNavigation
|
<TabNavigation
|
||||||
restaurantTitle={getRestaurantHeading(detailedFacilities)}
|
restaurantTitle={getRestaurantHeading(detailedFacilities)}
|
||||||
hasActivities={!!activitiesCard}
|
hasActivities={activitiesCards.length > 0}
|
||||||
hasFAQ={!!faq.accordions.length}
|
hasFAQ={!!faq.accordions.length}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -173,7 +173,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
|
|||||||
<Rooms rooms={roomCategories} preamble={hotelRoomElevatorPitchText} />
|
<Rooms rooms={roomCategories} preamble={hotelRoomElevatorPitchText} />
|
||||||
<Facilities
|
<Facilities
|
||||||
facilities={facilities}
|
facilities={facilities}
|
||||||
activitiesCard={activitiesCard?.upcoming_activities_card}
|
activitiesCards={activitiesCards}
|
||||||
amenities={detailedFacilities}
|
amenities={detailedFacilities}
|
||||||
healthFacilities={healthFacilities}
|
healthFacilities={healthFacilities}
|
||||||
/>
|
/>
|
||||||
@@ -220,11 +220,14 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
|
|||||||
spaPage={spaPage?.spa_page}
|
spaPage={spaPage?.spa_page}
|
||||||
/>
|
/>
|
||||||
<RestaurantBarSidePeek restaurants={restaurants} />
|
<RestaurantBarSidePeek restaurants={restaurants} />
|
||||||
{activitiesCard && (
|
{activitiesCards.map((card) => (
|
||||||
<ActivitiesSidePeek
|
<ActivitiesSidePeek
|
||||||
contentPage={activitiesCard.upcoming_activities_card.contentPage}
|
key={card.upcoming_activities_card.heading}
|
||||||
|
contentPage={card.upcoming_activities_card.contentPage}
|
||||||
|
sidepeekCTA={card.upcoming_activities_card.sidepeekCtaText}
|
||||||
|
sidepeekSlug={card.upcoming_activities_card.sidepeekSlug}
|
||||||
/>
|
/>
|
||||||
)}
|
))}
|
||||||
<MeetingsAndConferencesSidePeek
|
<MeetingsAndConferencesSidePeek
|
||||||
meetingFacilities={conferencesAndMeetings}
|
meetingFacilities={conferencesAndMeetings}
|
||||||
descriptions={hotelContent.texts.meetingDescription}
|
descriptions={hotelContent.texts.meetingDescription}
|
||||||
|
|||||||
@@ -404,7 +404,6 @@
|
|||||||
"Select your language": "Vælg dit sprog",
|
"Select your language": "Vælg dit sprog",
|
||||||
"Shopping": "Shopping",
|
"Shopping": "Shopping",
|
||||||
"Shopping & Dining": "Shopping & Spisning",
|
"Shopping & Dining": "Shopping & Spisning",
|
||||||
"Show activities calendar": "Vis aktivitetskalender",
|
|
||||||
"Show all amenities": "Vis alle faciliteter",
|
"Show all amenities": "Vis alle faciliteter",
|
||||||
"Show less": "Vis mindre",
|
"Show less": "Vis mindre",
|
||||||
"Show less rooms": "Vise færre rum",
|
"Show less rooms": "Vise færre rum",
|
||||||
|
|||||||
@@ -403,7 +403,6 @@
|
|||||||
"Select your language": "Wählen Sie Ihre Sprache",
|
"Select your language": "Wählen Sie Ihre Sprache",
|
||||||
"Shopping": "Einkaufen",
|
"Shopping": "Einkaufen",
|
||||||
"Shopping & Dining": "Einkaufen & Essen",
|
"Shopping & Dining": "Einkaufen & Essen",
|
||||||
"Show activities calendar": "Aktivitätenkalender anzeigen",
|
|
||||||
"Show all amenities": "Alle Annehmlichkeiten anzeigen",
|
"Show all amenities": "Alle Annehmlichkeiten anzeigen",
|
||||||
"Show less": "Weniger anzeigen",
|
"Show less": "Weniger anzeigen",
|
||||||
"Show less rooms": "Weniger Zimmer anzeigen",
|
"Show less rooms": "Weniger Zimmer anzeigen",
|
||||||
|
|||||||
@@ -444,7 +444,6 @@
|
|||||||
"Select your language": "Select your language",
|
"Select your language": "Select your language",
|
||||||
"Shopping": "Shopping",
|
"Shopping": "Shopping",
|
||||||
"Shopping & Dining": "Shopping & Dining",
|
"Shopping & Dining": "Shopping & Dining",
|
||||||
"Show activities calendar": "Show activities calendar",
|
|
||||||
"Show all amenities": "Show all amenities",
|
"Show all amenities": "Show all amenities",
|
||||||
"Show less": "Show less",
|
"Show less": "Show less",
|
||||||
"Show less rooms": "Show less rooms",
|
"Show less rooms": "Show less rooms",
|
||||||
|
|||||||
@@ -405,7 +405,6 @@
|
|||||||
"Select your language": "Valitse kieli",
|
"Select your language": "Valitse kieli",
|
||||||
"Shopping": "Ostokset",
|
"Shopping": "Ostokset",
|
||||||
"Shopping & Dining": "Ostokset & Ravintolat",
|
"Shopping & Dining": "Ostokset & Ravintolat",
|
||||||
"Show activities calendar": "Näytä aktiviteettikalenteri",
|
|
||||||
"Show all amenities": "Näytä kaikki mukavuudet",
|
"Show all amenities": "Näytä kaikki mukavuudet",
|
||||||
"Show less": "Näytä vähemmän",
|
"Show less": "Näytä vähemmän",
|
||||||
"Show less rooms": "Näytä vähemmän huoneita",
|
"Show less rooms": "Näytä vähemmän huoneita",
|
||||||
|
|||||||
@@ -403,7 +403,6 @@
|
|||||||
"Select your language": "Velg språk",
|
"Select your language": "Velg språk",
|
||||||
"Shopping": "Shopping",
|
"Shopping": "Shopping",
|
||||||
"Shopping & Dining": "Shopping & Spisesteder",
|
"Shopping & Dining": "Shopping & Spisesteder",
|
||||||
"Show activities calendar": "Vis aktivitetskalender",
|
|
||||||
"Show all amenities": "Vis alle fasiliteter",
|
"Show all amenities": "Vis alle fasiliteter",
|
||||||
"Show less": "Vis mindre",
|
"Show less": "Vis mindre",
|
||||||
"Show less rooms": "Vise færre rom",
|
"Show less rooms": "Vise færre rom",
|
||||||
|
|||||||
@@ -403,7 +403,6 @@
|
|||||||
"Select your language": "Välj ditt språk",
|
"Select your language": "Välj ditt språk",
|
||||||
"Shopping": "Shopping",
|
"Shopping": "Shopping",
|
||||||
"Shopping & Dining": "Shopping & Mat",
|
"Shopping & Dining": "Shopping & Mat",
|
||||||
"Show activities calendar": "Visa aktivitetskalender",
|
|
||||||
"Show all amenities": "Visa alla bekvämligheter",
|
"Show all amenities": "Visa alla bekvämligheter",
|
||||||
"Show less": "Visa mindre",
|
"Show less": "Visa mindre",
|
||||||
"Show less rooms": "Visa färre rum",
|
"Show less rooms": "Visa färre rum",
|
||||||
|
|||||||
@@ -41,9 +41,11 @@ query GetHotelPage($locale: String!, $uid: String!) {
|
|||||||
upcoming_activities_card {
|
upcoming_activities_card {
|
||||||
background_image
|
background_image
|
||||||
cta_text
|
cta_text
|
||||||
|
sidepeek_cta_text
|
||||||
heading
|
heading
|
||||||
body_text
|
body_text
|
||||||
scripted_title
|
scripted_title
|
||||||
|
sidepeek_slug
|
||||||
hotel_page_activities_content_pageConnection {
|
hotel_page_activities_content_pageConnection {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
|
|||||||
@@ -41,11 +41,12 @@ export const hotelPageSchema = z.object({
|
|||||||
.nullable()
|
.nullable()
|
||||||
.transform((data) => {
|
.transform((data) => {
|
||||||
let spaPage: SpaPage | undefined
|
let spaPage: SpaPage | undefined
|
||||||
let activitiesCard: ActivitiesCard | undefined
|
let activitiesCards: ActivitiesCard[] = []
|
||||||
|
|
||||||
data?.map((block) => {
|
data?.map((block) => {
|
||||||
switch (block.typename) {
|
switch (block.typename) {
|
||||||
case HotelPageEnum.ContentStack.blocks.ActivitiesCard:
|
case HotelPageEnum.ContentStack.blocks.ActivitiesCard:
|
||||||
activitiesCard = block
|
activitiesCards.push(block)
|
||||||
break
|
break
|
||||||
case HotelPageEnum.ContentStack.blocks.SpaPage:
|
case HotelPageEnum.ContentStack.blocks.SpaPage:
|
||||||
spaPage = block
|
spaPage = block
|
||||||
@@ -54,7 +55,7 @@ export const hotelPageSchema = z.object({
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
return { spaPage, activitiesCard }
|
return { spaPage, activitiesCards }
|
||||||
}),
|
}),
|
||||||
faq: hotelFaqSchema,
|
faq: hotelFaqSchema,
|
||||||
hotel_page_id: z.string(),
|
hotel_page_id: z.string(),
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ export const activitiesCardSchema = z.object({
|
|||||||
background_image: tempImageVaultAssetSchema,
|
background_image: tempImageVaultAssetSchema,
|
||||||
body_text: z.string(),
|
body_text: z.string(),
|
||||||
cta_text: z.string(),
|
cta_text: z.string(),
|
||||||
|
sidepeek_cta_text: z.string(),
|
||||||
heading: z.string(),
|
heading: z.string(),
|
||||||
scripted_title: z.string().optional(),
|
scripted_title: z.string().optional(),
|
||||||
|
sidepeek_slug: z.string(),
|
||||||
hotel_page_activities_content_pageConnection: z.object({
|
hotel_page_activities_content_pageConnection: z.object({
|
||||||
edges: z.array(
|
edges: z.array(
|
||||||
z.object({
|
z.object({
|
||||||
@@ -53,6 +55,8 @@ export const activitiesCardSchema = z.object({
|
|||||||
bodyText: data.body_text,
|
bodyText: data.body_text,
|
||||||
contentPage,
|
contentPage,
|
||||||
ctaText: data.cta_text,
|
ctaText: data.cta_text,
|
||||||
|
sidepeekCtaText: data.sidepeek_cta_text,
|
||||||
|
sidepeekSlug: data.sidepeek_slug,
|
||||||
heading: data.heading,
|
heading: data.heading,
|
||||||
scriptedTopTitle: data.scripted_title,
|
scriptedTopTitle: data.scripted_title,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import type { Amenities, Facility, HealthFacilities } from "@/types/hotel"
|
import type { Amenities, Facility, HealthFacilities } from "@/types/hotel"
|
||||||
import type { ActivityCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
import type { ActivitiesCard } from "@/types/trpc/routers/contentstack/hotelPage"
|
||||||
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
import type { CardProps } from "@/components/TempDesignSystem/Card/card"
|
||||||
|
|
||||||
export type FacilitiesProps = {
|
export type FacilitiesProps = {
|
||||||
facilities: Facility[]
|
facilities: Facility[]
|
||||||
activitiesCard?: ActivityCard
|
activitiesCards: ActivitiesCard[]
|
||||||
amenities: Amenities
|
amenities: Amenities
|
||||||
healthFacilities: HealthFacilities
|
healthFacilities: HealthFacilities
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,4 +3,6 @@ export type ActivitiesSidePeekProps = {
|
|||||||
href: string
|
href: string
|
||||||
preamble: string
|
preamble: string
|
||||||
}
|
}
|
||||||
|
sidepeekCTA: string
|
||||||
|
sidepeekSlug: string
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user