Skip to content

Commit 07c1600

Browse files
Refactor routing and redirects for v6 documentation (#176)
* Refactor routing and redirects for v6 documentation * Add 404s for invalid refs
1 parent 664fb4c commit 07c1600

File tree

7 files changed

+50
-49
lines changed

7 files changed

+50
-49
lines changed

_redirects

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,14 @@
8282
/en/main/route/loader https://api.reactrouter.com/v7/types/react_router.LoaderFunction.html
8383
/en/main/route/should-revalidate https://api.reactrouter.com/v7/interfaces/react_router.ShouldRevalidateFunction.html
8484

85+
# catchall for remaining v6 docs with lang prefix
86+
/en/* /*
87+
8588
# API reference redirects
8689
/reference /en/main/reference
8790

8891
# removed `/docs` prefix
92+
/docs /home
8993
/docs/en/v6/* /en/v6.3.0/*
9094
/docs/* /*
9195

app/components/docs-menu/menu.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,13 @@ import { useNavigation } from "~/hooks/use-navigation";
99
import { useDelayedValue } from "~/hooks/use-delayed-value";
1010
import { useHeaderData } from "../docs-header/use-header-data";
1111

12-
export function Menu({ menu }: { menu?: MenuDoc[] }) {
12+
export function Menu({
13+
menu,
14+
changelogHref,
15+
}: {
16+
menu?: MenuDoc[];
17+
changelogHref?: string;
18+
}) {
1319
// github might be down but the menu but the doc could be cached in memory, so
1420
// prevent the whole page from blowing up and still render the doc
1521
if (menu === undefined) {
@@ -22,7 +28,9 @@ export function Menu({ menu }: { menu?: MenuDoc[] }) {
2228

2329
return (
2430
<nav>
25-
<HeaderMenuLink to="start/changelog">Changelog</HeaderMenuLink>
31+
{changelogHref ? (
32+
<HeaderMenuLink to={changelogHref}>Changelog</HeaderMenuLink>
33+
) : null}
2634
{menu.map((category) => (
2735
<div key={category.attrs.title}>
2836
<MenuCategory category={category} />

app/pages/docs-index.tsx

Lines changed: 0 additions & 15 deletions
This file was deleted.

app/pages/docs-layout.tsx

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Outlet } from "react-router";
1+
import { Outlet, redirect } from "react-router";
22
import classNames from "classnames";
33

44
import { Header } from "~/components/docs-header/docs-header";
@@ -15,7 +15,25 @@ import { useCodeBlockCopyButton } from "~/ui/utils";
1515

1616
import docsCss from "~/styles/docs.css?url";
1717

18-
export let loader = async ({ params }: Route.LoaderArgs) => {
18+
export let loader = async ({ request, params }: Route.LoaderArgs) => {
19+
let url = new URL(request.url);
20+
if (!url.pathname.endsWith("/")) {
21+
url.pathname += "/";
22+
}
23+
24+
// the /:ref param should only be used for v6 docs
25+
if (params.ref) {
26+
// if the ref is not a valid semver, this is 404
27+
if (!semver.valid(params.ref)) {
28+
throw new Response("Not Found", { status: 404 });
29+
}
30+
31+
// if ref is not a v6 ref, redirect to the /home of that ref
32+
if (!url.pathname.match(/^\/?(6)/)) {
33+
throw redirect(url.pathname + "home");
34+
}
35+
}
36+
1937
let splat = params["*"];
2038
let firstSegment = splat?.split("/")[0];
2139
let refParam = params.ref
@@ -37,25 +55,31 @@ export let loader = async ({ params }: Route.LoaderArgs) => {
3755
};
3856

3957
export default function DocsLayout({ loaderData }: Route.ComponentProps) {
40-
const { menu } = loaderData;
58+
const { menu, header } = loaderData;
4159

4260
let docsContainer = useRef<HTMLDivElement>(null);
4361
useCodeBlockCopyButton(docsContainer);
4462

63+
const changelogHref = header.hasAPIDocs
64+
? header.refParam
65+
? `/${header.refParam}/changelog`
66+
: "/changelog"
67+
: undefined;
68+
4569
return (
4670
<>
4771
<link rel="stylesheet" href={docsCss} />
4872
<div className="[--header-height:theme(spacing.16)] [--nav-width:theme(spacing.72)] lg:m-auto lg:max-w-[90rem]">
4973
<div className="sticky top-0 z-20">
5074
<Header />
5175
<NavMenuMobile>
52-
<Menu menu={menu} />
76+
<Menu menu={menu} changelogHref={changelogHref} />
5377
</NavMenuMobile>
5478
</div>
5579

5680
<div className="block lg:flex">
5781
<NavMenuDesktop>
58-
<Menu menu={menu} />
82+
<Menu menu={menu} changelogHref={changelogHref} />
5983
</NavMenuDesktop>
6084
<div
6185
ref={docsContainer}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { redirect } from "react-router";
22
import { getRepoTags } from "~/modules/gh-docs/.server";
33
import * as semver from "semver";
4-
import type { Route } from "./+types/redirect-v7-doc";
4+
import type { Route } from "./+types/redirect-major-version";
55

66
export async function loader({ request }: Route.LoaderArgs) {
77
let url = new URL(request.url);

app/pages/redirect-v6-doc.tsx

Lines changed: 0 additions & 19 deletions
This file was deleted.

app/routes.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,20 @@ const routes: RouteConfig = [
88

99
route("", "pages/docs-layout.tsx", { id: "docs" }, [
1010
route("home", "pages/doc.tsx", { id: "home" }),
11+
route("changelog", "pages/doc.tsx", { id: "changelog" }),
1112
route("*", "pages/doc.tsx"),
1213
]),
1314

14-
route("/:ref", "pages/docs-index.tsx", { id: "docs-index" }),
15-
1615
// short version URLs for changelogs and stuff
17-
route("/v6/*", "pages/redirect-v6-doc.tsx"),
18-
route("/v7/*", "pages/redirect-v7-doc.tsx"),
16+
route("/v6/*", "pages/redirect-major-version.tsx", { id: "v6-redirect" }),
17+
route("/v7/*", "pages/redirect-major-version.tsx", { id: "v7-redirect" }),
1918

20-
// v6 URLs before the api reference docs
21-
route("/en/:ref", "pages/docs-layout.tsx", { id: "v6-docs" }, [
19+
// This route primarily exists to support the old v6 index page and to
20+
// redirect to the new docs at /home
21+
route("/:ref", "pages/docs-layout.tsx", { id: "v6-index-layout" }, [
2222
index("pages/docs-home.tsx", {
2323
id: "v6-index",
2424
}),
25-
route("*", "pages/doc.tsx", { id: "v6-guide" }),
2625
]),
2726
];
2827

0 commit comments

Comments
 (0)