Skip to content

Commit 6d277b3

Browse files
committed
fix bugs
1 parent 8bd03ab commit 6d277b3

File tree

5 files changed

+29
-14
lines changed

5 files changed

+29
-14
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232
"clean": "git clean -fdX .",
3333
"clean:build": "git clean -fdx -e node_modules .",
3434
"typecheck": "pnpm run --filter=\"./packages/**/*\" --parallel typecheck",
35-
"test": "pnpm run test:ci",
36-
"test:ci": "nx run-many --targets=test:unused,check,test:deps,test:lib,test:types,test:build,build",
35+
"test": "nx run-many --targets=test:unused,check,test:deps,test:lib,test:types,test:build,build",
36+
"test:ci": "nx run-many --targets=test:unused,test:deps,test:lib,test:types,test:build,build",
3737
"test:cov": "pnpm run --filter=\"./packages/**/*\" --parallel test:cov",
3838
"dev": "pnpm run watch",
3939
"check": "biome check .",

packages/react-router-devtools/src/client/components/RouteSegmentInfo.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { memo } from "react"
12
import type { UIMatch } from "react-router"
23
import { convertBigIntToString } from "../../shared/bigint-util.js"
34
import { useSettingsContext } from "../context/useRDTContext.js"
@@ -28,7 +29,7 @@ const getLoaderData = (data: string | Record<string, any>) => {
2829
return convertBigIntToString(data)
2930
}
3031

31-
export const RouteSegmentInfo = ({ route, i }: { route: UIMatch<unknown, unknown>; i: number }) => {
32+
const RouteSegmentInfo = ({ route, i }: { route: UIMatch<unknown, unknown>; i: number }) => {
3233
const { styles } = useStyles()
3334

3435
const isDev = typeof import.meta.hot !== "undefined"
@@ -126,3 +127,5 @@ export const RouteSegmentInfo = ({ route, i }: { route: UIMatch<unknown, unknown
126127
</RouteSegmentCard>
127128
)
128129
}
130+
131+
export const MemoizedRouteSegmentInfo = memo(RouteSegmentInfo)

packages/react-router-devtools/src/client/components/jsonRenderer.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useMemo, useRef, useState } from "react"
1+
import { memo, useEffect, useMemo, useRef, useState } from "react"
22
import JsonView from "../../external/react-json-view/index.js"
33
import { customTheme } from "../../external/react-json-view/theme/custom.js"
44
import { useSettingsContext } from "../context/useRDTContext.js"
@@ -14,7 +14,7 @@ const isPromise = (value: any): value is Promise<any> => {
1414
return value && typeof value.then === "function"
1515
}
1616

17-
const JsonRenderer = ({ data, expansionLevel }: JsonRendererProps) => {
17+
const JsonRendererComponent = ({ data, expansionLevel }: JsonRendererProps) => {
1818
const { styles } = useStyles()
1919
const { settings } = useSettingsContext()
2020
const ref = useRef(true)
@@ -73,4 +73,6 @@ const JsonRenderer = ({ data, expansionLevel }: JsonRendererProps) => {
7373
)
7474
}
7575

76+
const JsonRenderer = memo(JsonRendererComponent)
77+
7678
export { JsonRenderer }

packages/react-router-devtools/src/client/tabs/PageTab.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { useMemo } from "react"
12
import { useMatches, useRevalidator } from "react-router"
23

3-
import { RouteSegmentInfo } from "../components/RouteSegmentInfo.js"
4+
import { MemoizedRouteSegmentInfo } from "../components/RouteSegmentInfo.js"
45
import { TabContent } from "../components/TabContent.js"
56
import { TabHeader } from "../components/TabHeader.js"
67
import { Icon } from "../components/icon/Icon.js"
@@ -11,6 +12,9 @@ const PageTab = () => {
1112
const routes = useMatches()
1213
const { revalidate, state } = useRevalidator()
1314

15+
// Memoize reversed routes to avoid creating new array on every render
16+
const reversedRoutes = useMemo(() => routes.toReversed(), [routes])
17+
1418
return (
1519
<>
1620
<TabHeader
@@ -30,8 +34,8 @@ const PageTab = () => {
3034
<div className={styles.pageTab.content}>
3135
<TabContent>
3236
<ul className={cx(styles.pageTab.routesList, state === "loading" && styles.pageTab.routesListLoading)}>
33-
{routes.toReversed().map((route, i) => (
34-
<RouteSegmentInfo route={route} i={i} key={route.id} />
37+
{reversedRoutes.map((route, i) => (
38+
<MemoizedRouteSegmentInfo route={route} i={i} key={route.id} />
3539
))}
3640
</ul>
3741
</TabContent>

packages/react-router-devtools/src/client/tabs/RoutesTab.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { type MouseEvent, useEffect, useState } from "react"
1+
import { type MouseEvent, useCallback, useEffect, useMemo, useState } from "react"
22
import { useMatches, useNavigate } from "react-router"
33
import { eventClient } from "../../shared/event-client.js"
44
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "../components/Accordion.js"
@@ -19,17 +19,23 @@ const RoutesTab = () => {
1919
const { styles } = useStyles()
2020
const matches = useMatches()
2121
const navigate = useNavigate()
22-
const activeRoutes = matches.map((match) => match.id)
22+
// Memoize active routes to avoid recreating array on every render
23+
const activeRoutes = useMemo(() => matches.map((match) => match.id), [matches])
2324
const { settings } = useSettingsContext()
2425
const { routeWildcards, routeViewMode } = settings
2526
const [activeRoute, setActiveRoute] = useState<ExtendedRoute | null>(null)
2627
const [routes, setRoutes] = useState<ExtendedRoute[]>(createExtendedRoutes() as ExtendedRoute[])
2728
const [treeRoutes, setTreeRoutes] = useState(createRouteTree(window.__reactRouterManifest?.routes))
2829
const isTreeView = routeViewMode === "tree"
29-
const openNewRoute = (path: string) => (e?: MouseEvent<HTMLDivElement | HTMLButtonElement>) => {
30-
e?.preventDefault()
31-
navigate(path)
32-
}
30+
31+
// Memoize openNewRoute callback to prevent recreating on every render
32+
const openNewRoute = useCallback(
33+
(path: string) => (e?: MouseEvent<HTMLDivElement | HTMLButtonElement>) => {
34+
e?.preventDefault()
35+
navigate(path)
36+
},
37+
[navigate]
38+
)
3339

3440
useEffect(function fetchAllRoutesOnMount() {
3541
// Listen for routes info response from the server FIRST

0 commit comments

Comments
 (0)