Răsfoiți Sursa

enhance: batch refresh UI after applying remote blocks change

Fixes LOG-3114
Tienson Qin 1 an în urmă
părinte
comite
1cad8aa9bd

+ 1 - 1
deps/outliner/src/logseq/outliner/core.cljs

@@ -259,7 +259,7 @@
   [repo conn date-formatter txs-state block m]
   (when (sqlite-util/db-based-graph? repo)
     (let [content (:block/content m)
-          block' (if (and content (not (re-find db-content/special-id-ref-pattern content))) ; not raw content
+          block' (if (and (string? content) (not (re-find db-content/special-id-ref-pattern content))) ; not raw content
                    (assoc block :block/content content)
                    block)
           refs' (rebuild-block-refs repo conn date-formatter block' (:block/properties block))

+ 3 - 8
src/main/frontend/db/react.cljs

@@ -203,14 +203,9 @@
 
 (defn refresh!
   "Re-compute corresponding queries (from tx) and refresh the related react components."
-  [repo-url {:keys [tx-data tx-meta] :as tx} affected-keys]
-  (when repo-url
-    (if (get-in @state/state [:rtc/remote-batch-tx-state repo-url :in-transaction?])
-      (state/update-state! [:rtc/remote-batch-tx-state repo-url :txs]
-                           (fn [txs]
-                             (conj txs tx)))
-      (when (and (not (:skip-refresh? tx-meta)) (seq tx-data))
-        (refresh-affected-queries! repo-url affected-keys)))))
+  [repo-url affected-keys]
+  (when (and repo-url (seq affected-keys))
+    (refresh-affected-queries! repo-url affected-keys)))
 
 (defn set-key-value
   [repo-url key value]

+ 5 - 1
src/main/frontend/handler/worker.cljs

@@ -5,7 +5,8 @@
             [frontend.handler.notification :as notification]
             [frontend.state :as state]
             [promesa.core :as p]
-            [logseq.db :as ldb]))
+            [logseq.db :as ldb]
+            [frontend.db.react :as react]))
 
 (defmulti handle identity)
 
@@ -36,6 +37,9 @@
 (defmethod handle :sync-db-changes [_ _worker data]
   (state/pub-event! [:db/sync-changes data]))
 
+(defmethod handle :refresh-ui [_ _worker {:keys [affected-keys]}]
+  (react/refresh! (state/get-current-repo) affected-keys))
+
 (defmethod handle :default [_ _worker data]
   (prn :debug "Worker data not handled: " data))
 

+ 1 - 1
src/main/frontend/modules/outliner/pipeline.cljs

@@ -83,7 +83,7 @@
               (when (seq new-datoms)
                 (state/set-state! :editor/new-created-block-id (last (map :v new-datoms))))))
 
