import { z } from "zod" import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/imageVault" import { LoyaltyPageEnum } from "../../../enums/loyaltyPage" import { discriminatedUnionArray } from "../../../utils/discriminatedUnion" import { cardsGridSchema } from "../schemas/blocks/cardsGrid" import { contentSchema as blockContentSchema } from "../schemas/blocks/content" import { dynamicContentSchema as blockDynamicContentSchema } from "../schemas/blocks/dynamicContent" import { shortcutsSchema } from "../schemas/blocks/shortcuts" import { contentSchema as sidebarContentSchema } from "../schemas/sidebar/content" import { dynamicContentSchema as sidebarDynamicContentSchema } from "../schemas/sidebar/dynamicContent" import { joinLoyaltyContactSchema } from "../schemas/sidebar/joinLoyaltyContact" import { systemSchema } from "../schemas/system" // LoyaltyPage export const extendedCardsGridSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.blocks.CardsGrid), }) .merge(cardsGridSchema) export const extendedContentSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.blocks.Content), }) .merge(blockContentSchema) export const extendedDynamicContentSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.blocks.DynamicContent), }) .merge(blockDynamicContentSchema) export const extendedShortcutsSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.blocks.Shortcuts), }) .merge(shortcutsSchema) export const blocksSchema = z.discriminatedUnion("__typename", [ extendedCardsGridSchema, extendedContentSchema, extendedDynamicContentSchema, extendedShortcutsSchema, ]) const contentSidebarSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.sidebar.Content), }) .merge(sidebarContentSchema) const dynamicContentSidebarSchema = z .object({ __typename: z.literal(LoyaltyPageEnum.ContentStack.sidebar.DynamicContent), }) .merge(sidebarDynamicContentSchema) export const joinLoyaltyContactSidebarSchema = z .object({ __typename: z.literal( LoyaltyPageEnum.ContentStack.sidebar.JoinLoyaltyContact ), }) .merge(joinLoyaltyContactSchema) export const sidebarSchema = z.discriminatedUnion("__typename", [ contentSidebarSchema, dynamicContentSidebarSchema, joinLoyaltyContactSidebarSchema, ]) export const loyaltyPageSchema = z.object({ loyalty_page: z .object({ blocks: discriminatedUnionArray(blocksSchema.options).nullable(), heading: z.string().optional(), hero_image: transformedImageVaultAssetSchema, preamble: z.string().optional(), sidebar: discriminatedUnionArray(sidebarSchema.options).nullable(), title: z.string().optional(), system: systemSchema.merge( z.object({ created_at: z.string(), updated_at: z.string(), }) ), }) .transform((data) => { return { blocks: data.blocks ? data.blocks : [], heading: data.heading, heroImage: data.hero_image, preamble: data.preamble, sidebar: data.sidebar ? data.sidebar : [], system: data.system, } }), trackingProps: z.object({ url: z.string(), }), })