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"]) +}