#3711 - @react-refresh removes Ketcher from DOM #3887
Closed
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.
How the feature works? / How did you fix the issue?
The root cause was the
setTimeout
. Due to the double invoke in Strict Mode, it is possible for the cleanup from the first invocation to run after the seconduseEffect
has already started. This means that beforesetTimeout
get's executed from the firstuseEffect
, there is a newappRoot
from the seconduseEffect
, and it get's unmounted whensetTimeout
function actually executes.The solution is to check ifappRoot
has been mounted or not. This will prevent unmounting twice.appRoot.unmount();
should be synchronous so that it executes immediately after the unmount. I think it's worth it even if we get the// setTimeout is used to disable the warn msg from react "Attempted to synchronously unmount a root while React was already rendering"
. Otherwise folks who use ketcher with strictmode would not be able to use ketcher at all.
closes #3711
Check list
#1234 – issue name