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, }), })