tiptap icon indicating copy to clipboard operation
tiptap copied to clipboard

Error: flushSync was called from inside a lifecycle method in <PureEditorContent>

Open diegoulloao opened this issue 2 years ago • 29 comments

What’s the bug you are facing?

The component import { EditorContent } from "@tiptap/react" is crashing for some reason.

I'm getting the following error in console:

Uncaught Error: flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.
    at flushSync (react-dom.development.js:21917:1)
    at PureEditorContent.maybeFlushSync (EditorContent.tsx:82:1)
    at PureEditorContent.removeRenderer (EditorContent.tsx:100:1)
    at ReactRenderer.destroy (ReactRenderer.tsx:93:1)
    at ReactNodeView.destroy (ReactNodeViewRenderer.tsx:173:1)
...

More specifically here:

The above error occurred in the <PureEditorContent> component:
    in PureEditorContent
    in PureEditorContent (at TipTap.js:154)
    in div (at TipTap.js:145)
...

Reduced code:

const TipTap = ({ editor, ...props }) => {
  return (
    <div className="tip-tap-editor-container text-editor">
      <EditorContent className="tip-tap-editor-content mt-5" editor={editor} />
    </div>
  )
}

If I remove the <EditorContent> the app doesn't crash.

Not sure if this bug is only related to our implementation. Anyway, any help, clue or information is welcome in order to fix this issue which is urgent.

Which browser was this experienced in? Are any special extensions installed?

Google Chrome Version 108.0.5359.124 (Official Build) (arm64)

macOs ventura 13.1

How can we reproduce the bug on our side?

Not sure.

Can you provide a CodeSandbox?

No response

What did you expect to happen?

Not crashing.

Anything to add? (optional)

Tip-tap package versions:

{
    "@tiptap/extension-color": "^2.0.0-beta.209",
    "@tiptap/extension-highlight": "^2.0.0-beta.209",
    "@tiptap/extension-image": "^2.0.0-beta.209",
    "@tiptap/extension-link": "^2.0.0-beta.209",
    "@tiptap/extension-placeholder": "^2.0.0-beta.209",
    "@tiptap/extension-text-style": "^2.0.0-beta.209",
    "@tiptap/extension-underline": "^2.0.0-beta.209",
    "@tiptap/react": "^2.0.0-beta.209",
    "@tiptap/starter-kit": "^2.0.0-beta.209",
}

React version: 16.13.1 Node version: v14.19.1

You can find the entire log here: tiptap.log


Note: my app depends of this node version only

Did you update your dependencies?

  • [X] Yes, I’ve updated my dependencies to use the latest version of all packages.

Are you sponsoring us?

  • [ ] Yes, I’m a sponsor. 💖

diegoulloao avatar Dec 28 '22 15:12 diegoulloao

I'm also experiencing the same errors after an update from 2.0.0-beta.202 to 2.0.0-beta.209.

From a real quick search, it looks like #3331 may be the only changes related to this error between the 2 versions.

HiDeoo avatar Dec 28 '22 16:12 HiDeoo

There is a PR addressing this issue: https://github.com/ueberdosis/tiptap/pull/3533

kolyagora avatar Dec 29 '22 18:12 kolyagora

PR #3533 should fix this issue then.

diegoulloao avatar Dec 30 '22 04:12 diegoulloao

+1

JosephHalter avatar Jan 15 '23 10:01 JosephHalter

@bdbch I am still experiencing this bug, I am using tiptap v2.0.3. Any fix or workaround?, It mainly crashes the app when the editor is unmounting or when the user is navigating away from the page containing editor. Can we reopen this issue?

arpit016 avatar Jun 27 '23 09:06 arpit016

I'm having this as well with 2.0.3

Hideman85 avatar Jun 29 '23 15:06 Hideman85

Could you create a replicatable sandbox for us? @Hideman85 @arpit016 so we can verify the issue still exist?

bdbch avatar Jun 29 '23 23:06 bdbch

@bdbch Still occurs in 2.0.4 -- here's a code sandbox: https://codesandbox.io/s/github/rbruels/tiptap-3580-sandbox

rbruels avatar Aug 04 '23 19:08 rbruels

Moved back to the backlog

bdbch avatar Aug 05 '23 14:08 bdbch

For what it's worth, testing locally for us and removing the flushSync call all-together of course stopped the error. Interestingly though through testing a bunch of our custom Nodes and navigating across multiple dynamically re-initialised editors, nothing else seemed to be off.

I assume there is a good reason for using flushSync but it isn't super obvious from the code alone what that is 🤔

benjackwhite avatar Aug 07 '23 07:08 benjackwhite

Fwiw I've never seen this occur over hundreds of hours building our TipTap/React editor (but mostly using 2.1.0-rc.*.) I wonder what the cause could be.

Nantris avatar Aug 12 '23 19:08 Nantris

