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)
126 lines
3.5 KiB
TypeScript
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,
|
|
}),
|
|
})
|