Files
web/packages/trpc/lib/routers/contentstack/schemas/blocks/videoCard.ts
Erik Tiekstra 0597b09c08 Feat/BOOK-257 videoplayer with card
* feat(BOOK-257): Added VideoPlayer with card component
* feat(BOOK-257): Added queries and component for VideoCard block to Content and Collection pages
* fix(BOOK-257): Only setting object-fit: cover on the video if it is not fullscreen
* feat(BOOK-257): Added queries and component for VideoCard block to Startpage
* feat(BOOK-257): Added queries and component for Video block to content/collection/start page

Approved-by: Chuma Mcphoy (We Ahead)
2025-12-12 06:34:32 +00:00

118 lines
2.8 KiB
TypeScript

import { z } from "zod"
import { logger } from "@scandic-hotels/common/logger"
import { BlocksEnums } from "../../../../types/blocksEnum"
import { systemSchema } from "../system"
import { transformedVideoSchema, videoRefSchema } from "../video"
const cardStyleSchema = z
.string()
.transform((val): "primary-1" | "primary-2" => {
if (val === "primary-1" || val === "primary-2") {
return val
}
return "primary-1"
})
export const videoQuoteCardSchema = z.object({
__typename: z.literal("VideoQuoteCard"),
video: transformedVideoSchema,
style: cardStyleSchema,
quote: z.string(),
author: z.string(),
author_description: z.string().nullish(),
})
export const videoTextCardSchema = z.object({
__typename: z.literal("VideoTextCard"),
video: transformedVideoSchema,
style: cardStyleSchema,
heading: z.string(),
text: z.string().nullish(),
})
export const videoCardSchema = z.object({
typename: z
.literal(BlocksEnums.block.VideoCard)
.default(BlocksEnums.block.VideoCard),
video_card: z
.object({
video_cardConnection: z.object({
edges: z.array(
z.object({
node: z.discriminatedUnion("__typename", [
videoQuoteCardSchema,
videoTextCardSchema,
]),
})
),
}),
})
.transform((data) => {
const videoCard = data.video_cardConnection.edges[0]?.node
if (!videoCard?.video) {
return null
}
const { __typename, style, video } = videoCard
switch (__typename) {
case "VideoTextCard": {
const { heading, text } = videoCard
return {
variant: "text" as const,
style,
video,
heading,
text: text || undefined,
}
}
case "VideoQuoteCard": {
const { quote, author, author_description } = videoCard
return {
variant: "quote" as const,
style,
video,
quote,
author,
authorDescription: author_description || undefined,
}
}
default:
const type: never = __typename
logger.error(`Unsupported content type given: ${type}`)
return null
}
}),
})
const videoCardRefSchema = z.object({
video: videoRefSchema,
system: systemSchema,
})
export const videoCardRefsSchema = z.object({
typename: z
.literal(BlocksEnums.block.VideoCard)
.default(BlocksEnums.block.VideoCard),
video_card: z
.object({
video_cardConnection: z.object({
edges: z.array(
z.object({
node: videoCardRefSchema,
})
),
}),
})
.transform((data) => {
const videoCard = data.video_cardConnection.edges[0]?.node
if (!videoCard?.video) {
return null
}
return videoCard
}),
})