141 lines
3.6 KiB
TypeScript
141 lines
3.6 KiB
TypeScript
import { z } from "zod"
|
|
|
|
import { Lang } from "@/constants/languages"
|
|
|
|
import { imageVaultAssetSchema } from "../schemas/imageVault"
|
|
|
|
import { ContentBlocksTypenameEnum } from "@/types/components/content/enums"
|
|
import { ImageVaultAsset } from "@/types/components/imageVault"
|
|
import { Embeds } from "@/types/requests/embeds"
|
|
import { RTEEmbedsEnum } from "@/types/requests/rte"
|
|
import { EdgesWithTotalCount } from "@/types/requests/utils/edges"
|
|
import { RTEDocument } from "@/types/rte/node"
|
|
|
|
// Block Schema and types
|
|
const contentPageBlockTextContent = z.object({
|
|
__typename: z.literal(ContentBlocksTypenameEnum.ContentPageBlocksContent),
|
|
content: z.object({
|
|
content: z.object({
|
|
embedded_itemsConnection: z.object({
|
|
edges: z.array(z.any()),
|
|
totalCount: z.number(),
|
|
}),
|
|
json: z.any(),
|
|
}),
|
|
}),
|
|
})
|
|
|
|
const contentPageShortcuts = z.object({
|
|
__typename: z.literal(ContentBlocksTypenameEnum.ContentPageBlocksShortcuts),
|
|
shortcuts: z.object({
|
|
title: z.string().nullable(),
|
|
preamble: z.string().nullable(),
|
|
shortcuts: z.array(
|
|
z.object({
|
|
text: z.string().optional(),
|
|
openInNewTab: z.boolean(),
|
|
url: z.string(),
|
|
title: z.string(),
|
|
})
|
|
),
|
|
}),
|
|
})
|
|
|
|
const contentPageBlockItem = z.discriminatedUnion("__typename", [
|
|
contentPageBlockTextContent,
|
|
contentPageShortcuts,
|
|
])
|
|
|
|
type BlockContentRaw = z.infer<typeof contentPageBlockTextContent>
|
|
export interface RteBlockContent extends BlockContentRaw {
|
|
content: {
|
|
content: {
|
|
json: RTEDocument
|
|
embedded_itemsConnection: EdgesWithTotalCount<Embeds>
|
|
}
|
|
}
|
|
}
|
|
|
|
export type Shortcuts = z.infer<typeof contentPageShortcuts>
|
|
export type Block = RteBlockContent | Shortcuts
|
|
|
|
// Content Page Schema and types
|
|
export const validateContentPageSchema = z.object({
|
|
content_page: z.object({
|
|
title: z.string(),
|
|
header: z.object({
|
|
heading: z.string(),
|
|
preamble: z.string(),
|
|
}),
|
|
hero_image: imageVaultAssetSchema.nullable().optional(),
|
|
blocks: z.array(contentPageBlockItem).nullable(),
|
|
system: z.object({
|
|
uid: z.string(),
|
|
locale: z.nativeEnum(Lang),
|
|
created_at: z.string(),
|
|
updated_at: z.string(),
|
|
}),
|
|
}),
|
|
})
|
|
|
|
export type ContentPageDataRaw = z.infer<typeof validateContentPageSchema>
|
|
type ContentPageRaw = ContentPageDataRaw["content_page"]
|
|
|
|
export type ContentPage = Omit<ContentPageRaw, "blocks" | "hero_image"> & {
|
|
heroImage?: ImageVaultAsset
|
|
blocks: Block[]
|
|
}
|
|
|
|
const rteConnectionRefs = z.object({
|
|
edges: z.array(
|
|
z.object({
|
|
node: z.object({
|
|
__typename: z.nativeEnum(RTEEmbedsEnum),
|
|
system: z.object({
|
|
content_type_uid: z.string(),
|
|
uid: z.string(),
|
|
}),
|
|
}),
|
|
})
|
|
),
|
|
})
|
|
|
|
const contentPageBlockTextContentRefs = z.object({
|
|
__typename: z.literal(ContentBlocksTypenameEnum.ContentPageBlocksContent),
|
|
content: z.object({
|
|
content: z.object({
|
|
embedded_itemsConnection: rteConnectionRefs,
|
|
}),
|
|
}),
|
|
})
|
|
|
|
const contentPageShortcutsRefs = z.object({
|
|
__typename: z.literal(ContentBlocksTypenameEnum.ContentPageBlocksShortcuts),
|
|
shortcuts: z.object({
|
|
shortcuts: z.array(
|
|
z.object({
|
|
linkConnection: rteConnectionRefs,
|
|
})
|
|
),
|
|
}),
|
|
})
|
|
|
|
const contentPageBlockRefsItem = z.discriminatedUnion("__typename", [
|
|
contentPageBlockTextContentRefs,
|
|
contentPageShortcutsRefs,
|
|
])
|
|
|
|
export const validateContentPageRefsSchema = z.object({
|
|
content_page: z.object({
|
|
blocks: z.array(contentPageBlockRefsItem).nullable(),
|
|
system: z.object({
|
|
content_type_uid: z.string(),
|
|
uid: z.string(),
|
|
}),
|
|
}),
|
|
})
|
|
|
|
export type ContentPageRefsDataRaw = z.infer<
|
|
typeof validateContentPageRefsSchema
|
|
>
|