Merged in fix/LOY-400-make-contentstack-data-optional (pull request #3266)
fix(LOY-400): made contentstack data optional so the whole page does not crash if it's empty. * fix(LOY-400): made contentstack data optional so the whole page does not crash if it's empty. * Merged in fix/LOY-400-make-contentstack-data-optional-2 (pull request #3269) Fix/LOY-400 make contentstack data optional 2 * Test * . * Correct ref tag * refactor * Correct key * fix(LOY-400): cleaned up Approved-by: Linus Flood Approved-by: Matilda Landström
This commit is contained in:
@@ -67,7 +67,11 @@ export function UsePointsModal({
|
|||||||
|
|
||||||
const bookLink = `${pathname}?${searchParams}`
|
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) => ({
|
const linkListItems = items.link_group.map((link) => ({
|
||||||
text: link.text,
|
text: link.text,
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import { PromoCampaignPageLink } from "../Fragments/PageLink/PromoCampaignPageLi
|
|||||||
import { StartPageLink } from "../Fragments/PageLink/StartPageLink.graphql"
|
import { StartPageLink } from "../Fragments/PageLink/StartPageLink.graphql"
|
||||||
import { PromoCampaignPageRef } from "../Fragments/PromoCampaignPage/Ref.graphql"
|
import { PromoCampaignPageRef } from "../Fragments/PromoCampaignPage/Ref.graphql"
|
||||||
import { StartPageRef } from "../Fragments/StartPage/Ref.graphql"
|
import { StartPageRef } from "../Fragments/StartPage/Ref.graphql"
|
||||||
|
import { System } from "../Fragments/System.graphql"
|
||||||
|
|
||||||
export const GetUsePointsModal = gql`
|
export const GetUsePointsModal = gql`
|
||||||
query GetUsePointsModal($locale: String!) {
|
query GetUsePointsModal($locale: String!) {
|
||||||
@@ -99,6 +100,9 @@ export const GetUsePointsModalRefs = gql`
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
system {
|
||||||
|
...System
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -114,4 +118,5 @@ export const GetUsePointsModalRefs = gql`
|
|||||||
${LoyaltyPageRef}
|
${LoyaltyPageRef}
|
||||||
${StartPageRef}
|
${StartPageRef}
|
||||||
${PromoCampaignPageRef}
|
${PromoCampaignPageRef}
|
||||||
|
${System}
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -3,82 +3,70 @@ import { z } from "zod"
|
|||||||
import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/imageVault"
|
import { transformedImageVaultAssetSchema } from "@scandic-hotels/common/utils/imageVault"
|
||||||
import { IconName } from "@scandic-hotels/design-system/Icons/iconName"
|
import { IconName } from "@scandic-hotels/design-system/Icons/iconName"
|
||||||
|
|
||||||
import { linkConnectionRefs } from "../schemas/linkConnection"
|
import {
|
||||||
import { linkUnionSchema, transformPageLink } from "../schemas/pageLinks"
|
linkConnectionRefs,
|
||||||
|
linkConnectionSchema,
|
||||||
|
} from "../schemas/linkConnection"
|
||||||
|
import { systemSchema } from "../schemas/system"
|
||||||
|
|
||||||
export type UsePointsModalData = z.output<typeof usePointsModalSchema>
|
export type UsePointsModalData = z.output<typeof usePointsModalSchema>
|
||||||
export type UsePointsModalRefsData = z.output<typeof usePointsModalRefsSchema>
|
export type UsePointsModalRefsData = z.output<typeof usePointsModalRefsSchema>
|
||||||
|
type LinkGroupItem = z.infer<typeof linkGroupItemSchema>
|
||||||
|
|
||||||
export const linkConnectionSchema = z
|
const linkGroupItemSchema = z.intersection(
|
||||||
.object({
|
z.object({
|
||||||
edges: z.array(
|
link_text: z.string().default(""),
|
||||||
z.object({
|
is_contentstack_link: z.boolean(),
|
||||||
node: linkUnionSchema,
|
illustration: z.nativeEnum(IconName).nullish(),
|
||||||
|
illustration_size: z
|
||||||
|
.enum(["small", "medium", "large"])
|
||||||
|
.nullish()
|
||||||
|
.default("large"),
|
||||||
|
external_link: z
|
||||||
|
.object({
|
||||||
|
href: z.string().default(""),
|
||||||
})
|
})
|
||||||
),
|
.optional(),
|
||||||
})
|
}),
|
||||||
.transform((data) => {
|
linkConnectionSchema
|
||||||
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
|
|
||||||
})
|
|
||||||
|
|
||||||
const usePointsModalItemsSchema = z.object({
|
const usePointsModalItemsSchema = z.object({
|
||||||
image: transformedImageVaultAssetSchema,
|
image: transformedImageVaultAssetSchema,
|
||||||
link_group: z
|
link_group: z.array(linkGroupItemSchema).transform((links: LinkGroupItem[]) =>
|
||||||
.array(
|
links.map((link) => ({
|
||||||
z.object({
|
text: link.link_text || "",
|
||||||
link_text: z.string().default(""),
|
isExternal: !link.is_contentstack_link,
|
||||||
is_contentstack_link: z.boolean(),
|
href: link.is_contentstack_link
|
||||||
illustration: z.nativeEnum(IconName).nullish(),
|
? link.link?.url || ""
|
||||||
illustration_size: z
|
: link.external_link?.href || "",
|
||||||
.enum(["small", "medium", "large"])
|
illustration: link.illustration
|
||||||
.nullish()
|
? {
|
||||||
.default("large"),
|
illustration: link.illustration,
|
||||||
external_link: z
|
size: link.illustration_size || "large",
|
||||||
.object({
|
}
|
||||||
href: z.string().default(""),
|
: undefined,
|
||||||
})
|
}))
|
||||||
.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,
|
|
||||||
}))
|
|
||||||
),
|
|
||||||
})
|
})
|
||||||
|
|
||||||
export const usePointsModalSchema = z.object({
|
export const usePointsModalSchema = z.object({
|
||||||
all_usepointsmodal: z.object({
|
all_usepointsmodal: z
|
||||||
items: z.array(usePointsModalItemsSchema),
|
.object({
|
||||||
}),
|
items: z.array(usePointsModalItemsSchema).optional(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
export const usePointsModalRefsSchema = z.object({
|
export const usePointsModalRefsSchema = z.object({
|
||||||
all_usepointsmodal: z.object({
|
all_usepointsmodal: z
|
||||||
items: z.array(
|
.object({
|
||||||
z.object({
|
items: z.array(
|
||||||
link_group: z.array(linkConnectionRefs),
|
z.object({
|
||||||
})
|
link_group: z.array(linkConnectionRefs),
|
||||||
),
|
system: systemSchema,
|
||||||
}),
|
})
|
||||||
|
),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -8,17 +8,22 @@ import {
|
|||||||
} from "../../../graphql/Query/UsePointsModal.graphql"
|
} from "../../../graphql/Query/UsePointsModal.graphql"
|
||||||
import { request } from "../../../graphql/request"
|
import { request } from "../../../graphql/request"
|
||||||
import { contentstackBaseProcedure } from "../../../procedures"
|
import { contentstackBaseProcedure } from "../../../procedures"
|
||||||
|
import {
|
||||||
|
generateRefsResponseTag,
|
||||||
|
generateTag,
|
||||||
|
generateTagsFromSystem,
|
||||||
|
} from "../../../utils/generateTag"
|
||||||
import {
|
import {
|
||||||
type UsePointsModalData,
|
type UsePointsModalData,
|
||||||
type UsePointsModalRefsData,
|
type UsePointsModalRefsData,
|
||||||
usePointsModalRefsSchema,
|
usePointsModalRefsSchema,
|
||||||
usePointsModalSchema,
|
usePointsModalSchema,
|
||||||
} from "./output"
|
} from "./output"
|
||||||
|
import { getConnections } from "./utils"
|
||||||
|
|
||||||
export const usePointsModalQueryRouter = router({
|
export const usePointsModalQueryRouter = router({
|
||||||
get: contentstackBaseProcedure.query(async ({ ctx }) => {
|
get: contentstackBaseProcedure.query(async ({ ctx }) => {
|
||||||
const { lang, uid } = ctx
|
const { lang, uid } = ctx
|
||||||
|
|
||||||
const getRefsCounter = createCounter(
|
const getRefsCounter = createCounter(
|
||||||
"trpc.contentstack",
|
"trpc.contentstack",
|
||||||
"usePointsModal.get.refs"
|
"usePointsModal.get.refs"
|
||||||
@@ -29,11 +34,12 @@ export const usePointsModalQueryRouter = router({
|
|||||||
})
|
})
|
||||||
|
|
||||||
metricsRefs.start()
|
metricsRefs.start()
|
||||||
|
const refsTag = generateRefsResponseTag(lang, "usepointsmodal")
|
||||||
const refsResponse = await request<UsePointsModalRefsData>(
|
const refsResponse = await request<UsePointsModalRefsData>(
|
||||||
GetUsePointsModalRefs,
|
GetUsePointsModalRefs,
|
||||||
{ locale: lang },
|
{ locale: lang },
|
||||||
{
|
{
|
||||||
key: `contentstack:usePointsModal:${lang}:refs`,
|
key: refsTag,
|
||||||
ttl: "max",
|
ttl: "max",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -62,11 +68,18 @@ export const usePointsModalQueryRouter = router({
|
|||||||
})
|
})
|
||||||
metrics.start()
|
metrics.start()
|
||||||
|
|
||||||
|
const connections = getConnections(validatedRefsData.data)
|
||||||
|
|
||||||
|
const tags = [
|
||||||
|
generateTagsFromSystem(lang, connections),
|
||||||
|
generateTag(lang, "usepointsmodal"),
|
||||||
|
].flat()
|
||||||
|
|
||||||
const response = await request<UsePointsModalData>(
|
const response = await request<UsePointsModalData>(
|
||||||
GetUsePointsModal,
|
GetUsePointsModal,
|
||||||
{ locale: lang },
|
{ locale: lang },
|
||||||
{
|
{
|
||||||
key: `contentstack:usePointsModal:${lang}`,
|
key: tags,
|
||||||
ttl: "max",
|
ttl: "max",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user