@Slapbox Feel free to check my code sandbox — see if you can reproduce too. Maybe you’ll have an idea why it’s happening

rbruels avatar Aug 12 '23 21:08 rbruels

Ah I didn't realize the issue was specific to ReactNodeViewRenderer rather than useEditor/EditorContent. We don't use ReactNodeViewRenderer, so I guess that explains never seeing it.

Relink to the relevant code sandbox for convenience: https://codesandbox.io/s/github/rbruels/tiptap-3580-sandbox

Nantris avatar Aug 12 '23 23:08 Nantris

In my situation, I was experiencing poor performance and lag as the number of lines in a Paragraph node with a NodeView increased. This significantly impacted the user experience during text input. However, when I changed the maybeFlushSync(fn: () => void) method from:

if (this.initialized) {
  flushSync(fn);
} else {
  fn();
}

to:

if (this.initialized) {
  fn();
} else {
  fn();
}

The lag and performance issues were resolved. I am just not sure what potential risks this change might introduce.

totorofly avatar Aug 28 '23 01:08 totorofly

Experienced this after updating from 2.0.0-beta.220 to 2.1.7. Seems to have been caused by using setContent inside a useEffect. Moving the initialize editor content to useEditor({ content: content seem to have fixed it for me.

offending code inside useEffect:

editor?.commands?.setContent({
  type: "doc",
  content: doc?.content || []
});

philipaarseth avatar Sep 03 '23 12:09 philipaarseth

We are running into this as well for the same reason as @philipaarseth (imperatively updating content in a useEffect).

Since we depend on updating content within an effect like this, I found that wrapping the offending setContent inside a queueMicrotask also makes the error go away... but watching this issue for a proper fix 😄

essmahr avatar Sep 13 '23 17:09 essmahr

FYI: We also struggled with this, but after a bump from 2.0.0-beta.209 to 2.1.13 the issue disappeared 🎉

Aldredcz avatar Jan 12 '24 17:01 Aldredcz

Still experiencing the error with 2.1.13 or 2.1.16

ccreusat avatar Jan 18 '24 16:01 ccreusat

Putting logic inside queueMicrotask(..) solved perfectly! Thanks.

semanticist21 avatar Apr 05 '24 01:04 semanticist21

still getting this in 2.3.0

fridaystreet avatar Apr 25 '24 05:04 fridaystreet

Same here. Still not fixed in 2.30 and my console is just getting flooded in the flushSync errors.

rfdrake27 avatar Apr 27 '24 20:04 rfdrake27

I'm having this problem as well with 2.4.0.

I tried implementing a basic example from the TipTap docs and got the crash as well, the counter here: https://tiptap.dev/docs/editor/guide/node-views/react

Adding the queueMicrotask fix here back in as a patch fixes the issue for me: https://github.com/ueberdosis/tiptap/commit/aa4389883aead90fa16e804c672dc269b9a1292a

mhogryd avatar Jun 25 '24 00:06 mhogryd

Should be resolved with tiptap 2.5 since we no longer have to flushSync anymore

nperez0111 avatar Jul 26 '24 19:07 nperez0111

@nperez0111 still facing the same issue with 2.5.9

Warning: flushSync was called from inside a lifecycle method. React cannot flush when React is already rendering. Consider moving this call to a scheduler task or micro task.

Aslam97 avatar Aug 07 '24 05:08 Aslam97

I can confirm it's still present on 2.5.9 as well.

rfdrake27 avatar Aug 07 '24 05:08 rfdrake27

You are using a React nodeview? Or is this with useEditor?

I must've read the issue incorrectly. Tiptap 2.5 fixes useEditor, node views will be resolved with: https://github.com/ueberdosis/tiptap/pull/5273

nperez0111 avatar Aug 07 '24 06:08 nperez0111

I don't see this exact issue anymore but I do sometimes still see: Warning: Attempted to synchronously unmount a root while React was already rendering. React cannot finish unmounting the root until the current render has completed, which may lead to a race condition PureEditorContent

With useEditor.

I think this only occurs when swapping the editor out for a new one (eg user changes the selected content) but we're not breaking any rules of React or of TipTap as far as I can tell, so I wouldn't expect this.

Nantris avatar Aug 08 '24 02:08 Nantris

PureEditorContent is to do with React nodeviews: https://github.com/ueberdosis/tiptap/blob/32ed87b409207897753c65b2e7c44c1a64d3173d/packages/react/src/EditorContent.tsx#L88-L99

So not yet resolved, but will be with https://github.com/ueberdosis/tiptap/pull/5273

nperez0111 avatar Aug 08 '24 06:08 nperez0111

Ah apologies. I was pretty sure I'd seen it on a page where we used none, but I'm probably mistaken about that.

Nantris avatar Aug 08 '24 07:08 Nantris

This should now be resolved with 2.6.0

nperez0111 avatar Aug 13 '24 07:08 nperez0111