feat(SW-2973): Added bookingCode if available to links inside campaign pages

* feat(SW-2973): Moved block types to trpc lib

Approved-by: Matilda Landström
This commit is contained in:
Erik Tiekstra
2025-07-04 10:15:01 +00:00
parent fa7214cb58
commit 270249c6c4
44 changed files with 187 additions and 115 deletions

View File

@@ -18,6 +18,7 @@ import {
linkConnectionSchema,
} from "../schemas/linkConnection"
import { systemSchema } from "../schemas/system"
import { getCarouselCardsBlockWithBookingCodeLinks } from "./utils"
const campaignPageEssentials = z
.object({
@@ -123,6 +124,11 @@ export const campaignPageSchema = z
second_column: z.string(),
}),
blocks: discriminatedUnionArray(blocksSchema.options),
page_settings: z
.object({
booking_code: z.string().nullish(),
})
.nullish(),
system: systemSchema.merge(
z.object({
created_at: z.string(),
@@ -134,27 +140,35 @@ export const campaignPageSchema = z
url: z.string(),
}),
})
.transform((data) => {
const blocks = data.campaign_page.blocks.map((block) => {
if (
block.__typename === CampaignPageEnum.ContentStack.blocks.HotelListing
) {
return {
...block,
hotel_listing: {
...block.hotel_listing,
hotelIds: data.campaign_page.included_hotels,
},
}
.transform(({ campaign_page, ...data }) => {
const { blocks, page_settings, included_hotels, ...campaignPageData } =
campaign_page
const bookingCode = page_settings?.booking_code || null
const mappedBlocks = blocks.map((block) => {
switch (block.__typename) {
case CampaignPageEnum.ContentStack.blocks.HotelListing:
return {
...block,
hotel_listing: {
...block.hotel_listing,
hotelIds: included_hotels,
bookingCode,
},
}
case CampaignPageEnum.ContentStack.blocks.CarouselCards:
return getCarouselCardsBlockWithBookingCodeLinks(block, bookingCode)
case CampaignPageEnum.ContentStack.blocks.Essentials:
case CampaignPageEnum.ContentStack.blocks.Accordion:
default:
return block
}
return block
})
return {
...data,
campaign_page: {
...data.campaign_page,
blocks: [...blocks],
...campaignPageData,
blocks: [...mappedBlocks],
},
}
})

View File

@@ -1,9 +1,12 @@
import { CampaignPageEnum } from "../../../types/campaignPage"
import {
CampaignPageEnum,
type CampaignPageRefs,
} from "../../../types/campaignPage"
import { generateTag, generateTagsFromSystem } from "../../../utils/generateTag"
import type { Lang } from "@scandic-hotels/common/constants/language"
import type { CampaignPageRefs } from "../../../types/campaignPage"
import type { CarouselCardsBlock } from "../../../types/campaignPage"
import type { System } from "../schemas/system"
export function generatePageTags(
@@ -43,3 +46,35 @@ export function getConnections({ campaign_page }: CampaignPageRefs) {
return connections
}
export function getCarouselCardsBlockWithBookingCodeLinks(
block: CarouselCardsBlock,
bookingCode: string | null
): CarouselCardsBlock {
if (!bookingCode) {
return block
}
const { link, cards, ...carousel_cards } = block.carousel_cards
return {
...block,
carousel_cards: {
...carousel_cards,
link: link
? {
...link,
href: `${link.href}?bookingCode=${bookingCode}`,
}
: undefined,
cards: cards.map(({ link, ...card }) => ({
...card,
link: link
? {
...link,
href: `${link.href}?bookingCode=${bookingCode}`,
}
: undefined,
})),
},
}
}