Przeglądaj źródła

fix: use flushSync when moving line editor since we need to read previous value after setting state (#5508)

* fix: use flushSync when moving line editor since we need to read previous value after setting state

* add comment
Aakansha Doshi 2 lat temu
rodzic
commit
3d5356cb8e
1 zmienionych plików z 7 dodań i 1 usunięć
  1. 7 1
      src/components/App.tsx

+ 7 - 1
src/components/App.tsx

@@ -1,4 +1,5 @@
 import React, { useContext } from "react";
+import { flushSync } from "react-dom";
 import { RoughCanvas } from "roughjs/bin/canvas";
 import rough from "roughjs/bin/rough";
 import clsx from "clsx";
@@ -2681,7 +2682,12 @@ class App extends React.Component<AppProps, AppState> {
         this.state.gridSize,
       );
       if (editingLinearElement !== this.state.editingLinearElement) {
-        this.setState({ editingLinearElement });
+        // Since we are reading from previous state which is not possible with
+        // automatic batching in React 18 hence using flush sync to synchronously
+        // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.
+        flushSync(() => {
+          this.setState({ editingLinearElement });
+        });
       }
       if (editingLinearElement.lastUncommittedPoint != null) {
         this.maybeSuggestBindingAtCursor(scenePointer);