Merged in feat/LOY-419-highlight-promo-campaigns (pull request #3308)

feat(LOY-419): add promo campaigns to Campaign Overview Page

* feat(LOY-419): add promo campaigns as top campaign and all campaigns

* refactor(LOY-419)


Approved-by: Chuma Mcphoy (We Ahead)
This commit is contained in:
Matilda Landström
2025-12-10 12:29:23 +00:00
parent fde77a06ce
commit 5bcbc23732
9 changed files with 181 additions and 47 deletions

View File

@@ -2,12 +2,14 @@ import { z } from "zod"
import { CampaignOverviewPageEnum } from "../../../types/campaignOverviewPageEnum"
import { CampaignPageEnum } from "../../../types/campaignPage"
import { ContentEnum } from "../../../types/content"
import { discriminatedUnionArray } from "../../../utils/discriminatedUnion"
import {
campaignPageHotelListing,
heroSchema,
includedHotelsSchema,
} from "../campaignPage/output"
import { promoHeroSchema } from "../promoCampaignPage/output"
import {
allCampaignsRefsSchema,
allCampaignsSchema,
@@ -43,28 +45,69 @@ export const campaignPageBlocksSchema = z.discriminatedUnion("__typename", [
campaignPageHotelListing,
])
const topCampaign = z.object({
typename: z
.literal(ContentEnum.blocks.CampaignPage)
.optional()
.default(ContentEnum.blocks.CampaignPage),
hero: heroSchema,
included_hotels: includedHotelsSchema,
blocks: discriminatedUnionArray(campaignPageBlocksSchema.options),
url: z.string(),
})
const topCampaignSchema = z
.object({
hero: heroSchema,
included_hotels: includedHotelsSchema,
blocks: discriminatedUnionArray(campaignPageBlocksSchema.options),
url: z.string(),
__typename: z.literal(ContentEnum.blocks.CampaignPage),
})
.transform((data) => {
const { blocks, included_hotels, ...rest } = data
const hotelListingBlock = blocks.find(
(block) =>
block.__typename === CampaignPageEnum.ContentStack.blocks.HotelListing
)
.merge(topCampaign)
return {
...rest,
hotel_listing: {
heading: hotelListingBlock?.hotel_listing.heading || "",
hotelIds: included_hotels,
},
}
export const transformTopCampaign = (data: z.infer<typeof topCampaign>) => {
const { blocks, included_hotels, ...rest } = data
const hotelListingBlock = blocks?.find(
(block) =>
block.__typename === CampaignPageEnum.ContentStack.blocks.HotelListing
)
return {
...rest,
__typename: ContentEnum.blocks.CampaignPage,
hotel_listing: {
heading: hotelListingBlock?.hotel_listing.heading || "",
hotelIds: included_hotels,
},
}
}
export const transformedTopCampaign =
topCampaignSchema.transform(transformTopCampaign)
const topPromoCampaign = z.object({
typename: z
.literal(ContentEnum.blocks.PromoCampaignPage)
.optional()
.default(ContentEnum.blocks.PromoCampaignPage),
promo_hero: promoHeroSchema.nullish(),
url: z.string(),
})
const topPromoCampaignSchema = z
.object({
__typename: z.literal(ContentEnum.blocks.PromoCampaignPage),
})
.merge(topPromoCampaign)
export const transformTopPromoCampaign = (
data: z.infer<typeof topPromoCampaign>
) => {
const { promo_hero, ...rest } = data
return {
...rest,
__typename: ContentEnum.blocks.PromoCampaignPage,
hero: promo_hero,
}
}
export const transformedTopPromoCampaign = topPromoCampaignSchema.transform(
transformTopPromoCampaign
)
const campaignOverviewPageCarouselCards = z
.object({
@@ -109,9 +152,23 @@ export const campaignOverviewPageSchema = z.object({
heading: z.string().nullish(),
campaignConnection: z.object({
edges: z.array(
z.object({
node: topCampaignSchema,
})
z
.object({
node: z.discriminatedUnion("__typename", [
topCampaignSchema,
topPromoCampaignSchema,
]),
})
.transform((data) => {
if (data.node.__typename === ContentEnum.blocks.CampaignPage) {
return {
node: transformTopCampaign(data.node),
}
}
return {
node: transformTopPromoCampaign(data.node),
}
})
),
}),
}),

View File

@@ -4,7 +4,7 @@ import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/i
import { removeMultipleSlashes } from "@scandic-hotels/common/utils/url"
import { BlocksEnums } from "../../../../types/blocksEnum"
import { campaignPageRefSchema } from "../pageLinks"
import { campaignPageRefSchema, promoCampaignPageRefSchema } from "../pageLinks"
export const campaignPageCardSchema = z.object({
image: transformedImageVaultAssetSchema,
@@ -72,7 +72,10 @@ export const allCampaignsRefsSchema = z.object({
campaignsConnection: z.object({
edges: z.array(
z.object({
node: campaignPageRefSchema,
node: z.discriminatedUnion("__typename", [
campaignPageRefSchema,
promoCampaignPageRefSchema,
]),
})
),
}),