chore: add breadcrumbs to loyalty page
This commit is contained in:
@@ -1,15 +1,21 @@
|
|||||||
import { serverClient } from "@/lib/trpc/server"
|
import { serverClient } from "@/lib/trpc/server"
|
||||||
|
|
||||||
|
import { auth } from "@/auth"
|
||||||
import { Blocks } from "@/components/Loyalty/Blocks"
|
import { Blocks } from "@/components/Loyalty/Blocks"
|
||||||
import Sidebar from "@/components/Loyalty/Sidebar"
|
import Sidebar from "@/components/Loyalty/Sidebar"
|
||||||
import MaxWidth from "@/components/MaxWidth"
|
import MaxWidth from "@/components/MaxWidth"
|
||||||
|
|
||||||
|
import Breadcrumbs from "../MyPages/Breadcrumbs"
|
||||||
|
|
||||||
import styles from "./loyaltyPage.module.css"
|
import styles from "./loyaltyPage.module.css"
|
||||||
|
|
||||||
export default async function LoyaltyPage() {
|
export default async function LoyaltyPage() {
|
||||||
const loyaltyPage = await serverClient().contentstack.loyaltyPage.get()
|
const loyaltyPage = await serverClient().contentstack.loyaltyPage.get()
|
||||||
|
const session = await auth()
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className={styles.content}>
|
<section className={styles.content}>
|
||||||
|
{session && <Breadcrumbs b={true} />}
|
||||||
{loyaltyPage.sidebar.length ? (
|
{loyaltyPage.sidebar.length ? (
|
||||||
<Sidebar blocks={loyaltyPage.sidebar} />
|
<Sidebar blocks={loyaltyPage.sidebar} />
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -6,9 +6,13 @@ import BreadcrumbsWithLink from "./BreadcrumbWithLink"
|
|||||||
|
|
||||||
import styles from "./breadcrumbs.module.css"
|
import styles from "./breadcrumbs.module.css"
|
||||||
|
|
||||||
export default async function Breadcrumbs() {
|
type bool = {
|
||||||
const breadcrumbs = await serverClient().contentstack.breadcrumbs.get()
|
b?: Boolean
|
||||||
|
}
|
||||||
|
export default async function Breadcrumbs({ b = false }: bool) {
|
||||||
|
let breadcrumbs
|
||||||
|
if (!b) breadcrumbs = await serverClient().contentstack.breadcrumbs.get()
|
||||||
|
else breadcrumbs = await serverClient().contentstack.breadcrumbs.loyalty()
|
||||||
return (
|
return (
|
||||||
<nav className={styles.breadcrumbs}>
|
<nav className={styles.breadcrumbs}>
|
||||||
<ul className={styles.list}>
|
<ul className={styles.list}>
|
||||||
|
|||||||
@@ -19,3 +19,27 @@ fragment MyPagesBreadcrumbs on AccountPage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment LoyaltyBreadcrumbs on LoyaltyPage {
|
||||||
|
web {
|
||||||
|
breadcrumbss {
|
||||||
|
title
|
||||||
|
parentsConnection {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
... on AccountPage {
|
||||||
|
breadcrumbs {
|
||||||
|
title
|
||||||
|
}
|
||||||
|
system {
|
||||||
|
locale
|
||||||
|
uid
|
||||||
|
}
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,3 +18,31 @@ fragment MyPagesBreadcrumbsRefs on AccountPage {
|
|||||||
...System
|
...System
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fragment LoyaltyBreadcrumbsRefs on LoyaltyPage {
|
||||||
|
web {
|
||||||
|
breadcrumbss {
|
||||||
|
title
|
||||||
|
parentsConnection {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
... on AccountPage {
|
||||||
|
breadcrumbs {
|
||||||
|
title
|
||||||
|
}
|
||||||
|
system {
|
||||||
|
uid
|
||||||
|
locale
|
||||||
|
content_type_uid
|
||||||
|
}
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
system {
|
||||||
|
...System
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
21
lib/graphql/Query/BreadcrumbsLoyaltyPages.graphql
Normal file
21
lib/graphql/Query/BreadcrumbsLoyaltyPages.graphql
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#import "../Fragments/MyPages/Breadcrumbs.graphql"
|
||||||
|
#import "../Fragments/Refs/Breadcrumbs.graphql"
|
||||||
|
|
||||||
|
query GetLoyaltyBreadcrumbs($locale: String!, $url: String!) {
|
||||||
|
all_loyalty_page(locale: $locale, where: { url: $url }) {
|
||||||
|
items {
|
||||||
|
...LoyaltyBreadcrumbs
|
||||||
|
system {
|
||||||
|
uid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
query GetLoyaltyBreadcrumbsRefs($locale: String!, $url: String!) {
|
||||||
|
all_loyalty_page(locale: $locale, where: { url: $url }) {
|
||||||
|
items {
|
||||||
|
...LoyaltyBreadcrumbsRefs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -67,3 +67,65 @@ export const getBreadcrumbsSchema = z.array(
|
|||||||
uid: z.string(),
|
uid: z.string(),
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
export const validateBreadcrumbsRefsConstenstackSchemaLoyalty = z.object({
|
||||||
|
all_loyalty_page: z.object({
|
||||||
|
items: z.array(
|
||||||
|
z.object({
|
||||||
|
web: z.object({
|
||||||
|
breadcrumbss: z.object({
|
||||||
|
parentsConnection: z.object({
|
||||||
|
edges: z.array(
|
||||||
|
z.object({
|
||||||
|
node: z.object({
|
||||||
|
system: z.object({
|
||||||
|
content_type_uid: z.string(),
|
||||||
|
uid: z.string(),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
system: z.object({
|
||||||
|
content_type_uid: z.string(),
|
||||||
|
uid: z.string(),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
export const validateBreadcrumbsConstenstackSchemaLoyalty = z.object({
|
||||||
|
all_loyalty_page: z.object({
|
||||||
|
items: z.array(
|
||||||
|
z.object({
|
||||||
|
web: z.object({
|
||||||
|
breadcrumbss: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
parentsConnection: z.object({
|
||||||
|
edges: z.array(
|
||||||
|
z.object({
|
||||||
|
node: z.object({
|
||||||
|
breadcrumbs: z.object({
|
||||||
|
title: z.string(),
|
||||||
|
}),
|
||||||
|
system: z.object({
|
||||||
|
locale: z.nativeEnum(Lang),
|
||||||
|
uid: z.string(),
|
||||||
|
}),
|
||||||
|
url: z.string(),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
system: z.object({
|
||||||
|
uid: z.string(),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
import {
|
||||||
|
GetLoyaltyBreadcrumbs,
|
||||||
|
GetLoyaltyBreadcrumbsRefs,
|
||||||
|
} from "@/lib/graphql/Query/BreadcrumbsLoyaltyPages.graphql"
|
||||||
import {
|
import {
|
||||||
GetMyPagesBreadcrumbs,
|
GetMyPagesBreadcrumbs,
|
||||||
GetMyPagesBreadcrumbsRefs,
|
GetMyPagesBreadcrumbsRefs,
|
||||||
@@ -16,11 +20,20 @@ import { removeMultipleSlashes } from "@/utils/url"
|
|||||||
import {
|
import {
|
||||||
getBreadcrumbsSchema,
|
getBreadcrumbsSchema,
|
||||||
validateBreadcrumbsConstenstackSchema,
|
validateBreadcrumbsConstenstackSchema,
|
||||||
|
validateBreadcrumbsConstenstackSchemaLoyalty,
|
||||||
validateBreadcrumbsRefsConstenstackSchema,
|
validateBreadcrumbsRefsConstenstackSchema,
|
||||||
|
validateBreadcrumbsRefsConstenstackSchemaLoyalty,
|
||||||
} from "./output"
|
} from "./output"
|
||||||
import { affix, getConnections, homeBreadcrumbs } from "./utils"
|
import {
|
||||||
|
affix,
|
||||||
|
getConnections,
|
||||||
|
getConnectionsLoyalty,
|
||||||
|
homeBreadcrumbs,
|
||||||
|
} from "./utils"
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
|
GetLoyaltyBreadcrumbsData,
|
||||||
|
GetLoyaltyBreadcrumbsRefsData,
|
||||||
GetMyPagesBreadcrumbsData,
|
GetMyPagesBreadcrumbsData,
|
||||||
GetMyPagesBreadcrumbsRefsData,
|
GetMyPagesBreadcrumbsRefsData,
|
||||||
} from "@/types/requests/myPages/breadcrumbs"
|
} from "@/types/requests/myPages/breadcrumbs"
|
||||||
@@ -36,7 +49,8 @@ export const breadcrumbsQueryRouter = router({
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
console.log(ctx.pathname)
|
||||||
|
console.log(refsResponse.data.all_account_page)
|
||||||
if (!refsResponse.data) {
|
if (!refsResponse.data) {
|
||||||
throw notFound(refsResponse)
|
throw notFound(refsResponse)
|
||||||
}
|
}
|
||||||
@@ -46,18 +60,23 @@ export const breadcrumbsQueryRouter = router({
|
|||||||
if (!validatedRefsData.success) {
|
if (!validatedRefsData.success) {
|
||||||
throw internalServerError(validatedRefsData.error)
|
throw internalServerError(validatedRefsData.error)
|
||||||
}
|
}
|
||||||
|
console.log(validatedRefsData.data)
|
||||||
const connections = getConnections(validatedRefsData.data)
|
const connections = getConnections(validatedRefsData.data)
|
||||||
|
console.log(connections)
|
||||||
const tags = generateTags(ctx.lang, connections)
|
const tags = generateTags(ctx.lang, connections)
|
||||||
|
console.log(tags)
|
||||||
const page = validatedRefsData.data.all_account_page.items[0]
|
const page = validatedRefsData.data.all_account_page.items[0]
|
||||||
|
console.log(page)
|
||||||
|
|
||||||
tags.push(generateTag(ctx.lang, page.system.uid, affix))
|
tags.push(generateTag(ctx.lang, page.system.uid, affix))
|
||||||
|
console.log(tags)
|
||||||
|
|
||||||
const response = await request<GetMyPagesBreadcrumbsData>(
|
const response = await request<GetMyPagesBreadcrumbsData>(
|
||||||
GetMyPagesBreadcrumbs,
|
GetMyPagesBreadcrumbs,
|
||||||
{ locale: ctx.lang, url: ctx.pathname },
|
{ locale: ctx.lang, url: ctx.pathname },
|
||||||
{ next: { tags } }
|
{ next: { tags } }
|
||||||
)
|
)
|
||||||
|
console.log(response.data)
|
||||||
if (!response.data) {
|
if (!response.data) {
|
||||||
throw notFound(response)
|
throw notFound(response)
|
||||||
}
|
}
|
||||||
@@ -95,6 +114,106 @@ export const breadcrumbsQueryRouter = router({
|
|||||||
parentBreadcrumbs,
|
parentBreadcrumbs,
|
||||||
pageBreadcrumb,
|
pageBreadcrumb,
|
||||||
].flat()
|
].flat()
|
||||||
|
console.log(breadcrumbs)
|
||||||
|
|
||||||
|
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
|
||||||
|
if (!validatedBreadcrumbs.success) {
|
||||||
|
throw internalServerError(validatedBreadcrumbs.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
return validatedBreadcrumbs.data
|
||||||
|
}),
|
||||||
|
loyalty: contentstackProcedure.query(async ({ ctx }) => {
|
||||||
|
console.log("HEJ", ctx)
|
||||||
|
const refsResponse = await request<GetLoyaltyBreadcrumbsRefsData>(
|
||||||
|
GetLoyaltyBreadcrumbsRefs,
|
||||||
|
{ locale: ctx.lang, url: ctx.pathname },
|
||||||
|
{
|
||||||
|
next: {
|
||||||
|
tags: [generateRefsResponseTag(ctx.lang, ctx.pathname, affix)],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
console.log(ctx.pathname)
|
||||||
|
console.log(refsResponse.data.all_loyalty_page)
|
||||||
|
if (!refsResponse.data) {
|
||||||
|
throw notFound(refsResponse)
|
||||||
|
}
|
||||||
|
/*if (refsResponse.data.all_loyalty_page.items) {
|
||||||
|
Object.assign(
|
||||||
|
refsResponse.data.all_loyalty_page.items,
|
||||||
|
refsResponse.data.all_loyalty_page.items[0].web
|
||||||
|
)
|
||||||
|
delete refsResponse.data.all_loyalty_page.items[0].web
|
||||||
|
}*/
|
||||||
|
console.log(
|
||||||
|
refsResponse.data.all_loyalty_page.items[0].web.breadcrumbss
|
||||||
|
.parentsConnection
|
||||||
|
)
|
||||||
|
const validatedRefsData =
|
||||||
|
validateBreadcrumbsRefsConstenstackSchemaLoyalty.safeParse(
|
||||||
|
refsResponse.data
|
||||||
|
)
|
||||||
|
console.log("VALI", validatedRefsData)
|
||||||
|
if (!validatedRefsData.success) {
|
||||||
|
throw internalServerError(validatedRefsData.error)
|
||||||
|
}
|
||||||
|
console.log(
|
||||||
|
validatedRefsData.data.all_loyalty_page.items[0].web.breadcrumbss
|
||||||
|
)
|
||||||
|
const connections = getConnectionsLoyalty(validatedRefsData.data)
|
||||||
|
console.log(connections)
|
||||||
|
const tags = generateTags(ctx.lang, connections)
|
||||||
|
console.log(tags)
|
||||||
|
const page = validatedRefsData.data.all_loyalty_page.items[0]
|
||||||
|
console.log(page)
|
||||||
|
tags.push(generateTag(ctx.lang, page.system.uid, affix))
|
||||||
|
console.log(tags)
|
||||||
|
|
||||||
|
const response = await request<GetLoyaltyBreadcrumbsData>(
|
||||||
|
GetLoyaltyBreadcrumbs,
|
||||||
|
{ locale: ctx.lang, url: ctx.pathname },
|
||||||
|
{ next: { tags } }
|
||||||
|
)
|
||||||
|
console.log(response.data)
|
||||||
|
if (!response.data) {
|
||||||
|
throw notFound(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
const validatedBreadcrumbsData =
|
||||||
|
validateBreadcrumbsConstenstackSchemaLoyalty.safeParse(response.data)
|
||||||
|
console.log(validatedBreadcrumbsData)
|
||||||
|
if (!validatedBreadcrumbsData.success) {
|
||||||
|
throw internalServerError(validatedBreadcrumbsData.error)
|
||||||
|
}
|
||||||
|
|
||||||
|
const parentBreadcrumbs =
|
||||||
|
validatedBreadcrumbsData.data.all_loyalty_page.items[0].web.breadcrumbss.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.breadcrumbss.title,
|
||||||
|
uid: breadcrumb.system.uid,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const breadcrumbs = [
|
||||||
|
homeBreadcrumbs[ctx.lang],
|
||||||
|
parentBreadcrumbs,
|
||||||
|
pageBreadcrumb,
|
||||||
|
].flat()
|
||||||
|
console.log(breadcrumbs)
|
||||||
|
|
||||||
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
|
const validatedBreadcrumbs = getBreadcrumbsSchema.safeParse(breadcrumbs)
|
||||||
if (!validatedBreadcrumbs.success) {
|
if (!validatedBreadcrumbs.success) {
|
||||||
|
|||||||
@@ -1,18 +1,35 @@
|
|||||||
import { Lang } from "@/constants/languages"
|
import { Lang } from "@/constants/languages"
|
||||||
|
|
||||||
import type { GetMyPagesBreadcrumbsRefsData } from "@/types/requests/myPages/breadcrumbs"
|
import type {
|
||||||
|
GetLoyaltyBreadcrumbsRefsData,
|
||||||
|
GetMyPagesBreadcrumbsRefsData,
|
||||||
|
} from "@/types/requests/myPages/breadcrumbs"
|
||||||
import type { Edges } from "@/types/requests/utils/edges"
|
import type { Edges } from "@/types/requests/utils/edges"
|
||||||
import type { NodeRefs } from "@/types/requests/utils/refs"
|
import type { NodeRefs } from "@/types/requests/utils/refs"
|
||||||
|
|
||||||
export function getConnections(refs: GetMyPagesBreadcrumbsRefsData) {
|
export function getConnections(refs: GetMyPagesBreadcrumbsRefsData) {
|
||||||
const connections: Edges<NodeRefs>[] = []
|
const connections: Edges<NodeRefs>[] = []
|
||||||
refs.all_account_page.items.forEach((ref) => {
|
refs.all_account_page.items.forEach((ref) => {
|
||||||
|
console.log(ref)
|
||||||
|
console.log(ref.breadcrumbs.parentsConnection)
|
||||||
connections.push(ref.breadcrumbs.parentsConnection)
|
connections.push(ref.breadcrumbs.parentsConnection)
|
||||||
})
|
})
|
||||||
|
|
||||||
return connections
|
return connections
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getConnectionsLoyalty(refs: GetLoyaltyBreadcrumbsRefsData) {
|
||||||
|
const connections: Edges<NodeRefs>[] = []
|
||||||
|
refs.all_loyalty_page.items.forEach((ref) => {
|
||||||
|
console.log(ref)
|
||||||
|
console.log(ref.web.breadcrumbss)
|
||||||
|
console.log(ref.web.breadcrumbss.parentsConnection)
|
||||||
|
connections.push(ref.web.breadcrumbss.parentsConnection)
|
||||||
|
})
|
||||||
|
console.log(connections)
|
||||||
|
return connections
|
||||||
|
}
|
||||||
|
|
||||||
export const affix = "breadcrumbs"
|
export const affix = "breadcrumbs"
|
||||||
|
|
||||||
// TODO: Make these editable in CMS?
|
// TODO: Make these editable in CMS?
|
||||||
|
|||||||
@@ -22,23 +22,65 @@ interface AccountPageBreadcrumbs {
|
|||||||
uid: string
|
uid: string
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
interface LoyaltyBreadcrumbs {
|
||||||
|
web: {
|
||||||
|
breadcrumbss: {
|
||||||
|
title: string
|
||||||
|
parentsConnection: Edges<{
|
||||||
|
breadcrumbs: {
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
system: {
|
||||||
|
locale: Lang
|
||||||
|
uid: string
|
||||||
|
}
|
||||||
|
url: string
|
||||||
|
}>
|
||||||
|
}
|
||||||
|
system: {
|
||||||
|
uid: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface AllAccountPageResponse
|
interface AllAccountPageResponse
|
||||||
extends AllRequestResponse<AccountPageBreadcrumbs> {}
|
extends AllRequestResponse<AccountPageBreadcrumbs> {}
|
||||||
|
|
||||||
|
interface AllLoyaltyPageResponse
|
||||||
|
extends AllRequestResponse<LoyaltyBreadcrumbs> {}
|
||||||
|
|
||||||
export interface GetMyPagesBreadcrumbsData {
|
export interface GetMyPagesBreadcrumbsData {
|
||||||
all_account_page: AllAccountPageResponse
|
all_account_page: AllAccountPageResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface GetLoyaltyBreadcrumbsData {
|
||||||
|
all_loyalty_page: AllLoyaltyPageResponse
|
||||||
|
}
|
||||||
|
|
||||||
interface AccountPageBreadcrumbRefs extends System {
|
interface AccountPageBreadcrumbRefs extends System {
|
||||||
breadcrumbs: {
|
breadcrumbs: {
|
||||||
parentsConnection: Edges<System>
|
parentsConnection: Edges<System>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface LoyaltyBreadcrumbRefs extends System {
|
||||||
|
web: {
|
||||||
|
breadcrumbss: {
|
||||||
|
parentsConnection: Edges<System>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface AllAccountPageRefsResponse
|
interface AllAccountPageRefsResponse
|
||||||
extends AllRequestResponse<AccountPageBreadcrumbRefs> {}
|
extends AllRequestResponse<AccountPageBreadcrumbRefs> {}
|
||||||
|
|
||||||
|
interface AllLoyaltyPageRefsResponse
|
||||||
|
extends AllRequestResponse<LoyaltyBreadcrumbRefs> {}
|
||||||
|
|
||||||
export interface GetMyPagesBreadcrumbsRefsData {
|
export interface GetMyPagesBreadcrumbsRefsData {
|
||||||
all_account_page: AllAccountPageRefsResponse
|
all_account_page: AllAccountPageRefsResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface GetLoyaltyBreadcrumbsRefsData {
|
||||||
|
all_loyalty_page: AllLoyaltyPageRefsResponse
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user