feat(SW-200): refactored breadcrumbs fetching and added json schema to layout
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user