Files
web/packages/trpc/lib/routers/contentstack/promoCampaignPage/output.ts
Matilda Landström dd44e39732 Merged in feat/LOY-362-promo-blocks (pull request #2880)
feat(LOY-362): add blocks

* feat(LOY-362): add blocks

* fix(LOY-362): hide RTE while waiting for CS


Approved-by: Chuma Mcphoy (We Ahead)
2025-09-29 14:42:16 +00:00

126 lines
3.5 KiB
TypeScript

import { z } from "zod"
import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/imageVault"
import { isMembershipLevel } from "@scandic-hotels/common/utils/membershipLevels"
import { nullableStringValidator } from "@scandic-hotels/common/utils/zod/stringValidator"
import { PromoCampaignPageEnum } from "../../../types/promoCampaignPage"
import { discriminatedUnionArray } from "../../../utils/discriminatedUnion"
import {
accordionRefsSchema,
accordionSchema,
} from "../schemas/blocks/accordion"
import {
//contentRefsSchema as blockContentRefsSchema,
contentSchema as blockContentSchema,
} from "../schemas/blocks/content"
import { systemSchema } from "../schemas/system"
export const promoCampaignPageContent = z
.object({
__typename: z.literal(PromoCampaignPageEnum.ContentStack.blocks.Content),
})
.merge(blockContentSchema)
export const promoCampaignPageAccordion = z
.object({
__typename: z.literal(PromoCampaignPageEnum.ContentStack.blocks.Accordion),
})
.merge(accordionSchema)
export const blocksSchema = z.discriminatedUnion("__typename", [
promoCampaignPageAccordion,
//promoCampaignPageContent,
])
export const CAMPAIGN_TYPES = {
TIER: "TIER",
POINT: "POINT",
} as const
export const promoHeroSchema = z.object({
image: transformedImageVaultAssetSchema,
heading: z.string(),
benefits: z
.array(z.string())
.nullish()
.transform((data) => data || []),
})
export const promoCampaignPageSchema = z
.object({
promo_campaign_page: z.object({
title: z.string(),
heading: z.string(),
subheading: z.string().nullish(),
promo_hero: promoHeroSchema,
page_settings: z
.object({
booking_code: z.string().nullish(),
})
.nullish(),
campaign_type: z.nativeEnum(CAMPAIGN_TYPES),
promo_code: z.string(),
startdate: nullableStringValidator,
enddate: nullableStringValidator,
level_selection: z
.array(z.string())
.nullish()
.transform((data) => {
if (!data) return []
return data.filter(isMembershipLevel)
}),
blocks: discriminatedUnionArray(blocksSchema.options).nullish(),
system: systemSchema.merge(
z.object({
created_at: z.string(),
updated_at: z.string(),
})
),
}),
trackingProps: z.object({
url: z.string(),
}),
})
.transform(({ promo_campaign_page, ...data }) => {
const { page_settings, level_selection, ...promoCampaignPageData } =
promo_campaign_page
const bookingCode = page_settings?.booking_code || null
return {
...data,
promo_campaign_page: {
bookingCode,
eligibleLevels: level_selection,
...promoCampaignPageData,
},
}
})
/** REFS */
/*const promoCampaignPageBlockContentRefs = z
.object({
__typename: z.literal(PromoCampaignPageEnum.ContentStack.blocks.Content),
})
.merge(blockContentRefsSchema)*/
const promoCampaignPageAccordionRefs = z
.object({
__typename: z.literal(PromoCampaignPageEnum.ContentStack.blocks.Accordion),
})
.merge(accordionRefsSchema)
const promoCampaignPageBlockRefsItem = z.discriminatedUnion("__typename", [
promoCampaignPageAccordionRefs,
//promoCampaignPageBlockContentRefs,
])
export const promoCampaignPageRefsSchema = z.object({
promo_campaign_page: z.object({
blocks: discriminatedUnionArray(
promoCampaignPageBlockRefsItem.options
).nullable(),
system: systemSchema,
}),
})