From 0f591f003c5009c25b6fd4c0fec185cf9f98ae1e Mon Sep 17 00:00:00 2001 From: Matt Brophy Date: Mon, 17 Jul 2023 10:41:54 -0400 Subject: [PATCH] Fix edge case for fetcher redirect abort when no loaders exist --- .changeset/nice-planets-fly.md | 5 +++ packages/router/__tests__/router-test.ts | 48 ++++++++++++++++++++++++ packages/router/router.ts | 3 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .changeset/nice-planets-fly.md diff --git a/.changeset/nice-planets-fly.md b/.changeset/nice-planets-fly.md new file mode 100644 index 0000000000..f0c125e488 --- /dev/null +++ b/.changeset/nice-planets-fly.md @@ -0,0 +1,5 @@ +--- +"@remix-run/router": patch +--- + +[REMOVE] Fix additional edge case for #10674 diff --git a/packages/router/__tests__/router-test.ts b/packages/router/__tests__/router-test.ts index 6a48cb2b3e..51fe38a0ff 100644 --- a/packages/router/__tests__/router-test.ts +++ b/packages/router/__tests__/router-test.ts @@ -10073,6 +10073,54 @@ describe("a router", () => { expect(t.router.state.fetchers.get(key)?.state).toBe("idle"); expect(t.router.state.fetchers.get(key)?.data).toBeUndefined(); }); + + it("ignores submission redirect navigation if preceded by a normal GET navigation (w/o loaders)", async () => { + let key = "key"; + let t = setup({ + routes: [ + { + path: "", + id: "root", + children: [ + { + path: "/", + id: "index", + }, + { + path: "/foo", + id: "foo", + action: true, + }, + { + path: "/bar", + id: "bar", + }, + { + path: "/baz", + id: "baz", + }, + ], + }, + ], + }); + let A = await t.fetch("/foo", key, { + formMethod: "post", + formData: createFormData({ key: "value" }), + }); + await t.navigate("/bar"); + + // This redirect should be ignored + await A.actions.foo.redirect("/baz"); + expect(t.router.state.fetchers.get(key)?.state).toBe("idle"); + + expect(t.router.state).toMatchObject({ + navigation: IDLE_NAVIGATION, + location: { pathname: "/bar" }, + loaderData: {}, + }); + expect(t.router.state.fetchers.get(key)?.state).toBe("idle"); + expect(t.router.state.fetchers.get(key)?.data).toBeUndefined(); + }); }); describe(` diff --git a/packages/router/router.ts b/packages/router/router.ts index adae0211e0..ca7163d13b 100644 --- a/packages/router/router.ts +++ b/packages/router/router.ts @@ -1500,6 +1500,8 @@ export function createRouter(init: RouterInit): Router { (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId)) ); + pendingNavigationLoadId = ++incrementingLoadId; + // Short circuit if we have no loaders to run if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) { let updatedFetchers = markFetchRedirectsDone(); @@ -1541,7 +1543,6 @@ export function createRouter(init: RouterInit): Router { }); } - pendingNavigationLoadId = ++incrementingLoadId; revalidatingFetchers.forEach((rf) => { if (fetchControllers.has(rf.key)) { abortFetcher(rf.key);