diff --git a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/UsePoints/UsePointsModal.tsx b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/UsePoints/UsePointsModal.tsx index b18a20e1d..6eb3328b5 100644 --- a/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/UsePoints/UsePointsModal.tsx +++ b/apps/scandic-web/components/Blocks/DynamicContent/Overview/MembershipOverviewCard/UsePoints/UsePointsModal.tsx @@ -67,7 +67,11 @@ export function UsePointsModal({ const bookLink = `${pathname}?${searchParams}` - const [items] = contentData.all_usepointsmodal.items + const items = contentData?.all_usepointsmodal?.items?.[0] + + if (!items) { + return null + } const linkListItems = items.link_group.map((link) => ({ text: link.text, diff --git a/packages/trpc/lib/graphql/Query/UsePointsModal.graphql.ts b/packages/trpc/lib/graphql/Query/UsePointsModal.graphql.ts index 49bfa78b3..a59618f10 100644 --- a/packages/trpc/lib/graphql/Query/UsePointsModal.graphql.ts +++ b/packages/trpc/lib/graphql/Query/UsePointsModal.graphql.ts @@ -24,6 +24,7 @@ import { PromoCampaignPageLink } from "../Fragments/PageLink/PromoCampaignPageLi import { StartPageLink } from "../Fragments/PageLink/StartPageLink.graphql" import { PromoCampaignPageRef } from "../Fragments/PromoCampaignPage/Ref.graphql" import { StartPageRef } from "../Fragments/StartPage/Ref.graphql" +import { System } from "../Fragments/System.graphql" export const GetUsePointsModal = gql` query GetUsePointsModal($locale: String!) { @@ -99,6 +100,9 @@ export const GetUsePointsModalRefs = gql` } } } + system { + ...System + } } } } @@ -114,4 +118,5 @@ export const GetUsePointsModalRefs = gql` ${LoyaltyPageRef} ${StartPageRef} ${PromoCampaignPageRef} + ${System} ` diff --git a/packages/trpc/lib/routers/contentstack/UsePointsModal/output.ts b/packages/trpc/lib/routers/contentstack/UsePointsModal/output.ts index ac5123ff0..7d9a4919c 100644 --- a/packages/trpc/lib/routers/contentstack/UsePointsModal/output.ts +++ b/packages/trpc/lib/routers/contentstack/UsePointsModal/output.ts @@ -3,82 +3,70 @@ import { z } from "zod" import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/imageVault" import { IconName } from "@scandic-hotels/design-system/Icons/iconName" -import { linkConnectionRefs } from "../schemas/linkConnection" -import { linkUnionSchema, transformPageLink } from "../schemas/pageLinks" +import { + linkConnectionRefs, + linkConnectionSchema, +} from "../schemas/linkConnection" +import { systemSchema } from "../schemas/system" export type UsePointsModalData = z.output export type UsePointsModalRefsData = z.output +type LinkGroupItem = z.infer -export const linkConnectionSchema = z - .object({ - edges: z.array( - z.object({ - node: linkUnionSchema, +const linkGroupItemSchema = z.intersection( + z.object({ + link_text: z.string().default(""), + is_contentstack_link: z.boolean(), + illustration: z.nativeEnum(IconName).nullish(), + illustration_size: z + .enum(["small", "medium", "large"]) + .nullish() + .default("large"), + external_link: z + .object({ + href: z.string().default(""), }) - ), - }) - .transform((data) => { - if (data.edges.length) { - const linkNode = data.edges[0].node - if (linkNode) { - const link = transformPageLink(linkNode) - if (link && link.url) { - return link.url - } - } - } - return null - }) + .optional(), + }), + linkConnectionSchema +) const usePointsModalItemsSchema = z.object({ image: transformedImageVaultAssetSchema, - link_group: z - .array( - z.object({ - link_text: z.string().default(""), - is_contentstack_link: z.boolean(), - illustration: z.nativeEnum(IconName).nullish(), - illustration_size: z - .enum(["small", "medium", "large"]) - .nullish() - .default("large"), - external_link: z - .object({ - href: z.string().default(""), - }) - .optional(), - linkConnection: linkConnectionSchema, - }) - ) - .transform((links) => - links.map((link) => ({ - text: link.link_text || "", - isExternal: !link.is_contentstack_link, - href: link.is_contentstack_link - ? link.linkConnection || "" - : link.external_link?.href || "", - illustration: link.illustration - ? { - illustration: link.illustration, - size: link.illustration_size || "large", - } - : undefined, - })) - ), + link_group: z.array(linkGroupItemSchema).transform((links: LinkGroupItem[]) => + links.map((link) => ({ + text: link.link_text || "", + isExternal: !link.is_contentstack_link, + href: link.is_contentstack_link + ? link.link?.url || "" + : link.external_link?.href || "", + illustration: link.illustration + ? { + illustration: link.illustration, + size: link.illustration_size || "large", + } + : undefined, + })) + ), }) export const usePointsModalSchema = z.object({ - all_usepointsmodal: z.object({ - items: z.array(usePointsModalItemsSchema), - }), + all_usepointsmodal: z + .object({ + items: z.array(usePointsModalItemsSchema).optional(), + }) + .optional(), }) export const usePointsModalRefsSchema = z.object({ - all_usepointsmodal: z.object({ - items: z.array( - z.object({ - link_group: z.array(linkConnectionRefs), - }) - ), - }), + all_usepointsmodal: z + .object({ + items: z.array( + z.object({ + link_group: z.array(linkConnectionRefs), + system: systemSchema, + }) + ), + }) + .optional(), }) diff --git a/packages/trpc/lib/routers/contentstack/UsePointsModal/query.ts b/packages/trpc/lib/routers/contentstack/UsePointsModal/query.ts index d14ae7613..68c22141f 100644 --- a/packages/trpc/lib/routers/contentstack/UsePointsModal/query.ts +++ b/packages/trpc/lib/routers/contentstack/UsePointsModal/query.ts @@ -8,17 +8,22 @@ import { } from "../../../graphql/Query/UsePointsModal.graphql" import { request } from "../../../graphql/request" import { contentstackBaseProcedure } from "../../../procedures" +import { + generateRefsResponseTag, + generateTag, + generateTagsFromSystem, +} from "../../../utils/generateTag" import { type UsePointsModalData, type UsePointsModalRefsData, usePointsModalRefsSchema, usePointsModalSchema, } from "./output" +import { getConnections } from "./utils" export const usePointsModalQueryRouter = router({ get: contentstackBaseProcedure.query(async ({ ctx }) => { const { lang, uid } = ctx - const getRefsCounter = createCounter( "trpc.contentstack", "usePointsModal.get.refs" @@ -29,11 +34,12 @@ export const usePointsModalQueryRouter = router({ }) metricsRefs.start() + const refsTag = generateRefsResponseTag(lang, "usepointsmodal") const refsResponse = await request( GetUsePointsModalRefs, { locale: lang }, { - key: `contentstack:usePointsModal:${lang}:refs`, + key: refsTag, ttl: "max", } ) @@ -62,11 +68,18 @@ export const usePointsModalQueryRouter = router({ }) metrics.start() + const connections = getConnections(validatedRefsData.data) + + const tags = [ + generateTagsFromSystem(lang, connections), + generateTag(lang, "usepointsmodal"), + ].flat() + const response = await request( GetUsePointsModal, { locale: lang }, { - key: `contentstack:usePointsModal:${lang}`, + key: tags, ttl: "max", } ) diff --git a/packages/trpc/lib/routers/contentstack/UsePointsModal/utils.ts b/packages/trpc/lib/routers/contentstack/UsePointsModal/utils.ts new file mode 100644 index 000000000..440c40f4a --- /dev/null +++ b/packages/trpc/lib/routers/contentstack/UsePointsModal/utils.ts @@ -0,0 +1,17 @@ +import type { System } from "../schemas/system" +import type { UsePointsModalRefsData } from "./output" + +export function getConnections({ all_usepointsmodal }: UsePointsModalRefsData) { + const connections: System["system"][] = all_usepointsmodal?.items?.[0] + ? [all_usepointsmodal?.items?.[0]?.system] + : [] + + if (all_usepointsmodal && all_usepointsmodal.items) { + all_usepointsmodal?.items.forEach((item) => { + item.link_group.forEach((link) => { + link.link?.uid && connections.push(link.link) + }) + }) + } + return connections +}