From ddff1bfdfe755520494ead56a205f53224a1c4e5 Mon Sep 17 00:00:00 2001 From: Pontus Dreij Date: Wed, 25 Sep 2024 10:44:13 +0200 Subject: [PATCH 1/2] feat(SW-214): Setup connection to Contentstack --- lib/graphql/Fragments/Blocks/UspGrid.graphql | 69 ++++++++++++++++ .../contentstack/schemas/blocks/uspGrid.ts | 78 +++++++++++++++++++ types/enums/uspGrid.ts | 5 ++ 3 files changed, 152 insertions(+) create mode 100644 lib/graphql/Fragments/Blocks/UspGrid.graphql create mode 100644 server/routers/contentstack/schemas/blocks/uspGrid.ts create mode 100644 types/enums/uspGrid.ts diff --git a/lib/graphql/Fragments/Blocks/UspGrid.graphql b/lib/graphql/Fragments/Blocks/UspGrid.graphql new file mode 100644 index 000000000..6ccc2a587 --- /dev/null +++ b/lib/graphql/Fragments/Blocks/UspGrid.graphql @@ -0,0 +1,69 @@ +#import "../PageLink/AccountPageLink.graphql" +#import "../PageLink/ContentPageLink.graphql" +#import "../PageLink/HotelPageLink.graphql" +#import "../PageLink/LoyaltyPageLink.graphql" + +#import "../AccountPage/Ref.graphql" +#import "../ContentPage/Ref.graphql" +#import "../HotelPage/Ref.graphql" +#import "../LoyaltyPage/Ref.graphql" + +fragment UspGrid_ContentPage on ContentPageBlocksUspGrid { + __typename + usp_grid { + cardsConnection { + edges { + node { + ... on UspGrid { + usp_card { + icon + text { + embedded_itemsConnection { + totalCount + edges { + node { + __typename + ...AccountPageLink + ...ContentPageLink + ...HotelPageLink + ...LoyaltyPageLink + } + } + } + json + } + } + } + } + } + } + } +} + +fragment UspGrid_ContentPageRefs on ContentPageBlocksUspGrid { + usp_grid { + cardsConnection { + edges { + node { + ... on UspGrid { + usp_card { + text { + embedded_itemsConnection { + edges { + node { + __typename + ...AccountPageRef + ...ContentPageRef + ...ImageContainerRef + ...LoyaltyPageRef + } + } + } + } + } + } + } + } + } + } +} diff --git a/server/routers/contentstack/schemas/blocks/uspGrid.ts b/server/routers/contentstack/schemas/blocks/uspGrid.ts new file mode 100644 index 000000000..d65a5d0f2 --- /dev/null +++ b/server/routers/contentstack/schemas/blocks/uspGrid.ts @@ -0,0 +1,78 @@ +import { z } from "zod" + +import * as pageLinks from "@/server/routers/contentstack/schemas/pageLinks" + +import { BlocksEnums } from "@/types/enums/blocks" +import { UspGridEnum } from "@/types/enums/uspGrid" + +export const uspGridSchema = z.object({ + typename: z + .literal(BlocksEnums.block.UspGrid) + .optional() + .default(BlocksEnums.block.UspGrid), + usp_grid: z.object({ + usp_card: z.array( + z.object({ + icon: UspGridEnum.uspIcons, + text: z.object({ + json: z.any(), // JSON + embedded_itemsConnection: z.object({ + edges: z.array( + z.object({ + node: z + .discriminatedUnion("__typename", [ + pageLinks.accountPageSchema, + pageLinks.contentPageSchema, + pageLinks.hotelPageSchema, + pageLinks.loyaltyPageSchema, + ]) + .transform((data) => { + const link = pageLinks.transform(data) + if (link) { + return link + } + return data + }), + }) + ), + }), + }), + }) + ), + }), +}) + +const actualRefs = z.discriminatedUnion("__typename", [ + pageLinks.accountPageRefSchema, + pageLinks.contentPageRefSchema, + pageLinks.hotelPageRefSchema, + pageLinks.loyaltyPageRefSchema, +]) + +type Refs = { + node: z.TypeOf +} + +export const uspGridRefsSchema = z.object({ + usp_grid: z + .object({ + usp_card: z.array( + z.object({ + text: z.object({ + embedded_itemsConnection: z.object({ + edges: z.array( + z.object({ + node: z.discriminatedUnion("__typename", [ + ...actualRefs.options, + ]), + }) + ), + }), + }), + }) + ), + }) + .transform((data) => { + return data.usp_card.flat() + }), +}) diff --git a/types/enums/uspGrid.ts b/types/enums/uspGrid.ts new file mode 100644 index 000000000..247e46610 --- /dev/null +++ b/types/enums/uspGrid.ts @@ -0,0 +1,5 @@ +import { z } from "zod" + +export namespace UspGridEnum { + export const uspIcons = z.enum(["Snowflake"]) +} From cc7ecff639e6c282179d2512592eac82daf327be Mon Sep 17 00:00:00 2001 From: Pontus Dreij Date: Wed, 25 Sep 2024 10:44:43 +0200 Subject: [PATCH 2/2] feat(SW-214): Setup connection to Contentstack --- .../Query/ContentPage/ContentPage.graphql | 3 + .../contentstack/contentPage/output.ts | 18 +++- .../contentstack/schemas/blocks/textCols.ts | 87 ++++++++++--------- types/enums/blocks.ts | 1 + types/enums/contentPage.ts | 1 + 5 files changed, 64 insertions(+), 46 deletions(-) diff --git a/lib/graphql/Query/ContentPage/ContentPage.graphql b/lib/graphql/Query/ContentPage/ContentPage.graphql index 150429ee0..7b330003b 100644 --- a/lib/graphql/Query/ContentPage/ContentPage.graphql +++ b/lib/graphql/Query/ContentPage/ContentPage.graphql @@ -5,6 +5,7 @@ #import "../../Fragments/Blocks/DynamicContent.graphql" #import "../../Fragments/Blocks/Shortcuts.graphql" #import "../../Fragments/Blocks/TextCols.graphql" +#import "../../Fragments/Blocks/UspGrid.graphql" #import "../../Fragments/Sidebar/Content.graphql" #import "../../Fragments/Sidebar/DynamicContent.graphql" @@ -25,6 +26,7 @@ query GetContentPage($locale: String!, $uid: String!) { ...DynamicContent_ContentPage ...Shortcuts_ContentPage ...TextCols_ContentPage + ...UspGrid_ContentPage } sidebar { __typename @@ -49,6 +51,7 @@ query GetContentPageRefs($locale: String!, $uid: String!) { ...DynamicContent_ContentPageRefs ...Shortcuts_ContentPageRefs ...TextCols_ContentPageRef + ...UspGrid_ContentPageRefs } sidebar { __typename diff --git a/server/routers/contentstack/contentPage/output.ts b/server/routers/contentstack/contentPage/output.ts index 2be699b43..bb2728e63 100644 --- a/server/routers/contentstack/contentPage/output.ts +++ b/server/routers/contentstack/contentPage/output.ts @@ -18,6 +18,8 @@ import { shortcutsRefsSchema, shortcutsSchema, } from "../schemas/blocks/shortcuts" +import { textColsRefsSchema, textColsSchema } from "../schemas/blocks/textCols" +import { uspGridSchema } from "../schemas/blocks/uspGrid" import { tempImageVaultAssetSchema } from "../schemas/imageVault" import { contentRefsSchema as sidebarContentRefsSchema, @@ -31,7 +33,6 @@ import { import { systemSchema } from "../schemas/system" import { ContentPageEnum } from "@/types/enums/contentPage" -import { textColsRefsSchema, textColsSchema } from "../schemas/blocks/textCols" // Block schemas export const contentPageCards = z @@ -58,9 +59,17 @@ export const contentPageShortcuts = z }) .merge(shortcutsSchema) -export const contentPageTextCols = z.object({ - __typename: z.literal(ContentPageEnum.ContentStack.blocks.TextCols), -}).merge(textColsSchema) +export const contentPageTextCols = z + .object({ + __typename: z.literal(ContentPageEnum.ContentStack.blocks.TextCols), + }) + .merge(textColsSchema) + +export const contentPageUspGrid = z + .object({ + __typename: z.literal(ContentPageEnum.ContentStack.blocks.UspGrid), + }) + .merge(uspGridSchema) export const blocksSchema = z.discriminatedUnion("__typename", [ contentPageCards, @@ -68,6 +77,7 @@ export const blocksSchema = z.discriminatedUnion("__typename", [ contentPageDynamicContent, contentPageShortcuts, contentPageTextCols, + contentPageUspGrid, ]) export const contentPageSidebarContent = z diff --git a/server/routers/contentstack/schemas/blocks/textCols.ts b/server/routers/contentstack/schemas/blocks/textCols.ts index 01c37953b..6c6a465ff 100644 --- a/server/routers/contentstack/schemas/blocks/textCols.ts +++ b/server/routers/contentstack/schemas/blocks/textCols.ts @@ -1,47 +1,48 @@ import { z } from "zod" import * as pageLinks from "@/server/routers/contentstack/schemas/pageLinks" + import { imageRefsSchema, imageSchema } from "./image" import { BlocksEnums } from "@/types/enums/blocks" import { ContentEnum } from "@/types/enums/content" -export const textColsSchema = z - .object({ - typename: z - .literal(BlocksEnums.block.TextCols) - .optional() - .default(BlocksEnums.block.TextCols), - text_cols: z.object({ - columns: z.array( - z.object({ - title: z.string().optional().default(""), - text: z.object({ - json: z.any(), // JSON - embedded_itemsConnection: z.object({ - edges: z.array( - z.object({ - node: z.discriminatedUnion("__typename", [ +export const textColsSchema = z.object({ + typename: z + .literal(BlocksEnums.block.TextCols) + .optional() + .default(BlocksEnums.block.TextCols), + text_cols: z.object({ + columns: z.array( + z.object({ + title: z.string().optional().default(""), + text: z.object({ + json: z.any(), // JSON + embedded_itemsConnection: z.object({ + edges: z.array( + z.object({ + node: z + .discriminatedUnion("__typename", [ imageSchema, pageLinks.contentPageSchema, pageLinks.hotelPageSchema, pageLinks.loyaltyPageSchema, ]) - .transform((data) => { - const link = pageLinks.transform(data) - if (link) { - return link - } - return data - }), - }) - ), - }), + .transform((data) => { + const link = pageLinks.transform(data) + if (link) { + return link + } + return data + }), + }) + ), }), - }) - ), - }), - }) + }), + }) + ), + }), +}) const actualRefs = z.discriminatedUnion("__typename", [ pageLinks.contentPageRefSchema, @@ -53,9 +54,9 @@ type Refs = { node: z.TypeOf } -export const textColsRefsSchema = z - .object({ - text_cols: z.object({ +export const textColsRefsSchema = z.object({ + text_cols: z + .object({ columns: z.array( z.object({ text: z.object({ @@ -65,20 +66,22 @@ export const textColsRefsSchema = z node: z.discriminatedUnion("__typename", [ imageRefsSchema, ...actualRefs.options, - ]) + ]), }) ), }), }), }) ), - }).transform(data => { - return data.columns.map(column => { - const filtered = column.text.embedded_itemsConnection.edges - .filter( - block => block.node.__typename !== ContentEnum.blocks.SysAsset + }) + .transform((data) => { + return data.columns + .map((column) => { + const filtered = column.text.embedded_itemsConnection.edges.filter( + (block) => block.node.__typename !== ContentEnum.blocks.SysAsset ) as unknown as Refs[] // TS issue with filtered out types - return filtered.map(({ node }) => node.system) - }).flat() + return filtered.map(({ node }) => node.system) + }) + .flat() }), - }) \ No newline at end of file +}) diff --git a/types/enums/blocks.ts b/types/enums/blocks.ts index 88dfe5055..b91989b2e 100644 --- a/types/enums/blocks.ts +++ b/types/enums/blocks.ts @@ -6,5 +6,6 @@ export namespace BlocksEnums { Shortcuts = "Shortcuts", TextCols = "TextCols", TextContent = "TextContent", + UspGrid = "UspGrid", } } diff --git a/types/enums/contentPage.ts b/types/enums/contentPage.ts index 79663d74d..99dd48911 100644 --- a/types/enums/contentPage.ts +++ b/types/enums/contentPage.ts @@ -6,6 +6,7 @@ export namespace ContentPageEnum { DynamicContent = "ContentPageBlocksDynamicContent", Shortcuts = "ContentPageBlocksShortcuts", TextCols = "ContentPageBlocksTextCols", + UspGrid = "ContentPageBlocksUspGrid", } export const enum sidebar {