mirror of https://github.com/logseq/logseq
Write files works
parent
ee12e58254
commit
580763844b
|
@ -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)))))))
|
|
@ -12,7 +12,8 @@
|
||||||
[frontend.state :as state]
|
[frontend.state :as state]
|
||||||
[electron.ipc :as ipc]
|
[electron.ipc :as ipc]
|
||||||
[frontend.modules.outliner.datascript :as outliner-db]
|
[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))
|
(defonce *sqlite (atom nil))
|
||||||
|
|
||||||
|
@ -31,6 +32,7 @@
|
||||||
"/static/js/db-worker.js")
|
"/static/js/db-worker.js")
|
||||||
worker (js/Worker. (str worker-url "?electron=" (util/electron?)))
|
worker (js/Worker. (str worker-url "?electron=" (util/electron?)))
|
||||||
sqlite (Comlink/wrap worker)]
|
sqlite (Comlink/wrap worker)]
|
||||||
|
(worker-handler/handle-message! worker)
|
||||||
(reset! *sqlite sqlite)
|
(reset! *sqlite sqlite)
|
||||||
(-> (p/let [_ (.init sqlite)]
|
(-> (p/let [_ (.init sqlite)]
|
||||||
(ask-persist-permission!))
|
(ask-persist-permission!))
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
[datascript.core :as d]
|
[datascript.core :as d]
|
||||||
[logseq.db :as ldb]
|
[logseq.db :as ldb]
|
||||||
[malli.core :as m]
|
[malli.core :as m]
|
||||||
[frontend.worker.state :as state]))
|
[frontend.worker.state :as state]
|
||||||
|
[goog.object :as gobj]))
|
||||||
|
|
||||||
(defonce file-writes-chan
|
(defonce file-writes-chan
|
||||||
(let [coercer (m/coercer [:catn
|
(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
|
(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)
|
(try (do-write-file! repo conn page-id outliner-op context)
|
||||||
(catch :default e
|
(catch :default e
|
||||||
;; FIXME: notification
|
(worker-util/post-message :notification
|
||||||
;; (notification/show!
|
(pr-str
|
||||||
;; [:div
|
[[:div
|
||||||
;; [:p "Write file failed, please copy the changes to other editors in case of losing data."]
|
[:p "Write file failed, please copy the changes to other editors in case of losing data."]
|
||||||
;; "Error: " (str (gobj/get e "stack"))]
|
"Error: " (str (gobj/get e "stack"))]
|
||||||
;; :error)
|
:error]))
|
||||||
(log/error :file/write-file-error {:error e}))))))
|
(log/error :file/write-file-error {:error e}))))))
|
||||||
|
|
||||||
(defn sync-to-file
|
(defn sync-to-file
|
||||||
|
@ -94,7 +95,6 @@
|
||||||
(when (and repo page-id
|
(when (and repo page-id
|
||||||
(not (:created-from-journal-template? tx-meta))
|
(not (:created-from-journal-template? tx-meta))
|
||||||
(not (:delete-files? 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))])))
|
(async/put! file-writes-chan [repo page-id (:outliner-op tx-meta) (tc/to-long (t/now))])))
|
||||||
|
|
||||||
(defn <ratelimit-file-writes!
|
(defn <ratelimit-file-writes!
|
||||||
|
|
|
@ -5,7 +5,8 @@
|
||||||
[logseq.common.path :as path]
|
[logseq.common.path :as path]
|
||||||
[datascript.core :as d]
|
[datascript.core :as d]
|
||||||
[logseq.db :as ldb]
|
[logseq.db :as ldb]
|
||||||
[frontend.worker.date :as worker-date]))
|
[frontend.worker.date :as worker-date]
|
||||||
|
[frontend.worker.util :as util]))
|
||||||
|
|
||||||
(defn- indented-block-content
|
(defn- indented-block-content
|
||||||
[content spaces-tabs]
|
[content spaces-tabs]
|
||||||
|
@ -149,10 +150,8 @@
|
||||||
(tree->file-content repo db tree {:init-level init-level} context))]
|
(tree->file-content repo db tree {:init-level init-level} context))]
|
||||||
(when-not (and (string/blank? new-content) (not blocks-just-deleted?))
|
(when-not (and (string/blank? new-content) (not blocks-just-deleted?))
|
||||||
(let [files [[file-path new-content]]]
|
(let [files [[file-path new-content]]]
|
||||||
(prn :debug :write-file :file-path file-path :content new-content)
|
(when (seq files)
|
||||||
;; TODO: send files to main thread to save
|
(util/post-message :write-files {:repo repo :files files})))))
|
||||||
;; (file-handler/alter-files-handler! repo files {} {})
|
|
||||||
)))
|
|
||||||
;; In e2e tests, "card" page in db has no :file/path
|
;; 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))))
|
(js/console.error "File path from page-block is not valid" page-block tree))))
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
[clojure.core.async :as async]
|
[clojure.core.async :as async]
|
||||||
[cljs.core.async.impl.channels :refer [ManyToManyChannel]]
|
[cljs.core.async.impl.channels :refer [ManyToManyChannel]]
|
||||||
[cljs-time.coerce :as tc]
|
[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 db-version-prefix "logseq_db_")
|
||||||
(defonce local-db-prefix "logseq_local_")
|
(defonce local-db-prefix "logseq_local_")
|
||||||
|
@ -136,3 +137,7 @@
|
||||||
(defn time-ms
|
(defn time-ms
|
||||||
[]
|
[]
|
||||||
(tc/to-long (t/now)))
|
(tc/to-long (t/now)))
|
||||||
|
|
||||||
|
(defn post-message
|
||||||
|
[type data]
|
||||||
|
(.postMessage js/self (bean/->js [type data])))
|
||||||
|
|
Loading…
Reference in New Issue