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:
Matilda Landström
2025-01-21 10:25:55 +00:00
parent d02dc51dcc
commit 554b73696d
15 changed files with 36 additions and 23 deletions

View File

@@ -20,7 +20,7 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
theme: hasImage ? "image" : "primaryDark",
primaryButton: hasImage
? {
href: `#s-${activities[lang]}`,
href: `#s-${activitiesCard.sidepeekSlug}`,
title: activitiesCard.ctaText,
isExternal: false,
scrollOnClick: false,
@@ -29,7 +29,7 @@ export default function ActivitiesCardGrid(activitiesCard: ActivityCard) {
secondaryButton: hasImage
? undefined
: {
href: `#s-${activities[lang]}`,
href: `#s-${activitiesCard.sidepeekSlug}`,
title: activitiesCard.ctaText,
isExternal: false,
scrollOnClick: false,

View File

@@ -16,9 +16,9 @@ import type {
export default async function Facilities({
facilities,
activitiesCard,
amenities,
healthFacilities,
activitiesCards,
}: FacilitiesProps) {
const intl = await getIntl()
@@ -56,7 +56,12 @@ export default async function Facilities({
facilitiesCardGrid={cardGrid}
/>
))}
{activitiesCard && <ActivitiesCardGrid {...activitiesCard} />}
{activitiesCards.map((card) => (
<ActivitiesCardGrid
key={card.upcoming_activities_card.contentPage.href}
{...card.upcoming_activities_card}
/>
))}
</SectionContainer>
)
}

View File

@@ -13,20 +13,22 @@ import type { ActivitiesSidePeekProps } from "@/types/components/hotelPage/sidep
export default async function ActivitiesSidePeek({
contentPage,
sidepeekCTA,
sidepeekSlug,
}: ActivitiesSidePeekProps) {
const lang = getLang()
const intl = await getIntl()
const { href, preamble } = contentPage
return (
<SidePeek
contentKey={activities[lang]}
contentKey={sidepeekSlug}
title={intl.formatMessage({ id: "Activities" })}
>
<Preamble>{preamble}</Preamble>
<div className={styles.buttonContainer}>
<Button theme="base" intent="secondary" asChild>
<Link href={href} color="burgundy" weight="bold">
{intl.formatMessage({ id: "Show activities calendar" })}
{sidepeekCTA}
</Link>
</Button>
</div>

View File

@@ -85,7 +85,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
const images = gallery?.smallerImages
const description = hotelContent.texts.descriptions.medium
const { spaPage, activitiesCard } = content
const { spaPage, activitiesCards } = content
const facilities: Facility[] = [
{
@@ -140,7 +140,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
</header>
<TabNavigation
restaurantTitle={getRestaurantHeading(detailedFacilities)}
hasActivities={!!activitiesCard}
hasActivities={activitiesCards.length > 0}
hasFAQ={!!faq.accordions.length}
/>
@@ -173,7 +173,7 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
<Rooms rooms={roomCategories} preamble={hotelRoomElevatorPitchText} />
<Facilities
facilities={facilities}
activitiesCard={activitiesCard?.upcoming_activities_card}
activitiesCards={activitiesCards}
amenities={detailedFacilities}
healthFacilities={healthFacilities}
/>
@@ -220,11 +220,14 @@ export default async function HotelPage({ hotelId }: HotelPageProps) {
spaPage={spaPage?.spa_page}
/>
<RestaurantBarSidePeek restaurants={restaurants} />
{activitiesCard && (
{activitiesCards.map((card) => (
<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
meetingFacilities={conferencesAndMeetings}
descriptions={hotelContent.texts.meetingDescription}