From 48131b84b6a776383920427b9be1218221053aa5 Mon Sep 17 00:00:00 2001 From: Manuel Schiller Date: Sun, 6 Oct 2024 01:46:32 +0200 Subject: [PATCH 1/2] fix(react-router): reset `invalid` status of route after loader ran again fixes #2474 --- packages/react-router/src/router.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react-router/src/router.ts b/packages/react-router/src/router.ts index e4e3e7907e5..8d783485209 100644 --- a/packages/react-router/src/router.ts +++ b/packages/react-router/src/router.ts @@ -2394,6 +2394,7 @@ export class Router< ...prev, isFetching: loaderRunningAsync ? prev.isFetching : false, loaderPromise: undefined, + invalid: false, })) })(), ) From 02a4973af9fbad654621ec3a9349909708d8f8e2 Mon Sep 17 00:00:00 2001 From: Manuel Schiller Date: Sun, 6 Oct 2024 08:54:45 +0200 Subject: [PATCH 2/2] added regression test --- packages/react-router/tests/router.test.tsx | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx index 29ebd08b770..5ec04873df9 100644 --- a/packages/react-router/tests/router.test.tsx +++ b/packages/react-router/tests/router.test.tsx @@ -580,3 +580,29 @@ describe('router matches URLs to route definitions', () => { ]) }) }) + +describe('invalidate', () => { + it('after router.invalid(), routes should be `valid` again after loading', async () => { + const { router } = createTestRouter( + createMemoryHistory({ initialEntries: ['/'] }), + ) + + await act(() => router.load()) + + router.state.matches.forEach((match) => { + expect(match.invalid).toBe(false) + }) + + await act(() => router.invalidate()) + + router.state.matches.forEach((match) => { + expect(match.invalid).toBe(false) + }) + + await act(() => router.load()) + + router.state.matches.forEach((match) => { + expect(match.invalid).toBe(false) + }) + }) +})