Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly handle fetcher redirects interrupted by normal navigations #10674

Merged
merged 4 commits into from
Jul 6, 2023

Conversation

brophdawg11
Copy link
Contributor

If a fetcher loader/action is in-flight, and a new navigation is started, and then the loader/action completes with a redirect, we should be ignoring the redirect since the navigation came after it.

Closes remix-run/remix#6695

@changeset-bot
Copy link

changeset-bot bot commented Jul 5, 2023

🦋 Changeset detected

Latest commit: f25bc16

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 5 packages
Name Type
@remix-run/router Patch
react-router Patch
react-router-dom Patch
react-router-dom-v5-compat Patch
react-router-native Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@timdorr timdorr changed the title Properly handle fetcher reirects interrupted by normal navigations Properly handle fetcher redirects interrupted by normal navigations Jul 6, 2023
@brophdawg11 brophdawg11 self-assigned this Jul 6, 2023
revalidatingFetchers[redirect.idx - matchesToLoad.length].key;
fetchRedirectIds.add(fetcherKey);
}
await startRedirectNavigation(state, redirect.result, { replace });
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding to fetchRedirectIds avoids redirect loops of revalidating fetchers

Comment on lines +1777 to +1780
let doneFetcher = getDoneFetcher(undefined);
state.fetchers.set(key, doneFetcher);
updateState({ fetchers: new Map(state.fetchers) });
return;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flip submitting fetchers to done if they come back with a redirect after we've already started a separate navigation

Comment on lines +2029 to +2032
let doneFetcher = getDoneFetcher(undefined);
state.fetchers.set(key, doneFetcher);
updateState({ fetchers: new Map(state.fetchers) });
return;
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Flip loading fetchers to done if they come back with a redirect after we've already started a separate navigation. Note that they'll be eligible for revalidation so they'll run again and if they redirect that time it will be processed

@brophdawg11 brophdawg11 merged commit 26dce23 into dev Jul 6, 2023
3 checks passed
@brophdawg11 brophdawg11 deleted the brophdawg11/fetcher-redirect-interrupted branch July 6, 2023 20:33
@github-actions
Copy link
Contributor

🤖 Hello there,

We just published version 6.14.2-pre.0 which includes this pull request. If you'd like to take it for a test run please try it out and let us know what you think!

Thanks!

@github-actions
Copy link
Contributor

🤖 Hello there,

We just published version 6.14.2 which includes this pull request. If you'd like to take it for a test run please try it out and let us know what you think!

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

x-remix-redirect responses are not ignored when route has changed
2 participants