Feat(SW-3708): refactor contentstack fetching (removing all refs) and cache invalidation * Remove all REFS * Revalidate correct language * PR fixes * PR fixes * Throw when errors from contentstack api Approved-by: Joakim Jäderberg
104 lines
3.2 KiB
TypeScript
104 lines
3.2 KiB
TypeScript
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(),
|
|
}),
|
|
})
|