Browse Source

fix: lazy load whiteboards

Tienson Qin 1 year ago
parent
commit
b5b85dd44d

+ 15 - 18
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -4,7 +4,6 @@
             ["path" :as node-path]
             [clojure.string :as string]
             [logseq.db.sqlite.util :as sqlite-util]
-            [logseq.db :as ldb]
             [logseq.common.util.date-time :as date-time-util]
             [logseq.common.util :as common-util]))
 
@@ -26,26 +25,24 @@
   (let [get-children (fn [col]
                        (map (fn [e]
                               (select-keys e [:db/id :block/uuid :block/page :block/left :block/parent]))
-                            col))]
-    (if (common-util/uuid-string? name)   ; block
-      (let [id (uuid name)
-            block (d/entity db [:block/uuid id])]
-        (when block
-          (let [result {:block (d/pull db '[*] (:db/id block))}]
-            (if children?
-              (let [children (->> (ldb/get-block-children-ids db id)
-                                  (map #(d/entity db [:block/uuid %])))]
-                (assoc result :children (get-children children)))
-              result))
-          (cond->
-           {:block (d/pull db '[*] (:db/id block))}
-            children?
-            (assoc :children (get-children (:block/_parent block))))))
-      (when-let [block (d/entity db [:block/name name])]
+                            col))
+        uuid? (common-util/uuid-string? name)
+        block (when uuid?
+                (let [id (uuid name)]
+                  (d/entity db [:block/uuid id])))]
+    (if (and block (not (:block/name block))) ; not a page
+      (cond->
+       {:block (d/pull db '[*] (:db/id block))}
+        children?
+        (assoc :children (get-children (:block/_parent block))))
+      (when-let [block (or block (d/entity db [:block/name name]))]
         (cond->
          {:block (d/pull db '[*] (:db/id block))}
           children?
-          (assoc :children (get-children (:block/_page block))))))))
+          (assoc :children
+                 (if (contains? (:block/type block) "whiteboard")
+                   (d/pull-many db '[*] (map :db/id (:block/_page block)))
+                   (get-children (:block/_page block)))))))))
 
 (defn get-latest-journals
   [db n]

+ 5 - 2
src/main/frontend/components/whiteboard.cljs

@@ -20,7 +20,8 @@
             [promesa.core :as p]
             [rum.core :as rum]
             [shadow.loader :as loader]
-            [frontend.config :as config]))
+            [frontend.config :as config]
+            [frontend.db.async :as db-async]))
 
 (defonce tldraw-loaded? (atom false))
 (rum/defc tldraw-app < rum/reactive
@@ -39,13 +40,15 @@
   {:init (fn [state]
            (p/let [_ (loader/load :tldraw)]
              (reset! tldraw-loaded? true))
+           (let [page-name (first (:rum/args state))]
+             (db-async/<get-block-and-children (state/get-current-repo) page-name))
            state)}
   [page-name]
   (let [loaded? (rum/react tldraw-loaded?)
         tldr (whiteboard-handler/page-name->tldr! page-name)
         generate-preview (when loaded?
                            (resolve 'frontend.extensions.tldraw/generate-preview))]
-    (when generate-preview
+    (when (and generate-preview (not (state/sub-block-unloaded? page-name)))
       (generate-preview tldr))))
 
 ;; TODO: use frontend.ui instead of making a new one

+ 21 - 15
src/main/frontend/extensions/tldraw.cljs

@@ -22,7 +22,8 @@
             [promesa.core :as p]
             [rum.core :as rum]
             [frontend.ui :as ui]
-            [frontend.components.whiteboard :as whiteboard]))
+            [frontend.components.whiteboard :as whiteboard]
+            [frontend.db.async :as db-async]))
 
 (def tldraw (r/adapt-class (gobj/get TldrawLogseq "App")))
 
@@ -201,21 +202,26 @@
             :model data})])
 
 (rum/defc tldraw-app-inner < rum/reactive
+  {:init (fn [state]
+           (let [page-name (first (:rum/args state))]
+             (db-async/<get-block-and-children (state/get-current-repo) page-name)
+             state))}
   [page-name block-id loaded-app set-loaded-app]
-  (let [populate-onboarding? (whiteboard-handler/should-populate-onboarding-whiteboard? page-name)
-        on-mount (fn [^js tln]
-                   (when tln
-                     (set! (.-appUndo tln) undo)
-                     (set! (.-appRedo tln) redo)
-                     (when-let [^js api (gobj/get tln "api")]
-                       (p/then (when populate-onboarding?
-                                 (whiteboard-handler/populate-onboarding-whiteboard api))
-                               #(do (whiteboard-handler/cleanup! (.-currentPage tln))
-                                    (state/focus-whiteboard-shape tln block-id)
-                                    (set-loaded-app tln))))))
-        data (whiteboard-handler/page-name->tldr! page-name)]
-    (when data
-      (tldraw-inner page-name data populate-onboarding? loaded-app on-mount))))
+  (when-not (state/sub-block-unloaded? page-name)
+    (let [populate-onboarding? (whiteboard-handler/should-populate-onboarding-whiteboard? page-name)
+          on-mount (fn [^js tln]
+                     (when tln
+                       (set! (.-appUndo tln) undo)
+                       (set! (.-appRedo tln) redo)
+                       (when-let [^js api (gobj/get tln "api")]
+                         (p/then (when populate-onboarding?
+                                   (whiteboard-handler/populate-onboarding-whiteboard api))
+                                 #(do (whiteboard-handler/cleanup! (.-currentPage tln))
+                                      (state/focus-whiteboard-shape tln block-id)
+                                      (set-loaded-app tln))))))
+          data (whiteboard-handler/page-name->tldr! page-name)]
+      (when data
+        (tldraw-inner page-name data populate-onboarding? loaded-app on-mount)))))
 
 (rum/defc tldraw-app
   [page-name block-id]