feat(SW-200): refactored breadcrumbs fetching and added json schema to layout

This commit is contained in:
Erik Tiekstra
2024-11-14 13:18:35 +01:00
parent 28738d7161
commit b22888db5f
13 changed files with 318 additions and 379 deletions
@@ -1,33 +1,22 @@
import { Lang } from "@/constants/languages"
import { request } from "@/lib/graphql/request"
import { internalServerError, notFound } from "@/server/errors/trpc"
import {
generateRefsResponseTag,
generateTag,
generateTags,
} from "@/utils/generateTag"
import { removeMultipleSlashes } from "@/utils/url"
import { type BreadcrumbsRefs, getBreadcrumbsSchema, Page } from "./output"
import { generateTag, generateTags } from "@/utils/generateTag"
import type { Edges } from "@/types/requests/utils/edges"
import type { NodeRefs } from "@/types/requests/utils/refs"
import { BreadcrumbsRefsSchema } from "@/types/trpc/routers/contentstack/breadcrumbs"
export function getConnections(refs: BreadcrumbsRefs) {
const connections: Edges<NodeRefs>[] = []
if (refs.web?.breadcrumbs) {
connections.push(refs.web.breadcrumbs.parentsConnection)
}
return connections
export type Variables = {
lang: Lang
uid: string
}
export const affix = "breadcrumbs"
// TODO: Make these editable in CMS?
export const homeBreadcrumbs = {
export const homeBreadcrumbs: {
[key in keyof typeof Lang]: { href: string; title: string; uid: string }
} = {
[Lang.da]: {
href: "/da",
title: "Hjem",
@@ -60,76 +49,19 @@ export const homeBreadcrumbs = {
},
}
export type Variables = {
locale: Lang
uid: string
}
export function getConnections(data: BreadcrumbsRefsSchema) {
const connections: Edges<NodeRefs>[] = []
export async function getRefsResponse<T>(query: string, variables: Variables) {
const refsResponse = await request<T>(query, variables, {
cache: "force-cache",
next: {
tags: [generateRefsResponseTag(variables.locale, variables.uid, affix)],
},
})
if (!refsResponse.data) {
throw notFound(refsResponse)
if (data.web?.breadcrumbs) {
connections.push(data.web.breadcrumbs.parentsConnection)
}
return refsResponse
return connections
}
export function getTags(page: BreadcrumbsRefs, variables: Variables) {
const connections = getConnections(page)
const tags = generateTags(variables.locale, connections)
tags.push(generateTag(variables.locale, page.system.uid, affix))
export function getTags(data: BreadcrumbsRefsSchema, lang: Lang) {
const connections = getConnections(data)
const tags = generateTags(lang, connections)
tags.push(generateTag(lang, data.system.uid, affix))
return tags
}
export async function getResponse<T>(
query: string,
variables: Variables,
tags: string[]
) {
const response = await request<T>(query, variables, {
cache: "force-cache",
next: { tags },
})
if (!response.data) {
throw notFound(response)
}
return response
}
export function getBreadcrumbs(page: Page, lang: Lang) {
const parentBreadcrumbs = page.web.breadcrumbs.parentsConnection.edges.map(
(breadcrumb) => {
return {
href: removeMultipleSlashes(
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
),
title: breadcrumb.node.web.breadcrumbs.title,
uid: breadcrumb.node.system.uid,
}
}
)
const pageBreadcrumb = {
title: page.web.breadcrumbs.title,
uid: page.system.uid,
}
const breadcrumbs = [
homeBreadcrumbs[lang],
parentBreadcrumbs,
pageBreadcrumb,
].flat()
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
if (!validatedBreadcrumbs.success) {
throw internalServerError(validatedBreadcrumbs.error)
}
return validatedBreadcrumbs.data
}