From ee2abb72d2f45c05fa8785893cb3fa2000d104b8 Mon Sep 17 00:00:00 2001 From: Pontus Dreij Date: Wed, 25 Sep 2024 10:44:13 +0200 Subject: [PATCH] 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"]) +}