Fix not cancelling delayed portal removal when component is remounted #1064
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes the bug described in #1063, where a modal unexpectedly closes after being suspended when using React 18.
Issue details
The issue happens when using React 18 due to a change in the semantics of
Suspense. Since React 18, a component'scomponentWillUnmountis called when it is suspended andcomponentDidMountis called when it is unsuspended.In
react-modala call tocomponentWillUnmounttriggersremovePortalwith a timeout whencloseTimeoutMSis set (see #17 and #253). This timeout is never cancelled, even if the component is mounted again afterwards, as happens when it is unsuspended. Thus, the following sequence of events can happen, leading to the modal staying closed:componentWillUnmountis called and a timeout forremovePortalis started.componentDidMountis called. It adds the portal node as a child of the parent element, which is a noop at this point because the node has not yet been removed.removePortaltimeout happens so the portal node is removed.Proposed fix
Clear the
removePortaltimeout incomponentDidMount. In my testing, this leads to the portal node no longer being removed, fixing the issue.Acceptance Checklist: