diff --git a/apps/web/src/routes/_view/docs/$.tsx b/apps/web/src/routes/_view/docs/$.tsx index f678a9569b..61f80147ce 100644 --- a/apps/web/src/routes/_view/docs/$.tsx +++ b/apps/web/src/routes/_view/docs/$.tsx @@ -1,38 +1,47 @@ -import { createFileRoute, notFound, redirect } from "@tanstack/react-router"; +import { createFileRoute, redirect } from "@tanstack/react-router"; import { allDocs } from "content-collections"; import { DocLayout } from "./-components"; +import { docsStructure } from "./structure"; export const Route = createFileRoute("/_view/docs/$")({ component: Component, - loader: async ({ params }) => { + beforeLoad: ({ params }) => { const splat = params._splat || ""; - let doc = allDocs.find((doc) => doc.slug === splat); + const normalizedSplat = splat.replace(/\/$/, ""); - if (!doc) { - doc = allDocs.find((doc) => doc.slug === `${splat}/index`); + if (docsStructure.defaultPages[normalizedSplat]) { + throw redirect({ + to: "/docs/$", + params: { _splat: docsStructure.defaultPages[normalizedSplat] }, + }); } + let doc = allDocs.find((doc) => doc.slug === normalizedSplat); if (!doc) { - const pathParts = splat.split("/"); - const firstPart = pathParts[0]; - const sectionName = - firstPart.charAt(0).toUpperCase() + firstPart.slice(1); - const docsInSection = allDocs - .filter((d) => d.section === sectionName && !d.isIndex) - .sort((a, b) => a.order - b.order); + doc = allDocs.find((doc) => doc.slug === `${normalizedSplat}/index`); + } - if (docsInSection.length > 0) { - throw redirect({ - to: "/docs/$", - params: { _splat: docsInSection[0].slug }, - }); + if (!doc) { + if (normalizedSplat === "about/hello-world") { + return; } + throw redirect({ + to: "/docs/$", + params: { _splat: "about/hello-world" }, + }); + } + }, + loader: async ({ params }) => { + const splat = params._splat || ""; + const normalizedSplat = splat.replace(/\/$/, ""); - throw notFound(); + let doc = allDocs.find((doc) => doc.slug === normalizedSplat); + if (!doc) { + doc = allDocs.find((doc) => doc.slug === `${normalizedSplat}/index`); } - return { doc }; + return { doc: doc! }; }, head: ({ loaderData }) => { const { doc } = loaderData!; diff --git a/apps/web/src/routes/_view/docs/-structure.tsx b/apps/web/src/routes/_view/docs/-structure.tsx deleted file mode 100644 index c83e3a1f24..0000000000 --- a/apps/web/src/routes/_view/docs/-structure.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export const docsStructure = { - sections: ["about", "developers", "pro"], -}; diff --git a/apps/web/src/routes/_view/docs/route.tsx b/apps/web/src/routes/_view/docs/route.tsx index 9f559d6836..344bd10adc 100644 --- a/apps/web/src/routes/_view/docs/route.tsx +++ b/apps/web/src/routes/_view/docs/route.tsx @@ -7,7 +7,7 @@ import { import { allDocs } from "content-collections"; import { useMemo } from "react"; -import { docsStructure } from "./-structure"; +import { docsStructure } from "./structure"; export const Route = createFileRoute("/_view/docs")({ component: Component, diff --git a/apps/web/src/routes/_view/docs/structure.ts b/apps/web/src/routes/_view/docs/structure.ts new file mode 100644 index 0000000000..c49c90a70b --- /dev/null +++ b/apps/web/src/routes/_view/docs/structure.ts @@ -0,0 +1,8 @@ +export const docsStructure = { + sections: ["about", "developers", "pro"], + defaultPages: { + about: "about/hello-world", + developers: "developers/analytics", + pro: "pro/activation", + } as Record, +};