Skip to content

Commit f941ddf

Browse files
authored
Fix bug with preventScrollReset when using concurrent redirecting fetchers (#11999)
1 parent 73fcb9b commit f941ddf

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

.changeset/chatty-impalas-pump.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@remix-run/router": patch
3+
---
4+
5+
Fix bug with fetchers not persisting `preventScrollReset` through redirects during concurrent fetches

packages/router/__tests__/scroll-restoration-test.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -509,6 +509,47 @@ describe("scroll restoration", () => {
509509
expect(t.router.state.restoreScrollPosition).toBe(null);
510510
expect(t.router.state.preventScrollReset).toBe(true);
511511
});
512+
513+
it("persists through concurrent redirecting fetchers", async () => {
514+
let t = setup({
515+
routes: SCROLL_ROUTES,
516+
initialEntries: ["/tasks"],
517+
hydrationData: {
518+
loaderData: {
519+
tasks: "TASKS",
520+
},
521+
},
522+
});
523+
524+
expect(t.router.state.restoreScrollPosition).toBe(false);
525+
expect(t.router.state.preventScrollReset).toBe(false);
526+
527+
let positions = {};
528+
let activeScrollPosition = 0;
529+
t.router.enableScrollRestoration(positions, () => activeScrollPosition);
530+
531+
let nav1 = await t.fetch("/tasks", {
532+
formMethod: "post",
533+
formData: createFormData({}),
534+
preventScrollReset: true,
535+
});
536+
537+
let nav2 = await t.fetch("/tasks", {
538+
formMethod: "post",
539+
formData: createFormData({}),
540+
preventScrollReset: true,
541+
});
542+
543+
let nav3 = await nav1.actions.tasks.redirectReturn("/tasks");
544+
await nav3.loaders.tasks.resolve("TASKS 2");
545+
expect(t.router.state.restoreScrollPosition).toBe(null);
546+
expect(t.router.state.preventScrollReset).toBe(true);
547+
548+
let nav4 = await nav2.actions.tasks.redirectReturn("/tasks");
549+
await nav4.loaders.tasks.resolve("TASKS 3");
550+
expect(t.router.state.restoreScrollPosition).toBe(null);
551+
expect(t.router.state.preventScrollReset).toBe(true);
552+
});
512553
});
513554
});
514555
});

packages/router/router.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2184,7 +2184,7 @@ export function createRouter(init: RouterInit): Router {
21842184

21852185
let match = getTargetMatch(matches, path);
21862186

2187-
pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;
2187+
let preventScrollReset = (opts && opts.preventScrollReset) === true;
21882188

21892189
if (submission && isMutationMethod(submission.formMethod)) {
21902190
handleFetcherAction(
@@ -2195,6 +2195,7 @@ export function createRouter(init: RouterInit): Router {
21952195
matches,
21962196
fogOfWar.active,
21972197
flushSync,
2198+
preventScrollReset,
21982199
submission
21992200
);
22002201
return;
@@ -2211,6 +2212,7 @@ export function createRouter(init: RouterInit): Router {
22112212
matches,
22122213
fogOfWar.active,
22132214
flushSync,
2215+
preventScrollReset,
22142216
submission
22152217
);
22162218
}
@@ -2225,6 +2227,7 @@ export function createRouter(init: RouterInit): Router {
22252227
requestMatches: AgnosticDataRouteMatch[],
22262228
isFogOfWar: boolean,
22272229
flushSync: boolean,
2230+
preventScrollReset: boolean,
22282231
submission: Submission
22292232
) {
22302233
interruptActiveLoads();
@@ -2339,6 +2342,7 @@ export function createRouter(init: RouterInit): Router {
23392342
updateFetcherState(key, getLoadingFetcher(submission));
23402343
return startRedirectNavigation(fetchRequest, actionResult, false, {
23412344
fetcherSubmission: submission,
2345+
preventScrollReset,
23422346
});
23432347
}
23442348
}
@@ -2453,7 +2457,8 @@ export function createRouter(init: RouterInit): Router {
24532457
return startRedirectNavigation(
24542458
revalidationRequest,
24552459
redirect.result,
2456-
false
2460+
false,
2461+
{ preventScrollReset }
24572462
);
24582463
}
24592464

@@ -2466,7 +2471,8 @@ export function createRouter(init: RouterInit): Router {
24662471
return startRedirectNavigation(
24672472
revalidationRequest,
24682473
redirect.result,
2469-
false
2474+
false,
2475+
{ preventScrollReset }
24702476
);
24712477
}
24722478

@@ -2534,6 +2540,7 @@ export function createRouter(init: RouterInit): Router {
25342540
matches: AgnosticDataRouteMatch[],
25352541
isFogOfWar: boolean,
25362542
flushSync: boolean,
2543+
preventScrollReset: boolean,
25372544
submission?: Submission
25382545
) {
25392546
let existingFetcher = state.fetchers.get(key);
@@ -2630,7 +2637,9 @@ export function createRouter(init: RouterInit): Router {
26302637
return;
26312638
} else {
26322639
fetchRedirectIds.add(key);
2633-
await startRedirectNavigation(fetchRequest, result, false);
2640+
await startRedirectNavigation(fetchRequest, result, false, {
2641+
preventScrollReset,
2642+
});
26342643
return;
26352644
}
26362645
}
@@ -2673,10 +2682,12 @@ export function createRouter(init: RouterInit): Router {
26732682
{
26742683
submission,
26752684
fetcherSubmission,
2685+
preventScrollReset,
26762686
replace,
26772687
}: {
26782688
submission?: Submission;
26792689
fetcherSubmission?: Submission;
2690+
preventScrollReset?: boolean;
26802691
replace?: boolean;
26812692
} = {}
26822693
) {
@@ -2757,7 +2768,7 @@ export function createRouter(init: RouterInit): Router {
27572768
formAction: location,
27582769
},
27592770
// Preserve these flags across redirects
2760-
preventScrollReset: pendingPreventScrollReset,
2771+
preventScrollReset: preventScrollReset || pendingPreventScrollReset,
27612772
enableViewTransition: isNavigation
27622773
? pendingViewTransitionEnabled
27632774
: undefined,
@@ -2774,7 +2785,7 @@ export function createRouter(init: RouterInit): Router {
27742785
// Send fetcher submissions through for shouldRevalidate
27752786
fetcherSubmission,
27762787
// Preserve these flags across redirects
2777-
preventScrollReset: pendingPreventScrollReset,
2788+
preventScrollReset: preventScrollReset || pendingPreventScrollReset,
27782789
enableViewTransition: isNavigation
27792790
? pendingViewTransitionEnabled
27802791
: undefined,

0 commit comments

Comments
 (0)