Skip to content

Commit e2a8412

Browse files
brophdawg11claudeCopilot
authored
Migrate to unstable_useRouterState hook (#244)
* Migrate to unstable_useRouterState hook Replaces useLocation/useParams/useNavigation calls with the consolidated unstable_useRouterState hook from remix-run/react-router#15038. useMatches calls that read loaderData are left in place since the new hook's matches omit data fields. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * Update React Router to 7.15.1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Rename useNavigation hook to useNavState Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0439831 commit e2a8412

10 files changed

Lines changed: 2131 additions & 3956 deletions

File tree

app/actions/color-scheme/components.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { useLayoutEffect, useMemo } from "react";
2-
import { useNavigation, unstable_useRoute as useRoute } from "react-router";
2+
import {
3+
unstable_useRoute as useRoute,
4+
unstable_useRouterState as useRouterState,
5+
} from "react-router";
36
import type { ColorScheme } from "./server";
47

58
export function getColorScheme(formData: FormData): ColorScheme | null {
@@ -20,7 +23,7 @@ export function useColorScheme(): ColorScheme {
2023
let rootRoute = useRoute("root");
2124
let colorScheme = rootRoute.loaderData?.colorScheme ?? "system";
2225

23-
let { formData } = useNavigation();
26+
let formData = useRouterState().pending?.formData;
2427
let optimisticColorScheme = formData ? getColorScheme(formData) : null;
2528
return optimisticColorScheme || colorScheme;
2629
}

app/components/color-scheme-toggle.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { clsx } from "clsx";
22
import * as React from "react";
3-
import { Form, useLocation } from "react-router";
3+
import { Form, unstable_useRouterState as useRouterState } from "react-router";
44
import { useColorScheme } from "~/actions/color-scheme/components";
55
import iconsHref from "~/icons.svg";
66
import { DetailsMenu } from "~/modules/details-menu";
77
import { DetailsPopup } from "./details-popup";
88

99
export function ColorSchemeToggle() {
10-
let location = useLocation();
10+
let { location } = useRouterState().active;
1111

1212
// This is the same default, hover, focus style as the VersionSelect
1313
const className =

app/components/doc-error-boundary.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import { isRouteErrorResponse, useParams, useRouteError } from "react-router";
1+
import {
2+
isRouteErrorResponse,
3+
unstable_useRouterState as useRouterState,
4+
useRouteError,
5+
} from "react-router";
26

37
export function ErrorBoundary() {
48
let error = useRouteError();
5-
let params = useParams();
9+
let { params } = useRouterState().active;
610

711
if (isRouteErrorResponse(error)) {
812
return (

app/components/docs-menu/menu.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { clsx } from "clsx";
55
import iconsHref from "~/icons.svg";
66

77
import type { MenuDoc } from "~/modules/gh-docs/.server/docs";
8-
import { useNavigation } from "~/hooks/use-navigation";
8+
import { useNavState } from "~/hooks/use-nav-state";
99
import { useDelayedValue } from "~/hooks/use-delayed-value";
1010
import { useHeaderData } from "../docs-header/use-header-data";
1111

@@ -179,7 +179,7 @@ function LinkWithSpinner({
179179
children: React.ReactNode;
180180
className: (isActive: boolean) => string;
181181
}) {
182-
let { isActive, isPending } = useNavigation(to);
182+
let { isActive, isPending } = useNavState(to);
183183
let slowNav = useDelayedValue(isPending);
184184

185185
return (

app/components/version-select.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ import iconsHref from "~/icons.svg";
22
import { DetailsMenu } from "~/modules/details-menu";
33
import { DetailsPopup } from "./details-popup";
44
import { PopupLabel } from "./popup-label";
5-
import { Link, useParams } from "react-router";
5+
import { Link, unstable_useRouterState as useRouterState } from "react-router";
66
import { clsx } from "clsx";
77
import { useHeaderData } from "./docs-header/use-header-data";
8-
import { useNavigation } from "~/hooks/use-navigation";
8+
import { useNavState } from "~/hooks/use-nav-state";
99

1010
export function VersionSelect() {
1111
let { versions, latestVersion, releaseBranch, branches, currentGitHubRef } =
1212
useHeaderData();
13-
let { "*": splat } = useParams();
13+
let { "*": splat } = useRouterState().active.params;
1414

1515
let slug = "";
1616
if (splat && !currentGitHubRef.startsWith("6")) {
@@ -88,7 +88,7 @@ function VersionLink({ version }: { version: string }) {
8888

8989
function RefLink({ to, children }: { to: string; children: React.ReactNode }) {
9090
let isExternal = to.startsWith("http");
91-
let { isActive } = useNavigation(to);
91+
let { isActive } = useNavState(to);
9292
let className =
9393
"relative pl-4 group items-center flex py-1 before:mr-4 before:relative before:top-px before:block before:h-1.5 before:w-1.5 before:rounded-full before:content-['']";
9494

app/hooks/use-nav-state.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import {
2+
unstable_useRouterState as useRouterState,
3+
useResolvedPath,
4+
} from "react-router";
5+
6+
export function useNavState(to: string) {
7+
let { active, pending } = useRouterState();
8+
let resolved = useResolvedPath(to || "/");
9+
10+
return {
11+
isActive: active.location.pathname === resolved.pathname,
12+
isPending: pending?.location.pathname === resolved.pathname,
13+
};
14+
}

app/hooks/use-navigation.ts

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

app/modules/details-menu/index.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useLocation, useNavigation } from "react-router";
1+
import { unstable_useRouterState as useRouterState } from "react-router";
22
import * as React from "react";
33

44
/**
@@ -11,20 +11,19 @@ export let DetailsMenu = React.forwardRef<
1111
>(({ ...props }, forwardedRef) => {
1212
let { onToggle, onMouseDown, onTouchStart, onFocus, open, ...rest } = props;
1313
let [isOpen, setIsOpen] = React.useState(false);
14-
let location = useLocation();
15-
let navigation = useNavigation();
14+
let { active, pending } = useRouterState();
1615
let clickRef = React.useRef<boolean>(false);
1716
let focusRef = React.useRef<boolean>(false);
1817

1918
React.useEffect(() => {
20-
if (navigation.formData) {
19+
if (pending?.formData) {
2120
setIsOpen(false);
2221
}
23-
}, [navigation]);
22+
}, [pending]);
2423

2524
React.useEffect(() => {
2625
setIsOpen(false);
27-
}, [location.key]);
26+
}, [active.location.key]);
2827

2928
React.useEffect(() => {
3029
if (isOpen) {

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"dependencies": {
1818
"@docsearch/css": "^3.9.0",
1919
"@docsearch/react": "^3.9.0",
20-
"@react-router/node": "7.15.0",
20+
"@react-router/node": "7.15.1",
2121
"@remix-run/compression-middleware": "^0.1.4",
2222
"@remix-run/fetch-router": "^0.18.0",
2323
"@remix-run/logger-middleware": "^0.1.4",
@@ -40,7 +40,7 @@
4040
"parse-numeric-range": "^1.3.0",
4141
"react": "^19.2.5",
4242
"react-dom": "^19.2.5",
43-
"react-router": "7.15.0",
43+
"react-router": "7.15.1",
4444
"rehype-autolink-headings": "^7.1.0",
4545
"rehype-slug": "^6.0.0",
4646
"rehype-stringify": "^10.0.1",
@@ -55,7 +55,7 @@
5555
"unist-util-visit": "^5.1.0"
5656
},
5757
"devDependencies": {
58-
"@react-router/dev": "7.15.0",
58+
"@react-router/dev": "7.15.1",
5959
"@testing-library/jest-dom": "^6.9.1",
6060
"@types/hast": "^3.0.4",
6161
"@types/lodash.merge": "^4.6.9",

0 commit comments

Comments
 (0)