fix: lazy load whiteboards

pull/10933/head
Tienson Qin 2024-01-29 18:54:52 +08:00
parent 0a5ca160f9
commit b5b85dd44d
3 changed files with 41 additions and 35 deletions

View File

@ -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]

View File

@ -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

View File

@ -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]