import { z } from "zod" import { tempImageVaultAssetSchema } from "../schemas/imageVault" import { linkRefsUnionSchema, linkUnionSchema, transformPageLink, } from "../schemas/pageLinks" import { systemSchema } from "../schemas/system" import type { ImageVaultAsset } from "@/types/components/imageVault" import { TrackingChannelEnum, type TrackingSDKPageData, } from "@/types/components/tracking" export const destinationCityPageSchema = z .object({ destination_city_page: z.object({ title: z.string(), destination_settings: z .object({ city_denmark: z.string().optional().nullable(), city_finland: z.string().optional().nullable(), city_germany: z.string().optional().nullable(), city_poland: z.string().optional().nullable(), city_norway: z.string().optional().nullable(), city_sweden: z.string().optional().nullable(), }) .transform( ({ city_denmark, city_finland, city_germany, city_norway, city_poland, city_sweden, }) => { const cities = [ city_denmark, city_finland, city_germany, city_poland, city_norway, city_sweden, ].filter((city): city is string => Boolean(city)) return { city: cities[0] } } ), heading: z.string(), preamble: z.string(), experiences: z .object({ destination_experiences: z.array(z.string()), }) .transform(({ destination_experiences }) => destination_experiences), images: z .array(z.object({ image: tempImageVaultAssetSchema })) .transform((images) => images .map((image) => image.image) .filter((image): image is ImageVaultAsset => !!image) ), has_sidepeek: z.boolean().default(false), sidepeek_button_text: z.string().default(""), sidepeek_content: z.object({ heading: z.string(), content: z.object({ json: z.any(), embedded_itemsConnection: z.object({ edges: z.array( z.object({ node: linkUnionSchema.transform((data) => { const link = transformPageLink(data) if (link) { return link } return data }), }) ), }), }), }), system: systemSchema.merge( z.object({ created_at: z.string(), updated_at: z.string(), }) ), }), trackingProps: z.object({ url: z.string(), }), }) .transform((data) => { const destinationCityPage = data.destination_city_page const system = destinationCityPage.system const trackingUrl = data.trackingProps.url const tracking: TrackingSDKPageData = { pageId: system.uid, domainLanguage: system.locale, publishDate: system.updated_at, createDate: system.created_at, channel: TrackingChannelEnum["destination-page"], pageType: "staticcontentpage", pageName: trackingUrl, siteSections: trackingUrl, siteVersion: "new-web", } return { destinationCityPage, tracking, } }) /** REFS */ export const destinationCityPageRefsSchema = z.object({ destination_city_page: z.object({ sidepeek_content: z.object({ content: z.object({ embedded_itemsConnection: z.object({ edges: z.array( z.object({ node: linkRefsUnionSchema, }) ), }), }), }), system: systemSchema, }), })