diff --git a/packages/react-router/tests/router.test.tsx b/packages/react-router/tests/router.test.tsx
index bbe3fd32957..5545ce1c215 100644
--- a/packages/react-router/tests/router.test.tsx
+++ b/packages/react-router/tests/router.test.tsx
@@ -1816,3 +1816,44 @@ describe('does not strip search params if search validation fails', () => {
expect(window.location.search).toBe('?root=hello')
})
})
+
+describe('statusCode reset on navigation', () => {
+ it('should reset statusCode to 200 when navigating from 404 to valid route', async () => {
+ const history = createMemoryHistory({ initialEntries: ['/'] })
+
+ const rootRoute = createRootRoute({
+ component: () => ,
+ })
+
+ const indexRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/',
+ component: () =>
Home
,
+ })
+
+ const validRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/valid',
+ component: () => Valid Route
,
+ })
+
+ const routeTree = rootRoute.addChildren([indexRoute, validRoute])
+ const router = createRouter({ routeTree, history })
+
+ render()
+
+ expect(router.state.statusCode).toBe(200)
+
+ await act(() => router.navigate({ to: '/' }))
+ expect(router.state.statusCode).toBe(200)
+
+ await act(() => router.navigate({ to: '/non-existing' }))
+ expect(router.state.statusCode).toBe(404)
+
+ await act(() => router.navigate({ to: '/valid' }))
+ expect(router.state.statusCode).toBe(200)
+
+ await act(() => router.navigate({ to: '/another-non-existing' }))
+ expect(router.state.statusCode).toBe(404)
+ })
+})
diff --git a/packages/router-core/src/router.ts b/packages/router-core/src/router.ts
index fd056efcd97..410f7cbe2b8 100644
--- a/packages/router-core/src/router.ts
+++ b/packages/router-core/src/router.ts
@@ -1796,6 +1796,7 @@ export class RouterCore<
this.__store.setState((s) => ({
...s,
status: 'pending',
+ statusCode: 200,
isLoading: true,
location: this.latestLocation,
pendingMatches,
diff --git a/packages/solid-router/tests/router.test.tsx b/packages/solid-router/tests/router.test.tsx
index 5d452085622..5e89292bb34 100644
--- a/packages/solid-router/tests/router.test.tsx
+++ b/packages/solid-router/tests/router.test.tsx
@@ -1591,3 +1591,44 @@ describe('does not strip search params if search validation fails', () => {
expect(window.location.search).toBe('?root=hello')
})
})
+
+describe('statusCode reset on navigation', () => {
+ it('should reset statusCode to 200 when navigating from 404 to valid route', async () => {
+ const history = createMemoryHistory({ initialEntries: ['/'] })
+
+ const rootRoute = createRootRoute({
+ component: () => ,
+ })
+
+ const indexRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/',
+ component: () => Home
,
+ })
+
+ const validRoute = createRoute({
+ getParentRoute: () => rootRoute,
+ path: '/valid',
+ component: () => Valid Route
,
+ })
+
+ const routeTree = rootRoute.addChildren([indexRoute, validRoute])
+ const router = createRouter({ routeTree, history })
+
+ render(() => )
+
+ expect(router.state.statusCode).toBe(200)
+
+ await router.navigate({ to: '/' })
+ await waitFor(() => expect(router.state.statusCode).toBe(200))
+
+ await router.navigate({ to: '/non-existing' })
+ await waitFor(() => expect(router.state.statusCode).toBe(404))
+
+ await router.navigate({ to: '/valid' })
+ await waitFor(() => expect(router.state.statusCode).toBe(200))
+
+ await router.navigate({ to: '/another-non-existing' })
+ await waitFor(() => expect(router.state.statusCode).toBe(404))
+ })
+})