diff --git a/src/main/frontend/handler/worker.cljs b/src/main/frontend/handler/worker.cljs new file mode 100644 index 000000000..0972a9726 --- /dev/null +++ b/src/main/frontend/handler/worker.cljs @@ -0,0 +1,26 @@ +(ns frontend.handler.worker + (:require [cljs-bean.core :as bean] + [frontend.handler.file :as file-handler] + [frontend.handler.notification :as notification] + [clojure.edn :as edn])) + +(defmulti handle identity) + +(defmethod handle :write-files [_ {:keys [repo files]}] + (file-handler/alter-files repo files {})) + +(defmethod handle :notification [_ data] + (apply notification/show! (edn/read-string data))) + +(defmethod handle :default [_ data] + (prn :debug "Worker data not handled: " data)) + +(defn handle-message! + [^js worker] + (assert worker "worker doesn't exists") + (set! (.-onmessage worker) + (fn [event] + (let [data (.-data event)] + (when-not (= (.-type data) "RAW") + (let [[e payload] (bean/->clj data)] + (handle (keyword e) payload))))))) diff --git a/src/main/frontend/persist_db/browser.cljs b/src/main/frontend/persist_db/browser.cljs index 92f813cc4..dd29a119f 100644 --- a/src/main/frontend/persist_db/browser.cljs +++ b/src/main/frontend/persist_db/browser.cljs @@ -12,7 +12,8 @@ [frontend.state :as state] [electron.ipc :as ipc] [frontend.modules.outliner.datascript :as outliner-db] - [clojure.edn :as edn])) + [clojure.edn :as edn] + [frontend.handler.worker :as worker-handler])) (defonce *sqlite (atom nil)) @@ -31,6 +32,7 @@ "/static/js/db-worker.js") worker (js/Worker. (str worker-url "?electron=" (util/electron?))) sqlite (Comlink/wrap worker)] + (worker-handler/handle-message! worker) (reset! *sqlite sqlite) (-> (p/let [_ (.init sqlite)] (ask-persist-permission!)) diff --git a/src/main/frontend/worker/file.cljs b/src/main/frontend/worker/file.cljs index 738465361..1e1f47a11 100644 --- a/src/main/frontend/worker/file.cljs +++ b/src/main/frontend/worker/file.cljs @@ -11,7 +11,8 @@ [datascript.core :as d] [logseq.db :as ldb] [malli.core :as m] - [frontend.worker.state :as state])) + [frontend.worker.state :as state] + [goog.object :as gobj])) (defonce file-writes-chan (let [coercer (m/coercer [:catn @@ -81,12 +82,12 @@ (doseq [[repo page-id outliner-op] (set (map #(take 3 %) pages))] ; remove time to dedupe pages to write (try (do-write-file! repo conn page-id outliner-op context) (catch :default e - ;; FIXME: notification - ;; (notification/show! - ;; [:div - ;; [:p "Write file failed, please copy the changes to other editors in case of losing data."] - ;; "Error: " (str (gobj/get e "stack"))] - ;; :error) + (worker-util/post-message :notification + (pr-str + [[:div + [:p "Write file failed, please copy the changes to other editors in case of losing data."] + "Error: " (str (gobj/get e "stack"))] + :error])) (log/error :file/write-file-error {:error e})))))) (defn sync-to-file @@ -94,7 +95,6 @@ (when (and repo page-id (not (:created-from-journal-template? tx-meta)) (not (:delete-files? tx-meta))) - (prn :debug :sync-to-file :repo repo :page-id page-id) (async/put! file-writes-chan [repo page-id (:outliner-op tx-meta) (tc/to-long (t/now))]))) (defn file-content repo db tree {:init-level init-level} context))] (when-not (and (string/blank? new-content) (not blocks-just-deleted?)) (let [files [[file-path new-content]]] - (prn :debug :write-file :file-path file-path :content new-content) - ;; TODO: send files to main thread to save - ;; (file-handler/alter-files-handler! repo files {} {}) - ))) + (when (seq files) + (util/post-message :write-files {:repo repo :files files}))))) ;; In e2e tests, "card" page in db has no :file/path (js/console.error "File path from page-block is not valid" page-block tree)))) diff --git a/src/main/frontend/worker/util.cljs b/src/main/frontend/worker/util.cljs index 17568cd58..03112fcc7 100644 --- a/src/main/frontend/worker/util.cljs +++ b/src/main/frontend/worker/util.cljs @@ -9,7 +9,8 @@ [clojure.core.async :as async] [cljs.core.async.impl.channels :refer [ManyToManyChannel]] [cljs-time.coerce :as tc] - [cljs-time.core :as t])) + [cljs-time.core :as t] + [cljs-bean.core :as bean])) (defonce db-version-prefix "logseq_db_") (defonce local-db-prefix "logseq_local_") @@ -136,3 +137,7 @@ (defn time-ms [] (tc/to-long (t/now))) + +(defn post-message + [type data] + (.postMessage js/self (bean/->js [type data])))