diff --git a/packages/trpc/lib/graphql/Fragments/CollectionPage/TopPrimaryButton.graphql b/packages/trpc/lib/graphql/Fragments/CollectionPage/TopPrimaryButton.graphql index 104c45455..97529cadf 100644 --- a/packages/trpc/lib/graphql/Fragments/CollectionPage/TopPrimaryButton.graphql +++ b/packages/trpc/lib/graphql/Fragments/CollectionPage/TopPrimaryButton.graphql @@ -25,6 +25,7 @@ fragment TopPrimaryButton_CollectionPage on CollectionPageHeader { top_primary_button { title + is_contentstack_link linkConnection { edges { node { @@ -43,6 +44,10 @@ fragment TopPrimaryButton_CollectionPage on CollectionPageHeader { } } } + external_link { + href + title + } } } diff --git a/packages/trpc/lib/graphql/Fragments/ContentPage/TopPrimaryButton.graphql b/packages/trpc/lib/graphql/Fragments/ContentPage/TopPrimaryButton.graphql index 17084aef3..af24ffa86 100644 --- a/packages/trpc/lib/graphql/Fragments/ContentPage/TopPrimaryButton.graphql +++ b/packages/trpc/lib/graphql/Fragments/ContentPage/TopPrimaryButton.graphql @@ -25,6 +25,7 @@ fragment TopPrimaryButton_ContentPage on ContentPageHeader { top_primary_button { title + is_contentstack_link linkConnection { edges { node { @@ -43,6 +44,10 @@ fragment TopPrimaryButton_ContentPage on ContentPageHeader { } } } + external_link { + href + title + } } } diff --git a/packages/trpc/lib/routers/contentstack/collectionPage/output.ts b/packages/trpc/lib/routers/contentstack/collectionPage/output.ts index fff4cc37c..2b842bb0c 100644 --- a/packages/trpc/lib/routers/contentstack/collectionPage/output.ts +++ b/packages/trpc/lib/routers/contentstack/collectionPage/output.ts @@ -21,6 +21,7 @@ import { linkAndTitleSchema, linkConnectionRefs, } from "../schemas/linkConnection" +import { internalOrExternalLinkSchema } from "../schemas/pageLinks" import { systemSchema } from "../schemas/system" // Block schemas @@ -73,18 +74,6 @@ const navigationLinksSchema = z })) }) -const topPrimaryButtonSchema = linkAndTitleSchema - .nullable() - .transform((data) => { - if (!data?.link) { - return null - } - return { - url: data.link.url, - title: data.title || data.link.title || null, - } - }) - // Content Page Schema and types export const collectionPageSchema = z.object({ collection_page: z.object({ @@ -94,7 +83,7 @@ export const collectionPageSchema = z.object({ header: z.object({ heading: z.string(), preamble: z.string(), - top_primary_button: topPrimaryButtonSchema, + top_primary_button: internalOrExternalLinkSchema, navigation_links: navigationLinksSchema, }), meeting_package: z diff --git a/packages/trpc/lib/routers/contentstack/contentPage/output.ts b/packages/trpc/lib/routers/contentstack/contentPage/output.ts index 558fd110e..c77251319 100644 --- a/packages/trpc/lib/routers/contentstack/contentPage/output.ts +++ b/packages/trpc/lib/routers/contentstack/contentPage/output.ts @@ -36,6 +36,7 @@ import { linkAndTitleSchema, linkConnectionRefs, } from "../schemas/linkConnection" +import { internalOrExternalLinkSchema } from "../schemas/pageLinks" import { contentRefsSchema as sidebarContentRefsSchema, contentSchema as sidebarContentSchema, @@ -189,18 +190,6 @@ const navigationLinksSchema = z })) }) -const topPrimaryButtonSchema = linkAndTitleSchema - .nullable() - .transform((data) => { - if (!data?.link) { - return null - } - return { - url: data.link.url, - title: data.title || data.link.title || null, - } - }) - // Content Page Schema and types export const contentPageSchema = z.object({ content_page: z.object({ @@ -211,7 +200,7 @@ export const contentPageSchema = z.object({ header: z.object({ heading: z.string(), preamble: z.string(), - top_primary_button: topPrimaryButtonSchema, + top_primary_button: internalOrExternalLinkSchema, navigation_links: navigationLinksSchema, dynamic_content: headerDynamicContentSchema.nullish(), }), diff --git a/packages/trpc/lib/routers/contentstack/schemas/pageLinks.ts b/packages/trpc/lib/routers/contentstack/schemas/pageLinks.ts index 1e87e0ac0..a0c423669 100644 --- a/packages/trpc/lib/routers/contentstack/schemas/pageLinks.ts +++ b/packages/trpc/lib/routers/contentstack/schemas/pageLinks.ts @@ -1,6 +1,7 @@ import { z } from "zod" import { removeMultipleSlashes } from "@scandic-hotels/common/utils/url" +import { nullableStringValidator } from "@scandic-hotels/common/utils/zod/stringValidator" import { ContentEnum } from "../../../types/content" import { systemSchema } from "./system" @@ -206,6 +207,47 @@ export function transformPageLink(data: Data) { } } +export const internalOrExternalLinkSchema = z + .object({ + is_contentstack_link: z.boolean().nullish(), + external_link: z + .object({ + href: nullableStringValidator, + title: z.string().nullish(), + }) + .nullish(), + title: nullableStringValidator, + linkConnection: z.object({ + edges: z.array( + z.object({ + node: linkUnionSchema.transform((data) => { + const link = transformPageLink(data) + if (link) { + return link + } + return data + }), + }) + ), + }), + }) + .transform( + ({ is_contentstack_link, external_link, linkConnection, title }) => { + if (is_contentstack_link !== false && linkConnection.edges.length) { + const linkRef = linkConnection.edges[0].node + return { + title: title || linkRef.title, + url: linkRef.url, + } + } else if (is_contentstack_link === false && external_link?.href) { + return { + title: title || external_link.title || "", + url: external_link.href, + } + } + } + ) + export const linkRefsUnionSchema = z.discriminatedUnion("__typename", [ accountPageRefSchema, campaignOverviewPageRefSchema,