feat(SW-66, SW-348): search functionality and ui

This commit is contained in:
Simon Emanuelsson
2024-08-28 10:47:57 +02:00
parent b9dbcf7d90
commit af850c90e7
437 changed files with 7663 additions and 9881 deletions

View File

@@ -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<

View File

@@ -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) {

View File

@@ -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
}