diff --git a/packages/react-router/src/Matches.tsx b/packages/react-router/src/Matches.tsx index 74cc825ce..8e426d03c 100644 --- a/packages/react-router/src/Matches.tsx +++ b/packages/react-router/src/Matches.tsx @@ -109,15 +109,11 @@ export function Matches() { ) : null - const ResolvedSuspense = !router.state.matches.length - ? React.Suspense - : SafeFragment - const inner = ( - + - + ) return router.options.InnerWrap ? ( diff --git a/packages/react-router/src/useNavigate.tsx b/packages/react-router/src/useNavigate.tsx index 93b8bdbd8..573b169e6 100644 --- a/packages/react-router/src/useNavigate.tsx +++ b/packages/react-router/src/useNavigate.tsx @@ -23,15 +23,15 @@ export function useNavigate< >(_defaultOpts?: { from?: FromPathOption }): UseNavigateResult { - const router = useRouter() + const { navigate } = useRouter() return React.useCallback( (options: NavigateOptions) => { - return router.navigate({ + return navigate({ ...options, }) }, - [router], + [navigate], ) as UseNavigateResult } @@ -58,7 +58,6 @@ export function Navigate< TMaskTo extends string = '', >(props: NavigateOptions): null { const { navigate } = useRouter() - const match = useMatch({ strict: false }) React.useEffect(() => { navigate({ diff --git a/packages/react-router/tests/link.test.tsx b/packages/react-router/tests/link.test.tsx index afed66b8d..d3f5ec5e6 100644 --- a/packages/react-router/tests/link.test.tsx +++ b/packages/react-router/tests/link.test.tsx @@ -1,10 +1,11 @@ -import React from 'react' +import React, { useRef } from 'react' import '@testing-library/jest-dom/vitest' import { afterEach, describe, expect, it, test, vi } from 'vitest' import { cleanup, fireEvent, render, + renderHook, screen, waitFor, } from '@testing-library/react' @@ -25,6 +26,7 @@ import { useMatchRoute, useParams, useRouteContext, + useRouterState, useSearch, } from '../src' @@ -34,6 +36,73 @@ afterEach(() => { }) describe('Link', () => { + test('when using renderHook it returns a hook with same content to prove rerender works', async () => { + /** + * This is the hook that will be testet. + * + * @returns custom state + */ + const useLocationFromState = () => { + const { location } = useRouterState() + + // could return anything just to prove it will work. + const memoLocation = React.useMemo(() => { + return { + href: location.href, + pathname: location.pathname, + } + }, [location.href, location.pathname]) + + return memoLocation + } + + const IndexComponent = ({ children }: { children: React.ReactNode }) => { + return

{children}

+ } + const RouterContainer = ({ children }: { children: React.ReactNode }) => { + const childrenRef = useRef(children) + const memoedRouteTree = React.useMemo(() => { + const rootRoute = createRootRoute() + const indexRoute = createRoute({ + getParentRoute: () => rootRoute, + path: '/', + component: () => ( + {childrenRef.current} + ), + }) + return rootRoute.addChildren([indexRoute]) + }, []) + + const memoedRouter = React.useMemo(() => { + const router = createRouter({ + routeTree: memoedRouteTree, + history: createMemoryHistory({ initialEntries: ['/'] }), + }) + + return router + }, [memoedRouteTree]) + return + } + + const { result, rerender } = renderHook( + () => { + return useLocationFromState() + }, + { wrapper: RouterContainer }, + ) + await waitFor(() => expect(screen.getByTestId('testId')).toBeVisible()) + expect(result.current).toBeTruthy() + + const original = result.current + + rerender() + + await waitFor(() => expect(screen.getByTestId('testId')).toBeVisible()) + const updated = result.current + + expect(original).toBe(updated) + }) + test('when a Link is disabled', async () => { const rootRoute = createRootRoute() const indexRoute = createRoute({