From 7a4251856a6187750145a55546358ce63c940eb7 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 2 Feb 2024 00:20:41 +0800 Subject: [PATCH] Revert "fix: enable promise usage in outliner-ui/transact!" This reverts commit 95cd7d51fca1fcbe281fafbb38571a87547a208b. --- deps/outliner/src/logseq/outliner/core.cljs | 18 ++-- .../src/logseq/outliner/transaction.cljc | 46 +++++----- src/main/frontend/db/async.cljs | 12 --- src/main/frontend/db_worker.cljs | 2 +- src/main/frontend/handler/dnd.cljs | 3 +- src/main/frontend/handler/editor.cljs | 83 ++++++++++--------- .../frontend/handler/file_based/editor.cljs | 3 +- .../handler/file_based/page_property.cljs | 3 +- src/main/frontend/modules/outliner/ui.cljc | 3 +- src/main/logseq/api.cljs | 34 +++++--- 10 files changed, 98 insertions(+), 109 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 1e66f1a59..26a38af31 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -1130,27 +1130,23 @@ ;;; ### write-operations have side-effects (do transactions) ;;;;;;;;;;;;;;;; -(def *transaction-data +(def ^:private ^:dynamic *transaction-data* "Stores transaction-data that are generated by one or more write-operations, see also `logseq.outliner.transaction/transact!`" - (atom nil)) + nil) -(def #_:clj-kondo/ignore *transaction-opts +(def ^:private ^:dynamic #_:clj-kondo/ignore *transaction-opts* "Stores transaction opts that are generated by one or more write-operations, see also `logseq.outliner.transaction/transact!`" - (atom nil)) - -(defn clear-and-get-tx-data! - [] - (let [result @*transaction-data] - (reset! *transaction-data nil) - result)) + nil) (defn- op-transact! [fn-var & args] {:pre [(var? fn-var)]} + (when (nil? *transaction-data*) + (throw (js/Error. (str (:name (meta fn-var)) " is not used in (transact! ...)")))) (let [result (apply @fn-var args)] - (swap! *transaction-data conj (select-keys result [:tx-data :tx-meta])) + (conj! *transaction-data* (select-keys result [:tx-data :tx-meta])) result)) (defn save-block! diff --git a/deps/outliner/src/logseq/outliner/transaction.cljc b/deps/outliner/src/logseq/outliner/transaction.cljc index c91b1c08b..87be8019f 100644 --- a/deps/outliner/src/logseq/outliner/transaction.cljc +++ b/deps/outliner/src/logseq/outliner/transaction.cljc @@ -2,8 +2,7 @@ "Provides a wrapper around logseq.outliner.datascript/transact! using transient state from logseq.outliner.core" #?(:cljs (:require-macros [logseq.outliner.transaction])) - #?(:cljs (:require [malli.core :as m] - [promesa.core :as p]))) + #?(:cljs (:require [malli.core :as m]))) #_:clj-kondo/ignore (def ^:private transact-opts [:or :symbol :map]) @@ -29,37 +28,34 @@ (move-blocks! ...) (delete-blocks! ...))" [opts & body] - `(let [transact-data# logseq.outliner.core/*transaction-data - transaction-opts# logseq.outliner.core/*transaction-opts + `(let [transact-data# logseq.outliner.core/*transaction-data* + transaction-opts# logseq.outliner.core/*transaction-opts* opts*# ~opts _# (assert (or (map? opts*#) (symbol? opts*#)) (str "opts is not a map or symbol, type: " (type opts*#))) - opts# (if @transact-data# + opts# (if transact-data# (assoc opts*# :nested-transaction? true) opts*#)] - (if @transact-data# + (if transact-data# (do - (when @transaction-opts# - (swap! transaction-opts# conj opts#)) + (when transaction-opts# + (conj! transaction-opts# opts#)) ~@body) (let [transaction-args# (cond-> {} (get opts*# :persist-op? true) (assoc :persist-op? true))] - (reset! logseq.outliner.core/*transaction-data []) - (reset! logseq.outliner.core/*transaction-opts [opts#]) - (p/do! - ~@body - (let [r# @logseq.outliner.core/*transaction-data - tx# (mapcat :tx-data r#) + (binding [logseq.outliner.core/*transaction-data* (transient []) + logseq.outliner.core/*transaction-opts* (transient [])] + (conj! logseq.outliner.core/*transaction-opts* opts#) + ~@body + (let [r# (persistent! logseq.outliner.core/*transaction-data*) + tx# (mapcat :tx-data r#) ;; FIXME: should we merge all the tx-meta? - tx-meta# (first (map :tx-meta r#)) - all-tx# (concat tx# (:additional-tx opts#)) - o# @logseq.outliner.core/*transaction-opts - full-opts# (apply merge (reverse o#)) - opts## (merge (dissoc full-opts# :additional-tx :current-block :nested-transaction?) tx-meta#)] + tx-meta# (first (map :tx-meta r#)) + all-tx# (concat tx# (:additional-tx opts#)) + o# (persistent! logseq.outliner.core/*transaction-opts*) + full-opts# (apply merge (reverse o#)) + opts## (merge (dissoc full-opts# :additional-tx :current-block :nested-transaction?) tx-meta#)] - (when (seq all-tx#) ;; If it's empty, do nothing - (when-not (:nested-transaction? opts#) ; transact only for the whole transaction - (logseq.outliner.datascript/transact! all-tx# (dissoc opts## :transact-opts) (:transact-opts opts##)))) - - (reset! logseq.outliner.core/*transaction-data nil) - (reset! logseq.outliner.core/*transaction-opts nil))))))) + (when (seq all-tx#) ;; If it's empty, do nothing + (when-not (:nested-transaction? opts#) ; transact only for the whole transaction + (logseq.outliner.datascript/transact! all-tx# (dissoc opts## :transact-opts) (:transact-opts opts##)))))))))) diff --git a/src/main/frontend/db/async.cljs b/src/main/frontend/db/async.cljs index 825e3c779..bbb3172d4 100644 --- a/src/main/frontend/db/async.cljs +++ b/src/main/frontend/db/async.cljs @@ -212,15 +212,3 @@ (->> result db-model/sort-by-left-recursive db-utils/group-by-page))))))) - -;; TODO: perf improvement, some operations such as delete-block doesn't need to load the full page -;; instead, the db worker should provide those calls -(defn right needs to point its `left` to block->left - (when (and block-right (not= (:db/id (:block/parent prev-block)) - (:db/id (:block/parent block)))) - (outliner-save-block! {:db/id (:db/id block-right) - :block/left (:db/id (:block/left block))})) + ;; block->right needs to point its `left` to block->left + (when (and block-right (not= (:db/id (:block/parent prev-block)) + (:db/id (:block/parent block)))) + (outliner-save-block! {:db/id (:db/id block-right) + :block/left (:db/id (:block/left block))})) ;; update prev-block's children to point to the refed block - (when (or (:block/collapsed? prev-block) - (= (:db/id prev-block) (:db/id (:block/parent block)))) - (let [children (:block/_parent prev-block)] - (doseq [child children] - (when-not (= (:db/id child) (:db/id block)) - (outliner-save-block! {:db/id (:db/id child) - :block/parent (:db/id block) - :block/left (:db/id block)}))))) + (when (or (:block/collapsed? prev-block) + (= (:db/id prev-block) (:db/id (:block/parent block)))) + (let [children (:block/_parent prev-block)] + (doseq [child children] + (when-not (= (:db/id child) (:db/id block)) + (outliner-save-block! {:db/id (:db/id child) + :block/parent (:db/id block) + :block/left (:db/id block)}))))) ;; parent will be removed - (when (= (:db/id prev-block) (:db/id (:block/parent block))) - (when-let [parent-right (outliner-core/get-right-sibling (db/get-db) (:db/id prev-block))] - (outliner-save-block! {:db/id (:db/id parent-right) - :block/left (:db/id block)}))) + (when (= (:db/id prev-block) (:db/id (:block/parent block))) + (when-let [parent-right (outliner-core/get-right-sibling (db/get-db) (:db/id prev-block))] + (outliner-save-block! {:db/id (:db/id parent-right) + :block/left (:db/id block)}))) - (when db-based? - (outliner-save-block! {:db/id (:db/id block) - :block/properties new-properties})))) + (when db-based? + (outliner-save-block! {:db/id (:db/id block) + :block/properties new-properties}))) - (p/do! - (delete-block-fn block) - (save-block! repo prev-block new-content {}) - (when db-based? - (outliner-save-block! {:db/id (:db/id prev-block) - :block/properties new-properties}))))) + (do + (delete-block-fn block) + (save-block! repo prev-block new-content {}) + (when db-based? + (outliner-save-block! {:db/id (:db/id prev-block) + :block/properties new-properties}))))) :else (delete-block-fn block))))))))))))) @@ -2861,6 +2861,7 @@ (state/set-editor-last-pos! pos) (block-handler/indent-outdent-blocks! [block] indent? save-current-block!)))) + (defn keydown-tab-handler [direction] (fn [e] diff --git a/src/main/frontend/handler/file_based/editor.cljs b/src/main/frontend/handler/file_based/editor.cljs index e5fde6f28..c3e82e7c1 100644 --- a/src/main/frontend/handler/file_based/editor.cljs +++ b/src/main/frontend/handler/file_based/editor.cljs @@ -17,8 +17,7 @@ [frontend.handler.file-based.property :as file-property-handler] [frontend.handler.file-based.property.util :as property-util] [logseq.db.frontend.schema :as db-schema] - [logseq.common.util.block-ref :as block-ref] - [promesa.core :as p])) + [logseq.common.util.block-ref :as block-ref])) (defn- remove-non-existed-refs! [refs] diff --git a/src/main/frontend/handler/file_based/page_property.cljs b/src/main/frontend/handler/file_based/page_property.cljs index 75f5142cc..6d42544d8 100644 --- a/src/main/frontend/handler/file_based/page_property.cljs +++ b/src/main/frontend/handler/file_based/page_property.cljs @@ -5,8 +5,7 @@ [logseq.outliner.core :as outliner-core] [frontend.modules.outliner.ui :as ui-outliner-tx] [frontend.state :as state] - [frontend.util :as util] - [promesa.core :as p])) + [frontend.util :as util])) (defn insert-property [format content key value] diff --git a/src/main/frontend/modules/outliner/ui.cljc b/src/main/frontend/modules/outliner/ui.cljc index 983796ab0..5227d715f 100644 --- a/src/main/frontend/modules/outliner/ui.cljc +++ b/src/main/frontend/modules/outliner/ui.cljc @@ -3,8 +3,7 @@ #?(:cljs (:require-macros [frontend.modules.outliner.ui])) #?(:cljs (:require [frontend.state :as state] [frontend.config :as config] - [frontend.db :as db] - [promesa.core :as p]))) + [frontend.db :as db]))) #?(:cljs (do diff --git a/src/main/logseq/api.cljs b/src/main/logseq/api.cljs index 5c94606d7..7ce854337 100644 --- a/src/main/logseq/api.cljs +++ b/src/main/logseq/api.cljs @@ -615,12 +615,24 @@ (let [{:keys [pos] :or {pos :max}} (bean/->clj opts)] (editor-handler/edit-block! block pos block-uuid)))))) +;; TODO: perf improvement, some operations such as delete-block doesn't need to load the full page +;; instead, the db worker should provide those calls +(defn- clj opts) @@ -667,7 +679,7 @@ (def ^:export insert_batch_block (fn [block-uuid ^js batch-blocks ^js opts] - (p/let [block (db-async/clj batch-blocks)] (let [bb (if-not (vector? bb) (vector bb) bb) @@ -688,21 +700,21 @@ (def ^:export remove_block (fn [block-uuid ^js _opts] (p/let [repo (state/get-current-repo) - _ (db-async/clj opts))))) (def ^:export move_block (fn [src-block-uuid target-block-uuid ^js opts] - (p/let [_ (db-async/clj opts) move-to (cond (boolean before) @@ -735,7 +747,7 @@ (def ^:export get_previous_sibling_block (fn [block-uuid] (p/let [id (sdk-utils/uuid-or-throw-error block-uuid) - _ (db-async/vec-tree blocks page-name) @@ -849,7 +861,7 @@ (defn ^:export prepend_block_in_page [uuid-or-page-name content ^js opts] - (p/let [_ (db-async/