Skip to content

Commit c483d68

Browse files
committed
Add test, update approach
1 parent 0495533 commit c483d68

File tree

2 files changed

+44
-20
lines changed

2 files changed

+44
-20
lines changed

packages/react-router/__tests__/router/fetchers-test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,43 @@ describe("fetchers", () => {
841841
expect(t.router.state.location.pathname).toBe("/");
842842
expect(t.router.state.location.key).toBe(key);
843843
});
844+
845+
test("handles loader redirects after a fetcher submission", async () => {
846+
let t = initializeTest();
847+
848+
let A = await t.navigate("/foo");
849+
await A.loaders.foo.resolve("FOO");
850+
expect(t.router.state).toMatchObject({
851+
location: { pathname: "/foo" },
852+
navigation: { state: "idle" },
853+
loaderData: { root: "ROOT", foo: "FOO" },
854+
});
855+
856+
let key = "key";
857+
let B = await t.fetch("/bar", key, {
858+
formMethod: "post",
859+
formData: createFormData({}),
860+
});
861+
await B.actions.bar.resolve("ACTION");
862+
expect(t.fetchers[key]).toMatchObject({
863+
state: "loading",
864+
data: "ACTION",
865+
});
866+
await B.loaders.root.resolve("ROOT*");
867+
868+
let C = await B.loaders.foo.redirect("/");
869+
await C.loaders.root.resolve("ROOT**");
870+
await C.loaders.index.resolve("INDEX*");
871+
expect(t.router.state).toMatchObject({
872+
location: { pathname: "/" },
873+
navigation: { state: "idle" },
874+
loaderData: { root: "ROOT**", index: "INDEX*" },
875+
});
876+
expect(t.fetchers[key]).toMatchObject({
877+
state: "idle",
878+
data: "ACTION",
879+
});
880+
});
844881
});
845882

846883
describe("fetcher resubmissions/re-gets", () => {

packages/react-router/lib/router/router.ts

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2494,14 +2494,15 @@ export function createRouter(init: RouterInit): Router {
24942494
fetchControllers.delete(key);
24952495
revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));
24962496

2497+
// Since we let revalidations complete even if the submitting fetcher was
2498+
// deleted, only put it back to idle if it hasn't been deleted
2499+
if (state.fetchers.has(key)) {
2500+
let doneFetcher = getDoneFetcher(actionResult.data);
2501+
state.fetchers.set(key, doneFetcher);
2502+
}
2503+
24972504
let redirect = findRedirect(loaderResults);
24982505
if (redirect) {
2499-
// Since we let revalidations complete even if the submitting fetcher was
2500-
// deleted, only put it back to idle if it hasn't been deleted
2501-
if (state.fetchers.has(key)) {
2502-
let doneFetcher = getDoneFetcher(actionResult.data);
2503-
state.fetchers.set(key, doneFetcher);
2504-
}
25052506
return startRedirectNavigation(
25062507
revalidationRequest,
25072508
redirect.result,
@@ -2517,13 +2518,6 @@ export function createRouter(init: RouterInit): Router {
25172518
// loader executions
25182519
fetchRedirectIds.add(redirect.key);
25192520

2520-
// Since we let revalidations complete even if the submitting fetcher was
2521-
// deleted, only put it back to idle if it hasn't been deleted
2522-
if (state.fetchers.has(key)) {
2523-
let doneFetcher = getDoneFetcher(actionResult.data);
2524-
state.fetchers.set(key, doneFetcher);
2525-
}
2526-
25272521
return startRedirectNavigation(
25282522
revalidationRequest,
25292523
redirect.result,
@@ -2542,13 +2536,6 @@ export function createRouter(init: RouterInit): Router {
25422536
fetcherResults
25432537
);
25442538

2545-
// Since we let revalidations complete even if the submitting fetcher was
2546-
// deleted, only put it back to idle if it hasn't been deleted
2547-
if (state.fetchers.has(key)) {
2548-
let doneFetcher = getDoneFetcher(actionResult.data);
2549-
state.fetchers.set(key, doneFetcher);
2550-
}
2551-
25522539
abortStaleFetchLoads(loadId);
25532540

25542541
// If we are currently in a navigation loading state and this fetcher is

0 commit comments

Comments
 (0)