From 0c4aa592ccf8cfb5cb470722bfa5201eed9d35f9 Mon Sep 17 00:00:00 2001 From: Simon Emanuelsson Date: Tue, 16 Apr 2024 12:42:44 +0200 Subject: [PATCH] feat: revalidate my pages breadcrumbs on demand --- .../current-content-page/page.tsx | 4 +- app/api/web/revalidate/route.ts | 28 ++++- components/Current/Footer/index.tsx | 2 +- components/Current/Header/index.tsx | 2 +- components/MaxWidth/index.tsx | 11 +- components/MyPages/Breadcrumbs/index.tsx | 1 - env/client.ts | 2 + .../Fragments/MyPages/Breadcrumbs.graphql | 3 +- .../Fragments/Refs/Breadcrumbs.graphql | 20 ++++ lib/graphql/Query/BreadcrumbsMyPages.graphql | 9 ++ lib/graphql/batchRequest.ts | 4 +- lib/graphql/request.ts | 10 +- lib/trpc/Provider.tsx | 9 +- next.config.js | 7 ++ server/errors/trpc.ts | 2 +- .../routers/contentstack/breadcrumbs/input.ts | 8 +- .../contentstack/breadcrumbs/output.ts | 31 ++++- .../routers/contentstack/breadcrumbs/query.ts | 113 ++++++++++++++---- .../routers/contentstack/breadcrumbs/utils.ts | 50 ++++++++ .../contentstack/myPages/navigation/query.ts | 16 ++- server/routers/user/query.ts | 1 - types/requests/myPages/breadcrumbs.ts | 20 +++- utils/generateTag.ts | 23 +++- utils/url.ts | 3 + 24 files changed, 322 insertions(+), 57 deletions(-) create mode 100644 lib/graphql/Fragments/Refs/Breadcrumbs.graphql create mode 100644 server/routers/contentstack/breadcrumbs/utils.ts create mode 100644 utils/url.ts diff --git a/app/[lang]/(live-current)/current-content-page/page.tsx b/app/[lang]/(live-current)/current-content-page/page.tsx index 3154b25e4..7fd60e98f 100644 --- a/app/[lang]/(live-current)/current-content-page/page.tsx +++ b/app/[lang]/(live-current)/current-content-page/page.tsx @@ -28,7 +28,7 @@ export default async function CurrentContentPage({ url: searchParams.uri, }, { - tags: [`${searchParams.uri}-${params.lang}`], + next: { tags: [`${searchParams.uri}-${params.lang}`] }, } ) @@ -44,7 +44,7 @@ export default async function CurrentContentPage({ GetCurrentBlockPageTrackingData, { uid: response.data.all_current_blocks_page.items[0].system.uid }, { - tags: [`${searchParams.uri}-en`], + next: { tags: [`${searchParams.uri}-en`] }, } ) diff --git a/app/api/web/revalidate/route.ts b/app/api/web/revalidate/route.ts index 723f72649..d85edb1ac 100644 --- a/app/api/web/revalidate/route.ts +++ b/app/api/web/revalidate/route.ts @@ -6,6 +6,7 @@ import { z } from "zod" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import { internalServerError } from "@/server/errors/next" +import { affix as breadcrumbsAffix } from "@/server/routers/contentstack/breadcrumbs/utils" import { generateRefsResponseTag, @@ -14,14 +15,16 @@ import { } from "@/utils/generateTag" const validateJsonBody = z.object({ - api_key: z.string(), - module: z.string(), - data: z.object({ content_type: z.object({ uid: z.string(), }), entry: z.object({ + breadcrumbs: z + .object({ + title: z.string(), + }) + .optional(), locale: z.nativeEnum(Lang), uid: z.string(), url: z.string().optional(), @@ -75,6 +78,25 @@ export async function POST(request: NextRequest) { console.info(`Revalidating tag: ${tag}`) revalidateTag(tag) + if (entry.breadcrumbs) { + const breadcrumbsRefsTag = generateRefsResponseTag( + entry.locale, + identifier, + breadcrumbsAffix + ) + const breadcrumbsTag = generateTag( + entry.locale, + entry.uid, + breadcrumbsAffix + ) + + console.info(`Revalidating breadcrumbsRefsTag: ${breadcrumbsRefsTag}`) + revalidateTag(breadcrumbsRefsTag) + + console.info(`Revalidating breadcrumbsTag: ${breadcrumbsTag}`) + revalidateTag(breadcrumbsTag) + } + return Response.json({ revalidated: true, now: Date.now() }) } catch (error) { console.info("Failed to revalidate tag(s)") diff --git a/components/Current/Footer/index.tsx b/components/Current/Footer/index.tsx index 3effbca99..f1fe7a7e6 100644 --- a/components/Current/Footer/index.tsx +++ b/components/Current/Footer/index.tsx @@ -17,7 +17,7 @@ export default async function Footer({ lang }: LangParams) { locale: lang, }, { - tags: [`footer-${lang}`], + next: { tags: [`footer-${lang}`] }, } ) diff --git a/components/Current/Header/index.tsx b/components/Current/Header/index.tsx index 759fc5bc7..309eff4dd 100644 --- a/components/Current/Header/index.tsx +++ b/components/Current/Header/index.tsx @@ -30,7 +30,7 @@ export default async function Header({ lang, uid }: LangParams & HeaderProps) { const { data } = await request( GetHeader, { locale: lang }, - { tags: [`header-${lang}`] } + { next: { tags: [`header-${lang}`] } } ) const { data: urls } = await batchRequest([ { diff --git a/components/MaxWidth/index.tsx b/components/MaxWidth/index.tsx index 806c06358..a947ae92b 100644 --- a/components/MaxWidth/index.tsx +++ b/components/MaxWidth/index.tsx @@ -1,5 +1,9 @@ +"use client" import { cva } from "class-variance-authority" +import { Lang } from "@/constants/languages" +import { trpc } from "@/lib/trpc/client" + import styles from "./maxWidth.module.css" import type { MaxWidthProps } from "@/types/components/max-width" @@ -10,8 +14,11 @@ export default function MaxWidth({ className, tag = "section", ...props -}: MaxWidthProps -) { +}: MaxWidthProps) { + const d = trpc.contentstack.breadcrumbs.get.useQuery({ + locale: Lang.en, + href: "/my-pages/overview", + }) const Cmp = tag return } diff --git a/components/MyPages/Breadcrumbs/index.tsx b/components/MyPages/Breadcrumbs/index.tsx index ebd84b318..2bf69f4cf 100644 --- a/components/MyPages/Breadcrumbs/index.tsx +++ b/components/MyPages/Breadcrumbs/index.tsx @@ -11,7 +11,6 @@ export default function Breadcrumbs({ breadcrumbs }: BreadcrumbsProps) { return (