feat(SW-66, SW-348): search functionality and ui
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { z } from "zod"
|
||||
|
||||
import { Lang } from "@/constants/languages"
|
||||
import { systemSchema } from "../schemas/system"
|
||||
|
||||
export const getBreadcrumbsSchema = z.array(
|
||||
z.object({
|
||||
@@ -10,42 +10,32 @@ export const getBreadcrumbsSchema = z.array(
|
||||
})
|
||||
)
|
||||
|
||||
const breadcrumbsRefsItems = z.object({
|
||||
items: z.array(
|
||||
z.object({
|
||||
web: z
|
||||
const breadcrumbsRefs = z.object({
|
||||
web: z
|
||||
.object({
|
||||
breadcrumbs: z
|
||||
.object({
|
||||
breadcrumbs: z
|
||||
.object({
|
||||
title: z.string(),
|
||||
parentsConnection: z.object({
|
||||
edges: z.array(
|
||||
z.object({
|
||||
node: z.object({
|
||||
system: z.object({
|
||||
content_type_uid: z.string(),
|
||||
uid: z.string(),
|
||||
}),
|
||||
}),
|
||||
})
|
||||
),
|
||||
}),
|
||||
})
|
||||
.optional(),
|
||||
title: z.string(),
|
||||
parentsConnection: z.object({
|
||||
edges: z.array(
|
||||
z.object({
|
||||
node: z.object({
|
||||
system: systemSchema,
|
||||
}),
|
||||
})
|
||||
),
|
||||
}),
|
||||
})
|
||||
.optional(),
|
||||
system: z.object({
|
||||
content_type_uid: z.string(),
|
||||
uid: z.string(),
|
||||
}),
|
||||
})
|
||||
),
|
||||
.optional(),
|
||||
system: systemSchema,
|
||||
})
|
||||
|
||||
export type BreadcrumbsRefsItems = z.infer<typeof breadcrumbsRefsItems>
|
||||
export type BreadcrumbsRefs = z.infer<typeof breadcrumbsRefs>
|
||||
|
||||
export const validateMyPagesBreadcrumbsRefsContentstackSchema = z.object({
|
||||
all_account_page: breadcrumbsRefsItems,
|
||||
account_page: breadcrumbsRefs,
|
||||
})
|
||||
|
||||
export type GetMyPagesBreadcrumbsRefsData = z.infer<
|
||||
@@ -53,7 +43,7 @@ export type GetMyPagesBreadcrumbsRefsData = z.infer<
|
||||
>
|
||||
|
||||
export const validateLoyaltyPageBreadcrumbsRefsContentstackSchema = z.object({
|
||||
all_loyalty_page: breadcrumbsRefsItems,
|
||||
loyalty_page: breadcrumbsRefs,
|
||||
})
|
||||
|
||||
export type GetLoyaltyPageBreadcrumbsRefsData = z.infer<
|
||||
@@ -61,7 +51,7 @@ export type GetLoyaltyPageBreadcrumbsRefsData = z.infer<
|
||||
>
|
||||
|
||||
export const validateContentPageBreadcrumbsRefsContentstackSchema = z.object({
|
||||
all_content_page: breadcrumbsRefsItems,
|
||||
content_page: breadcrumbsRefs,
|
||||
})
|
||||
|
||||
export type GetContentPageBreadcrumbsRefsData = z.infer<
|
||||
@@ -81,10 +71,7 @@ const page = z.object({
|
||||
title: z.string(),
|
||||
}),
|
||||
}),
|
||||
system: z.object({
|
||||
locale: z.nativeEnum(Lang),
|
||||
uid: z.string(),
|
||||
}),
|
||||
system: systemSchema,
|
||||
url: z.string(),
|
||||
}),
|
||||
})
|
||||
@@ -92,19 +79,13 @@ const page = z.object({
|
||||
}),
|
||||
}),
|
||||
}),
|
||||
system: z.object({
|
||||
uid: z.string(),
|
||||
}),
|
||||
system: systemSchema,
|
||||
})
|
||||
|
||||
export type Page = z.infer<typeof page>
|
||||
|
||||
const breadcrumbsItems = z.object({
|
||||
items: z.array(page),
|
||||
})
|
||||
|
||||
export const validateMyPagesBreadcrumbsContentstackSchema = z.object({
|
||||
all_account_page: breadcrumbsItems,
|
||||
account_page: page,
|
||||
})
|
||||
|
||||
export type GetMyPagesBreadcrumbsData = z.infer<
|
||||
@@ -112,7 +93,7 @@ export type GetMyPagesBreadcrumbsData = z.infer<
|
||||
>
|
||||
|
||||
export const validateLoyaltyPageBreadcrumbsContentstackSchema = z.object({
|
||||
all_loyalty_page: breadcrumbsItems,
|
||||
loyalty_page: page,
|
||||
})
|
||||
|
||||
export type GetLoyaltyPageBreadcrumbsData = z.infer<
|
||||
@@ -120,7 +101,7 @@ export type GetLoyaltyPageBreadcrumbsData = z.infer<
|
||||
>
|
||||
|
||||
export const validateContentPageBreadcrumbsContentstackSchema = z.object({
|
||||
all_content_page: breadcrumbsItems,
|
||||
content_page: page,
|
||||
})
|
||||
|
||||
export type GetContentPageBreadcrumbsData = z.infer<
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import {
|
||||
GetContentPageBreadcrumbs,
|
||||
GetContentPageBreadcrumbsRefs,
|
||||
} from "@/lib/graphql/Query/BreadcrumbsContentPage.graphql"
|
||||
import {
|
||||
GetLoyaltyPageBreadcrumbs,
|
||||
GetLoyaltyPageBreadcrumbsRefs,
|
||||
} from "@/lib/graphql/Query/BreadcrumbsLoyaltyPage.graphql"
|
||||
import {
|
||||
GetMyPagesBreadcrumbs,
|
||||
GetMyPagesBreadcrumbsRefs,
|
||||
} from "@/lib/graphql/Query/BreadcrumbsMyPages.graphql"
|
||||
} from "@/lib/graphql/Query/Breadcrumbs/AccountPage.graphql"
|
||||
import {
|
||||
GetContentPageBreadcrumbs,
|
||||
GetContentPageBreadcrumbsRefs,
|
||||
} from "@/lib/graphql/Query/Breadcrumbs/ContentPage.graphql"
|
||||
import {
|
||||
GetLoyaltyPageBreadcrumbs,
|
||||
GetLoyaltyPageBreadcrumbsRefs,
|
||||
} from "@/lib/graphql/Query/Breadcrumbs/LoyaltyPage.graphql"
|
||||
import { contentstackExtendedProcedureUID, router } from "@/server/trpc"
|
||||
|
||||
import {
|
||||
@@ -49,13 +49,13 @@ async function getLoyaltyPageBreadcrumbs(variables: Variables) {
|
||||
|
||||
if (!validatedRefsData.success) {
|
||||
console.error(
|
||||
`Failed to validate Loyaltypage Breadcrumbs Refs - (url: ${variables.url})`
|
||||
`Failed to validate Loyaltypage Breadcrumbs Refs - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedRefsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
const tags = getTags(validatedRefsData.data.all_loyalty_page, variables)
|
||||
const tags = getTags(validatedRefsData.data.loyalty_page, variables)
|
||||
|
||||
const response = await getResponse<GetLoyaltyPageBreadcrumbsData>(
|
||||
GetLoyaltyPageBreadcrumbs,
|
||||
@@ -63,7 +63,7 @@ async function getLoyaltyPageBreadcrumbs(variables: Variables) {
|
||||
tags
|
||||
)
|
||||
|
||||
if (!response.data.all_loyalty_page.items[0].web?.breadcrumbs?.title) {
|
||||
if (!response.data.loyalty_page.web?.breadcrumbs?.title) {
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -72,14 +72,14 @@ async function getLoyaltyPageBreadcrumbs(variables: Variables) {
|
||||
|
||||
if (!validatedBreadcrumbsData.success) {
|
||||
console.error(
|
||||
`Failed to validate Loyaltypage Breadcrumbs Data - (url: ${variables.url})`
|
||||
`Failed to validate Loyaltypage Breadcrumbs Data - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedBreadcrumbsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
return getBreadcrumbs(
|
||||
validatedBreadcrumbsData.data.all_loyalty_page.items[0],
|
||||
validatedBreadcrumbsData.data.loyalty_page,
|
||||
variables.locale
|
||||
)
|
||||
}
|
||||
@@ -97,13 +97,13 @@ async function getContentPageBreadcrumbs(variables: Variables) {
|
||||
|
||||
if (!validatedRefsData.success) {
|
||||
console.error(
|
||||
`Failed to validate Contentpage Breadcrumbs Refs - (url: ${variables.url})`
|
||||
`Failed to validate Contentpage Breadcrumbs Refs - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedRefsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
const tags = getTags(validatedRefsData.data.all_content_page, variables)
|
||||
const tags = getTags(validatedRefsData.data.content_page, variables)
|
||||
|
||||
const response = await getResponse<GetContentPageBreadcrumbsData>(
|
||||
GetContentPageBreadcrumbs,
|
||||
@@ -111,7 +111,7 @@ async function getContentPageBreadcrumbs(variables: Variables) {
|
||||
tags
|
||||
)
|
||||
|
||||
if (!response.data.all_content_page.items[0].web?.breadcrumbs?.title) {
|
||||
if (!response.data.content_page.web?.breadcrumbs?.title) {
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -120,14 +120,14 @@ async function getContentPageBreadcrumbs(variables: Variables) {
|
||||
|
||||
if (!validatedBreadcrumbsData.success) {
|
||||
console.error(
|
||||
`Failed to validate Contentpage Breadcrumbs Data - (url: ${variables.url})`
|
||||
`Failed to validate Contentpage Breadcrumbs Data - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedBreadcrumbsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
return getBreadcrumbs(
|
||||
validatedBreadcrumbsData.data.all_content_page.items[0],
|
||||
validatedBreadcrumbsData.data.content_page,
|
||||
variables.locale
|
||||
)
|
||||
}
|
||||
@@ -144,13 +144,13 @@ async function getMyPagesBreadcrumbs(variables: Variables) {
|
||||
)
|
||||
if (!validatedRefsData.success) {
|
||||
console.error(
|
||||
`Failed to validate My Page Breadcrumbs Refs - (url: ${variables.url})`
|
||||
`Failed to validate My Page Breadcrumbs Refs - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedRefsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
const tags = getTags(validatedRefsData.data.all_account_page, variables)
|
||||
const tags = getTags(validatedRefsData.data.account_page, variables)
|
||||
|
||||
const response = await getResponse<GetMyPagesBreadcrumbsData>(
|
||||
GetMyPagesBreadcrumbs,
|
||||
@@ -158,7 +158,7 @@ async function getMyPagesBreadcrumbs(variables: Variables) {
|
||||
tags
|
||||
)
|
||||
|
||||
if (!response.data.all_account_page.items[0].web?.breadcrumbs?.title) {
|
||||
if (!response.data.account_page.web?.breadcrumbs?.title) {
|
||||
return []
|
||||
}
|
||||
|
||||
@@ -167,14 +167,14 @@ async function getMyPagesBreadcrumbs(variables: Variables) {
|
||||
|
||||
if (!validatedBreadcrumbsData.success) {
|
||||
console.error(
|
||||
`Failed to validate My Page Breadcrumbs Data - (url: ${variables.url})`
|
||||
`Failed to validate My Page Breadcrumbs Data - (uid: ${variables.uid})`
|
||||
)
|
||||
console.error(validatedBreadcrumbsData.error)
|
||||
return null
|
||||
}
|
||||
|
||||
return getBreadcrumbs(
|
||||
validatedBreadcrumbsData.data.all_account_page.items[0],
|
||||
validatedBreadcrumbsData.data.account_page,
|
||||
variables.locale
|
||||
)
|
||||
}
|
||||
@@ -183,7 +183,7 @@ export const breadcrumbsQueryRouter = router({
|
||||
get: contentstackExtendedProcedureUID.query(async ({ ctx }) => {
|
||||
const variables = {
|
||||
locale: ctx.lang,
|
||||
url: ctx.pathname,
|
||||
uid: ctx.uid,
|
||||
}
|
||||
|
||||
switch (ctx.contentType) {
|
||||
|
||||
@@ -9,19 +9,18 @@ import {
|
||||
} from "@/utils/generateTag"
|
||||
import { removeMultipleSlashes } from "@/utils/url"
|
||||
|
||||
import { type BreadcrumbsRefsItems, getBreadcrumbsSchema, Page } from "./output"
|
||||
import { type BreadcrumbsRefs, getBreadcrumbsSchema, Page } from "./output"
|
||||
|
||||
import type { Edges } from "@/types/requests/utils/edges"
|
||||
import type { NodeRefs } from "@/types/requests/utils/refs"
|
||||
|
||||
export function getConnections(refs: BreadcrumbsRefsItems) {
|
||||
export function getConnections(refs: BreadcrumbsRefs) {
|
||||
const connections: Edges<NodeRefs>[] = []
|
||||
|
||||
refs.items.forEach((ref) => {
|
||||
if (ref.web?.breadcrumbs) {
|
||||
connections.push(ref.web.breadcrumbs.parentsConnection)
|
||||
}
|
||||
})
|
||||
if (refs.web?.breadcrumbs) {
|
||||
connections.push(refs.web.breadcrumbs.parentsConnection)
|
||||
}
|
||||
|
||||
return connections
|
||||
}
|
||||
|
||||
@@ -63,14 +62,14 @@ export const homeBreadcrumbs = {
|
||||
|
||||
export type Variables = {
|
||||
locale: Lang
|
||||
url: string
|
||||
uid: string
|
||||
}
|
||||
|
||||
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.url, affix)],
|
||||
tags: [generateRefsResponseTag(variables.locale, variables.uid, affix)],
|
||||
},
|
||||
})
|
||||
if (!refsResponse.data) {
|
||||
@@ -80,10 +79,10 @@ export async function getRefsResponse<T>(query: string, variables: Variables) {
|
||||
return refsResponse
|
||||
}
|
||||
|
||||
export function getTags(page: BreadcrumbsRefsItems, variables: Variables) {
|
||||
export function getTags(page: BreadcrumbsRefs, variables: Variables) {
|
||||
const connections = getConnections(page)
|
||||
const tags = generateTags(variables.locale, connections)
|
||||
tags.push(generateTag(variables.locale, page.items[0].system.uid, affix))
|
||||
tags.push(generateTag(variables.locale, page.system.uid, affix))
|
||||
return tags
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user