refactor: move contentype to header
This commit is contained in:
@@ -1,5 +1,4 @@
|
|||||||
import { serverClient } from "@/lib/trpc/server"
|
import { serverClient } from "@/lib/trpc/server"
|
||||||
import { PageTypes } from "@/server/routers/contentstack/breadcrumbs/input"
|
|
||||||
|
|
||||||
import { auth } from "@/auth"
|
import { auth } from "@/auth"
|
||||||
import { Blocks } from "@/components/Loyalty/Blocks"
|
import { Blocks } from "@/components/Loyalty/Blocks"
|
||||||
@@ -19,7 +18,7 @@ export default async function LoyaltyPage({ lang }: LangParams) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Breadcrumbs pageType={PageTypes.Loyalty} />
|
<Breadcrumbs />
|
||||||
<section className={styles.content}>
|
<section className={styles.content}>
|
||||||
{session ? (
|
{session ? (
|
||||||
<Sidebar lang={lang} />
|
<Sidebar lang={lang} />
|
||||||
|
|||||||
@@ -1,23 +1,13 @@
|
|||||||
import { _ } from "@/lib/translation"
|
import { _ } from "@/lib/translation"
|
||||||
import { serverClient } from "@/lib/trpc/server"
|
import { serverClient } from "@/lib/trpc/server"
|
||||||
import { PageTypes } from "@/server/routers/contentstack/breadcrumbs/input"
|
|
||||||
|
|
||||||
import Breadcrumb from "./Breadcrumb"
|
import Breadcrumb from "./Breadcrumb"
|
||||||
import BreadcrumbsWithLink from "./BreadcrumbWithLink"
|
import BreadcrumbsWithLink from "./BreadcrumbWithLink"
|
||||||
|
|
||||||
import styles from "./breadcrumbs.module.css"
|
import styles from "./breadcrumbs.module.css"
|
||||||
|
|
||||||
import { BreadcrumbsProps } from "@/types/components/myPages/breadcrumbs"
|
export default async function Breadcrumbs() {
|
||||||
|
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get()
|
||||||
export default async function Breadcrumbs({
|
|
||||||
pageType = PageTypes.Account,
|
|
||||||
}: BreadcrumbsProps) {
|
|
||||||
let breadcrumbs
|
|
||||||
if (pageType == PageTypes.Account) {
|
|
||||||
breadcrumbs = await serverClient().contentstack.breadcrumbs.getMyPages()
|
|
||||||
} else {
|
|
||||||
breadcrumbs = await serverClient().contentstack.breadcrumbs.getLoyaltyPage()
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
<nav className={styles.breadcrumbs}>
|
<nav className={styles.breadcrumbs}>
|
||||||
<ul className={styles.list}>
|
<ul className={styles.list}>
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ export const middleware: NextMiddleware = async (request) => {
|
|||||||
`Unable to resolve CMS entry for locale "${lang}": ${pathNameWithoutLang}`
|
`Unable to resolve CMS entry for locale "${lang}": ${pathNameWithoutLang}`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const headers = getDefaultRequestHeaders(request)
|
const headers = getDefaultRequestHeaders(request)
|
||||||
headers.set("x-uid", uid)
|
headers.set("x-uid", uid)
|
||||||
|
headers.set("x-contenttype", contentType)
|
||||||
|
|
||||||
const isCurrent = contentType ? contentType.indexOf("current") >= 0 : false
|
const isCurrent = contentType ? contentType.indexOf("current") >= 0 : false
|
||||||
|
|
||||||
|
|||||||
@@ -33,8 +33,7 @@ export const middleware: NextMiddleware = async (request) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const pathNameWithoutLang = nextUrl.pathname.replace(`/${lang}`, "")
|
const pathNameWithoutLang = nextUrl.pathname.replace(`/${lang}`, "")
|
||||||
const { uid } = await resolveEntry(pathNameWithoutLang, lang)
|
const { uid, contentType } = await resolveEntry(pathNameWithoutLang, lang)
|
||||||
|
|
||||||
if (!uid) {
|
if (!uid) {
|
||||||
throw notFound(
|
throw notFound(
|
||||||
`Unable to resolve CMS entry for locale "${lang}": ${pathNameWithoutLang}`
|
`Unable to resolve CMS entry for locale "${lang}": ${pathNameWithoutLang}`
|
||||||
@@ -43,6 +42,7 @@ export const middleware: NextMiddleware = async (request) => {
|
|||||||
|
|
||||||
const headers = getDefaultRequestHeaders(request)
|
const headers = getDefaultRequestHeaders(request)
|
||||||
headers.set("x-uid", uid)
|
headers.set("x-uid", uid)
|
||||||
|
headers.set("x-contenttype", contentType)
|
||||||
return NextResponse.next({
|
return NextResponse.next({
|
||||||
request: {
|
request: {
|
||||||
headers,
|
headers,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ type CreateContextOptions = {
|
|||||||
uid?: string | null
|
uid?: string | null
|
||||||
url: string
|
url: string
|
||||||
webToken?: string
|
webToken?: string
|
||||||
|
contentType?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Use this helper for:
|
/** Use this helper for:
|
||||||
@@ -30,6 +31,7 @@ export function createContextInner(opts: CreateContextOptions) {
|
|||||||
uid: opts.uid,
|
uid: opts.uid,
|
||||||
url: opts.url,
|
url: opts.url,
|
||||||
webToken: opts.webToken,
|
webToken: opts.webToken,
|
||||||
|
contentType: opts.contentType,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,6 +60,7 @@ export function createContext() {
|
|||||||
uid: h.get("x-uid"),
|
uid: h.get("x-uid"),
|
||||||
url: h.get("x-url")!,
|
url: h.get("x-url")!,
|
||||||
webToken: webviewTokenCookie?.value,
|
webToken: webviewTokenCookie?.value,
|
||||||
|
contentType: h.get("x-contenttype")!,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
import { z } from "zod"
|
|
||||||
|
|
||||||
export enum PageTypes {
|
|
||||||
Account,
|
|
||||||
Loyalty,
|
|
||||||
}
|
|
||||||
|
|
||||||
export const PageTypeEnum = z
|
|
||||||
.object({
|
|
||||||
pageType: z.nativeEnum(PageTypes),
|
|
||||||
})
|
|
||||||
.default({ pageType: PageTypes.Account })
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { Lang } from "@/constants/languages"
|
||||||
import {
|
import {
|
||||||
GetLoyaltyPageBreadcrumbs,
|
GetLoyaltyPageBreadcrumbs,
|
||||||
GetLoyaltyPageBreadcrumbsRefs,
|
GetLoyaltyPageBreadcrumbsRefs,
|
||||||
@@ -32,150 +33,168 @@ import type {
|
|||||||
GetMyPagesBreadcrumbsData,
|
GetMyPagesBreadcrumbsData,
|
||||||
GetMyPagesBreadcrumbsRefsData,
|
GetMyPagesBreadcrumbsRefsData,
|
||||||
} from "@/types/requests/myPages/breadcrumbs"
|
} from "@/types/requests/myPages/breadcrumbs"
|
||||||
|
import { PageTypeEnum } from "@/types/requests/pageType"
|
||||||
|
|
||||||
|
type fetchBreadcrumbs = {
|
||||||
|
lang: Lang
|
||||||
|
pathname: string
|
||||||
|
}
|
||||||
|
async function getLoyaltyPageBreadcrumbs({ lang, pathname }: fetchBreadcrumbs) {
|
||||||
|
const refsResponse = await request<GetLoyaltyPageBreadcrumbsRefsData>(
|
||||||
|
GetLoyaltyPageBreadcrumbsRefs,
|
||||||
|
{ locale: lang, url: pathname },
|
||||||
|
{
|
||||||
|
next: {
|
||||||
|
tags: [generateRefsResponseTag(lang, pathname, affix)],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (!refsResponse.data) {
|
||||||
|
throw notFound(refsResponse)
|
||||||
|
}
|
||||||
|
|
||||||
|
const validatedRefsData =
|
||||||
|
validateLoyaltyPageBreadcrumbsRefsContentstackSchema.safeParse(
|
||||||
|
refsResponse.data
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!validatedRefsData.success) {
|
||||||
|
throw internalServerError(validatedRefsData.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const connections = getConnections(validatedRefsData.data.all_loyalty_page)
|
||||||
|
const tags = generateTags(lang, connections)
|
||||||
|
const page = validatedRefsData.data.all_loyalty_page.items[0]
|
||||||
|
tags.push(generateTag(lang, page.system.uid, affix))
|
||||||
|
|
||||||
|
const response = await request<GetLoyaltyPageBreadcrumbsData>(
|
||||||
|
GetLoyaltyPageBreadcrumbs,
|
||||||
|
{ locale: lang, url: pathname },
|
||||||
|
{ next: { tags } }
|
||||||
|
)
|
||||||
|
if (!response.data) {
|
||||||
|
throw notFound(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const validatedBreadcrumbsData =
|
||||||
|
validateLoyaltyPageBreadcrumbsContentstackSchema.safeParse(response.data)
|
||||||
|
|
||||||
|
if (!validatedBreadcrumbsData.success) {
|
||||||
|
throw internalServerError(validatedBreadcrumbsData.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const parentBreadcrumbs =
|
||||||
|
validatedBreadcrumbsData.data.all_loyalty_page.items[0].web.breadcrumbs.parentsConnection.edges.map(
|
||||||
|
(breadcrumb) => {
|
||||||
|
return {
|
||||||
|
href: removeMultipleSlashes(
|
||||||
|
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
|
||||||
|
),
|
||||||
|
title: breadcrumb.node.breadcrumbs.title,
|
||||||
|
uid: breadcrumb.node.system.uid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const pageBreadcrumb =
|
||||||
|
validatedBreadcrumbsData.data.all_loyalty_page.items.map((breadcrumb) => {
|
||||||
|
return {
|
||||||
|
title: breadcrumb.web.breadcrumbs.title,
|
||||||
|
uid: breadcrumb.system.uid,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return [pageBreadcrumb, parentBreadcrumbs]
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getMyPagesBreadcrumbs({ lang, pathname }: fetchBreadcrumbs) {
|
||||||
|
const refsResponse = await request<GetMyPagesBreadcrumbsRefsData>(
|
||||||
|
GetMyPagesBreadcrumbsRefs,
|
||||||
|
{ locale: lang, url: pathname },
|
||||||
|
{
|
||||||
|
next: {
|
||||||
|
tags: [generateRefsResponseTag(lang, pathname, affix)],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if (!refsResponse.data) {
|
||||||
|
throw notFound(refsResponse)
|
||||||
|
}
|
||||||
|
|
||||||
|
const validatedRefsData =
|
||||||
|
validateMyPagesBreadcrumbsRefsContentstackSchema.safeParse(
|
||||||
|
refsResponse.data
|
||||||
|
)
|
||||||
|
if (!validatedRefsData.success) {
|
||||||
|
throw internalServerError(validatedRefsData.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const connections = getConnections(validatedRefsData.data.all_account_page)
|
||||||
|
const tags = generateTags(lang, connections)
|
||||||
|
const page = validatedRefsData.data.all_account_page.items[0]
|
||||||
|
tags.push(generateTag(lang, page.system.uid, affix))
|
||||||
|
|
||||||
|
const response = await request<GetMyPagesBreadcrumbsData>(
|
||||||
|
GetMyPagesBreadcrumbs,
|
||||||
|
{ locale: lang, url: pathname },
|
||||||
|
{ next: { tags } }
|
||||||
|
)
|
||||||
|
if (!response.data) {
|
||||||
|
throw notFound(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const validatedBreadcrumbsData =
|
||||||
|
validateMyPagesBreadcrumbsContentstackSchema.safeParse(response.data)
|
||||||
|
|
||||||
|
if (!validatedBreadcrumbsData.success) {
|
||||||
|
throw internalServerError(validatedBreadcrumbsData.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const parentBreadcrumbs =
|
||||||
|
validatedBreadcrumbsData.data.all_account_page.items[0].web.breadcrumbs.parentsConnection.edges.map(
|
||||||
|
(breadcrumb) => {
|
||||||
|
return {
|
||||||
|
href: removeMultipleSlashes(
|
||||||
|
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
|
||||||
|
),
|
||||||
|
title: breadcrumb.node.breadcrumbs.title,
|
||||||
|
uid: breadcrumb.node.system.uid,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const pageBreadcrumb =
|
||||||
|
validatedBreadcrumbsData.data.all_account_page.items.map((breadcrumb) => {
|
||||||
|
return {
|
||||||
|
title: breadcrumb.web.breadcrumbs.title,
|
||||||
|
uid: breadcrumb.system.uid,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return [pageBreadcrumb, parentBreadcrumbs]
|
||||||
|
}
|
||||||
|
|
||||||
export const breadcrumbsQueryRouter = router({
|
export const breadcrumbsQueryRouter = router({
|
||||||
getMyPages: contentstackProcedure.query(async ({ ctx }) => {
|
get: contentstackProcedure.query(async ({ ctx }) => {
|
||||||
const refsResponse = await request<GetMyPagesBreadcrumbsRefsData>(
|
let pageBreadcrumb, parentBreadcrumbs
|
||||||
GetMyPagesBreadcrumbsRefs,
|
|
||||||
{ locale: ctx.lang, url: ctx.pathname },
|
switch (ctx.contentType) {
|
||||||
{
|
case PageTypeEnum.accountPage:
|
||||||
next: {
|
;[pageBreadcrumb, parentBreadcrumbs] = await getMyPagesBreadcrumbs({
|
||||||
tags: [generateRefsResponseTag(ctx.lang, ctx.pathname, affix)],
|
lang: ctx.lang,
|
||||||
},
|
pathname: ctx.pathname,
|
||||||
}
|
})
|
||||||
)
|
break
|
||||||
if (!refsResponse.data) {
|
case PageTypeEnum.loyaltyPage:
|
||||||
throw notFound(refsResponse)
|
;[pageBreadcrumb, parentBreadcrumbs] = await getLoyaltyPageBreadcrumbs({
|
||||||
|
lang: ctx.lang,
|
||||||
|
pathname: ctx.pathname,
|
||||||
|
})
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
const validatedRefsData =
|
|
||||||
validateMyPagesBreadcrumbsRefsContentstackSchema.safeParse(
|
|
||||||
refsResponse.data
|
|
||||||
)
|
|
||||||
if (!validatedRefsData.success) {
|
|
||||||
throw internalServerError(validatedRefsData.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
const connections = getConnections(validatedRefsData.data.all_account_page)
|
|
||||||
const tags = generateTags(ctx.lang, connections)
|
|
||||||
const page = validatedRefsData.data.all_account_page.items[0]
|
|
||||||
tags.push(generateTag(ctx.lang, page.system.uid, affix))
|
|
||||||
|
|
||||||
const response = await request<GetMyPagesBreadcrumbsData>(
|
|
||||||
GetMyPagesBreadcrumbs,
|
|
||||||
{ locale: ctx.lang, url: ctx.pathname },
|
|
||||||
{ next: { tags } }
|
|
||||||
)
|
|
||||||
if (!response.data) {
|
|
||||||
throw notFound(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const validatedBreadcrumbsData =
|
|
||||||
validateMyPagesBreadcrumbsContentstackSchema.safeParse(response.data)
|
|
||||||
|
|
||||||
if (!validatedBreadcrumbsData.success) {
|
|
||||||
throw internalServerError(validatedBreadcrumbsData.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
const parentBreadcrumbs =
|
|
||||||
validatedBreadcrumbsData.data.all_account_page.items[0].web.breadcrumbs.parentsConnection.edges.map(
|
|
||||||
(breadcrumb) => {
|
|
||||||
return {
|
|
||||||
href: removeMultipleSlashes(
|
|
||||||
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
|
|
||||||
),
|
|
||||||
title: breadcrumb.node.breadcrumbs.title,
|
|
||||||
uid: breadcrumb.node.system.uid,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const pageBreadcrumb =
|
|
||||||
validatedBreadcrumbsData.data.all_account_page.items.map((breadcrumb) => {
|
|
||||||
return {
|
|
||||||
title: breadcrumb.web.breadcrumbs.title,
|
|
||||||
uid: breadcrumb.system.uid,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const breadcrumbs = [
|
|
||||||
homeBreadcrumbs[ctx.lang],
|
|
||||||
parentBreadcrumbs,
|
|
||||||
pageBreadcrumb,
|
|
||||||
].flat()
|
|
||||||
|
|
||||||
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
|
|
||||||
if (!validatedBreadcrumbs.success) {
|
|
||||||
throw internalServerError(validatedBreadcrumbs.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
return validatedBreadcrumbs.data
|
|
||||||
}),
|
|
||||||
getLoyaltyPage: contentstackProcedure.query(async ({ ctx }) => {
|
|
||||||
const refsResponse = await request<GetLoyaltyPageBreadcrumbsRefsData>(
|
|
||||||
GetLoyaltyPageBreadcrumbsRefs,
|
|
||||||
{ locale: ctx.lang, url: ctx.pathname },
|
|
||||||
{
|
|
||||||
next: {
|
|
||||||
tags: [generateRefsResponseTag(ctx.lang, ctx.pathname, affix)],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
if (!refsResponse.data) {
|
|
||||||
throw notFound(refsResponse)
|
|
||||||
}
|
|
||||||
|
|
||||||
const validatedRefsData =
|
|
||||||
validateLoyaltyPageBreadcrumbsRefsContentstackSchema.safeParse(
|
|
||||||
refsResponse.data
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!validatedRefsData.success) {
|
|
||||||
throw internalServerError(validatedRefsData.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
const connections = getConnections(validatedRefsData.data.all_loyalty_page)
|
|
||||||
const tags = generateTags(ctx.lang, connections)
|
|
||||||
const page = validatedRefsData.data.all_loyalty_page.items[0]
|
|
||||||
tags.push(generateTag(ctx.lang, page.system.uid, affix))
|
|
||||||
|
|
||||||
const response = await request<GetLoyaltyPageBreadcrumbsData>(
|
|
||||||
GetLoyaltyPageBreadcrumbs,
|
|
||||||
{ locale: ctx.lang, url: ctx.pathname },
|
|
||||||
{ next: { tags } }
|
|
||||||
)
|
|
||||||
if (!response.data) {
|
|
||||||
throw notFound(response)
|
|
||||||
}
|
|
||||||
|
|
||||||
const validatedBreadcrumbsData =
|
|
||||||
validateLoyaltyPageBreadcrumbsContentstackSchema.safeParse(response.data)
|
|
||||||
|
|
||||||
if (!validatedBreadcrumbsData.success) {
|
|
||||||
throw internalServerError(validatedBreadcrumbsData.error)
|
|
||||||
}
|
|
||||||
|
|
||||||
const parentBreadcrumbs =
|
|
||||||
validatedBreadcrumbsData.data.all_loyalty_page.items[0].web.breadcrumbs.parentsConnection.edges.map(
|
|
||||||
(breadcrumb) => {
|
|
||||||
return {
|
|
||||||
href: removeMultipleSlashes(
|
|
||||||
`/${breadcrumb.node.system.locale}/${breadcrumb.node.url}`
|
|
||||||
),
|
|
||||||
title: breadcrumb.node.breadcrumbs.title,
|
|
||||||
uid: breadcrumb.node.system.uid,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
const pageBreadcrumb =
|
|
||||||
validatedBreadcrumbsData.data.all_loyalty_page.items.map((breadcrumb) => {
|
|
||||||
return {
|
|
||||||
title: breadcrumb.web.breadcrumbs.title,
|
|
||||||
uid: breadcrumb.system.uid,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const breadcrumbs = [
|
const breadcrumbs = [
|
||||||
homeBreadcrumbs[ctx.lang],
|
homeBreadcrumbs[ctx.lang],
|
||||||
parentBreadcrumbs,
|
parentBreadcrumbs,
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
import { PageTypes } from "@/server/routers/contentstack/breadcrumbs/input"
|
|
||||||
|
|
||||||
export type BreadcrumbsProps = {
|
|
||||||
pageType?: PageTypes
|
|
||||||
}
|
|
||||||
4
types/requests/pageType.ts
Normal file
4
types/requests/pageType.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export enum PageTypeEnum {
|
||||||
|
accountPage = "account-page",
|
||||||
|
loyaltyPage = "loyalty-page",
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user