-          (react/refresh! repo tx-report affected-keys)
+          (react/refresh! repo affected-keys)
 
           (when-let [state (:ui/restore-cursor-state @state/state)]
             (when (or undo? redo?)

+ 0 - 2
src/main/frontend/state.cljs

@@ -291,8 +291,6 @@
       :rtc/downloading-graph-uuid            nil
       :rtc/graphs                            []
       :rtc/online-info                       (atom {})
-      ;; graph-url -> {:in-transaction? Boolean :txs []}
-      :rtc/remote-batch-tx-state             {}
 
       :user/info                             {:UserGroups (storage/get :user-groups)}
       :encryption/graph-parsing?             false

+ 6 - 1
src/main/frontend/worker/pipeline.cljs

@@ -6,6 +6,7 @@
             [frontend.worker.react :as worker-react]
             [frontend.worker.file :as file]
             [frontend.worker.util :as worker-util]
+            [frontend.worker.state :as worker-state]
             [logseq.db.frontend.validate :as db-validate]
             [logseq.db.sqlite.util :as sqlite-util]
             [frontend.worker.db.fix :as db-fix]
@@ -118,8 +119,12 @@
               final-tx-report (assoc tx-report'
                                      :tx-data full-tx-data
                                      :db-before (:db-before tx-report))
-              affected-query-keys (when-not (:importing? context)
+              batch-processing? (worker-state/rtc-batch-processing?)
+              affected-query-keys (when-not (or (:importing? context)
+                                                batch-processing?)
                                     (worker-react/get-affected-queries-keys final-tx-report))]
+          (when batch-processing?
+            (worker-state/conj-batch-txs! full-tx-data))
           {:tx-report final-tx-report
            :affected-keys affected-query-keys
            :deleted-block-uuids deleted-block-uuids

+ 11 - 5
src/main/frontend/worker/rtc/core.cljs

@@ -18,6 +18,7 @@
             [frontend.worker.rtc.ws :as ws]
             [frontend.worker.state :as worker-state]
             [frontend.worker.util :as worker-util]
+            [frontend.worker.react :as worker-react]
             [logseq.common.config :as common-config]
             [logseq.common.util :as common-util]
             [logseq.db :as ldb]
@@ -393,7 +394,7 @@
                        (not= (:content op-value)
                              (:block/raw-content b-ent)))
                   (assoc :block/content
-                         (db-content/special-id-ref->page @conn (:content op-value)))
+                         (db-content/db-special-id-ref->page @conn (:content op-value)))
 
                   (contains? key-set :updated-at)     (assoc :block/updated-at (:updated-at op-value))
                   (contains? key-set :created-at)     (assoc :block/created-at (:created-at op-value))
@@ -597,7 +598,7 @@
               update-page-ops (vals update-page-ops-map)
               remove-page-ops (vals remove-page-ops-map)]
 
-          ;; (worker-state/start-batch-tx-mode!)
+          (worker-state/start-batch-tx-mode!)
           (js/console.groupCollapsed "rtc/apply-remote-ops-log")
           (worker-util/profile :apply-remote-update-page-ops (apply-remote-update-page-ops repo conn date-formatter update-page-ops))
           (worker-util/profile :apply-remote-remove-ops (apply-remote-remove-ops repo conn date-formatter remove-ops))
@@ -605,9 +606,14 @@
           (worker-util/profile :apply-remote-update-ops (apply-remote-update-ops repo conn date-formatter update-ops))
           (worker-util/profile :apply-remote-remove-page-ops (apply-remote-remove-page-ops repo conn remove-page-ops))
           (js/console.groupEnd)
-          ;; (let [txs (worker-state/get-batch-txs)
-          ;;       affected-keys (worker-react/get-affected-queries-keys {:tx-data txs :db-after @conn})]
-          ;;   (worker-state/exit-batch-tx-mode!))
+          (let [txs (worker-state/get-batch-txs)]
+            (worker-state/exit-batch-tx-mode!)
+            (when (seq txs)
+              (let [affected-keys (worker-react/get-affected-queries-keys {:db-after @conn
+                                                                           :tx-data txs})]
+                (when (seq affected-keys)
+                  (worker-util/post-message :refresh-ui
+                                            {:affected-keys affected-keys})))))
 
           (op-mem-layer/update-local-tx! repo remote-t)
           (update-log state {:remote-update-map affected-blocks-map}))

+ 22 - 0
src/main/frontend/worker/state.cljs

@@ -10,6 +10,7 @@
 
                        :config {}
                        :git/current-repo nil
+                       :rtc/batch-processing? false
                        :rtc/remote-batch-txs nil
                        :rtc/downloading-graph? false}))
 
@@ -93,3 +94,24 @@
 (defn rtc-downloading-graph?
   []
   (:rtc/downloading-graph? @*state))
+
+(defn start-batch-tx-mode!
+  []
+  (swap! *state assoc :rtc/batch-processing? true))
+
+(defn rtc-batch-processing?
+  []
+  (:rtc/batch-processing? @*state))
+
+(defn get-batch-txs
+  []
+  (:rtc/remote-batch-txs @*state))
+
+(defn conj-batch-txs!
+  [tx-data]
+  (swap! *state update :rtc/remote-batch-txs (fn [data] (into data tx-data))))
+
+(defn exit-batch-tx-mode!
+  []
+  (swap! *state assoc :rtc/batch-processing? false)
+  (swap! *state assoc :rtc/remote-batch-txs nil))