Browse Source

fix: ensure sequential running undo/redo

Tienson Qin 1 year ago
parent
commit
f90663df45
1 changed files with 34 additions and 28 deletions
  1. 34 28
      src/main/frontend/handler/history.cljs

+ 34 - 28
src/main/frontend/handler/history.cljs

@@ -38,32 +38,38 @@
       (route-handler/redirect! prev-route-data))
     (swap! state/state merge state)))
 
-(defn undo!
-  [e]
-  (when-let [repo (state/get-current-repo)]
-    (when-let [current-page-uuid-str (some->> (page-util/get-editing-page-id)
-                                              db/entity
-                                              :block/uuid
-                                              str)]
-      (when (db-transact/request-finished?)
-        (util/stop e)
-        (p/do!
-         (state/set-state! [:editor/last-replace-ref-content-tx repo] nil)
-         (editor/save-current-block!)
-         (state/clear-editor-action!)
-         (state/set-block-op-type! nil)
-         (let [^js worker @state/*db-worker]
-           (.undo worker repo current-page-uuid-str)))))))
+(let [*last-request (atom nil)]
+  (defn undo!
+    [e]
+    (p/do!
+     @*last-request
+     (when-let [repo (state/get-current-repo)]
+       (when-let [current-page-uuid-str (some->> (page-util/get-editing-page-id)
+                                                 db/entity
+                                                 :block/uuid
+                                                 str)]
+         (when (db-transact/request-finished?)
+           (util/stop e)
+           (p/do!
+            (state/set-state! [:editor/last-replace-ref-content-tx repo] nil)
+            (editor/save-current-block!)
+            (state/clear-editor-action!)
+            (state/set-block-op-type! nil)
+            (let [^js worker @state/*db-worker]
+              (reset! *last-request (.undo worker repo current-page-uuid-str))))))))))
 
-(defn redo!
-  [e]
-  (when-let [repo (state/get-current-repo)]
-    (when-let [current-page-uuid-str (some->> (page-util/get-editing-page-id)
-                                              db/entity
-                                              :block/uuid
-                                              str)]
-      (when (db-transact/request-finished?)
-        (util/stop e)
-        (state/clear-editor-action!)
-        (let [^js worker @state/*db-worker]
-          (.redo worker repo current-page-uuid-str))))))
+(let [*last-request (atom nil)]
+  (defn redo!
+    [e]
+    (p/do!
+     @*last-request
+     (when-let [repo (state/get-current-repo)]
+       (when-let [current-page-uuid-str (some->> (page-util/get-editing-page-id)
+                                                 db/entity
+                                                 :block/uuid
+                                                 str)]
+         (when (db-transact/request-finished?)
+           (util/stop e)
+           (state/clear-editor-action!)
+           (let [^js worker @state/*db-worker]
+             (reset! *last-request (.redo worker repo current-page-uuid-str)))))))))