mirror of https://github.com/logseq/logseq
fix: multiple windows clash (#8874)
* fix: multiple windows clash * enhance: force all the ipc callback result to be nilpull/8907/head
parent
b1c61c7241
commit
011860e486
|
@ -21,6 +21,11 @@
|
|||
[frontend.ui :as ui]
|
||||
[promesa.core :as p]))
|
||||
|
||||
(defn- safe-api-call
|
||||
"Force the callback result to be nil, otherwise, ipc calls could lead to
|
||||
window crash."
|
||||
[k f]
|
||||
(js/window.apis.on k (fn [data] (f data) nil)))
|
||||
|
||||
(defn persist-dbs!
|
||||
[]
|
||||
|
@ -35,56 +40,52 @@
|
|||
|
||||
(defn listen-persistent-dbs!
|
||||
[]
|
||||
;; TODO: move "file-watcher" to electron.ipc.channels
|
||||
(js/window.apis.on
|
||||
"persistent-dbs"
|
||||
(fn [_req]
|
||||
(persist-dbs!))))
|
||||
(safe-api-call "persistent-dbs" (fn [_data] (persist-dbs!))))
|
||||
|
||||
|
||||
(defn ^:large-vars/cleanup-todo listen-to-electron!
|
||||
[]
|
||||
;; TODO: move "file-watcher" to electron.ipc.channels
|
||||
(js/window.apis.on "file-watcher"
|
||||
(safe-api-call "file-watcher"
|
||||
(fn [data]
|
||||
(let [{:keys [type payload]} (bean/->clj data)]
|
||||
(watcher-handler/handle-changed! type payload)
|
||||
(when (file-sync-handler/enable-sync?)
|
||||
(sync/file-watch-handler type payload)))))
|
||||
|
||||
(js/window.apis.on "file-sync-progress"
|
||||
(safe-api-call "file-sync-progress"
|
||||
(fn [data]
|
||||
(let [payload (bean/->clj data)]
|
||||
(state/set-state! [:file-sync/graph-state (:graphUUID payload) :file-sync/progress (:file payload)] payload))))
|
||||
|
||||
(js/window.apis.on "notification"
|
||||
(safe-api-call "notification"
|
||||
(fn [data]
|
||||
(let [{:keys [type payload]} (bean/->clj data)
|
||||
type (keyword type)
|
||||
comp [:div (str payload)]]
|
||||
(notification/show! comp type false))))
|
||||
|
||||
(js/window.apis.on "graphUnlinked"
|
||||
(safe-api-call "graphUnlinked"
|
||||
(fn [data]
|
||||
(let [repo (bean/->clj data)]
|
||||
(repo-handler/remove-repo! repo))))
|
||||
|
||||
(js/window.apis.on "setGitUsernameAndEmail"
|
||||
(safe-api-call "setGitUsernameAndEmail"
|
||||
(fn []
|
||||
(state/pub-event! [:modal/set-git-username-and-email])))
|
||||
|
||||
(js/window.apis.on "getCurrentGraph"
|
||||
(safe-api-call "getCurrentGraph"
|
||||
(fn []
|
||||
(when-let [graph (state/get-current-repo)]
|
||||
(ipc/ipc "setCurrentGraph" graph))))
|
||||
|
||||
(js/window.apis.on "redirect"
|
||||
(safe-api-call "redirect"
|
||||
(fn [data]
|
||||
(let [{:keys [payload]} (bean/->clj data)
|
||||
payload (update payload :to keyword)]
|
||||
(route-handler/redirect! payload))))
|
||||
|
||||
(js/window.apis.on "redirectWhenExists"
|
||||
(safe-api-call "redirectWhenExists"
|
||||
;; Redirect to the given page or block when the provided page or block exists.
|
||||
;; Either :page-name or :block-id is required.
|
||||
;; :page-name : the original-name of the page.
|
||||
|
@ -111,7 +112,7 @@
|
|||
(route-handler/redirect-to-page! db-page-name)
|
||||
(notification/show! (str "Open link failed. File `" file "` doesn't exist in the graph.") :error false))))))
|
||||
|
||||
(js/window.apis.on "dbsync"
|
||||
(safe-api-call "dbsync"
|
||||
(fn [data]
|
||||
(let [{:keys [graph tx-data]} (bean/->clj data)
|
||||
tx-data (db/string->db (:data tx-data))]
|
||||
|
@ -119,7 +120,7 @@
|
|||
(d/transact! conn tx-data {:dbsync? true}))
|
||||
(ui-handler/re-render-root!))))
|
||||
|
||||
(js/window.apis.on "persistGraph"
|
||||
(safe-api-call "persistGraph"
|
||||
;; electron is requesting window for persisting a graph in it's db
|
||||
;; fire back "broadcastPersistGraphDone" on done
|
||||
(fn [data]
|
||||
|
@ -138,30 +139,29 @@
|
|||
:on-error error-f}]
|
||||
(repo-handler/persist-db! repo handlers))))
|
||||
|
||||
(js/window.apis.on "foundInPage"
|
||||
(safe-api-call "foundInPage"
|
||||
(fn [data]
|
||||
(let [data' (bean/->clj data)]
|
||||
(state/set-state! [:ui/find-in-page :matches] data')
|
||||
(dom/remove-style! (dom/by-id "search-in-page-input") :visibility)
|
||||
(dom/set-text! (dom/by-id "search-in-page-placeholder") "")
|
||||
(ui/focus-element "search-in-page-input")
|
||||
true)))
|
||||
(ui/focus-element "search-in-page-input"))))
|
||||
|
||||
(js/window.apis.on "loginCallback"
|
||||
(safe-api-call "loginCallback"
|
||||
(fn [code]
|
||||
(user/login-callback code)))
|
||||
|
||||
(js/window.apis.on "quickCapture"
|
||||
(safe-api-call "quickCapture"
|
||||
(fn [args]
|
||||
(state/pub-event! [:editor/quick-capture args])))
|
||||
|
||||
(js/window.apis.on "openNewWindowOfGraph"
|
||||
(safe-api-call "openNewWindowOfGraph"
|
||||
;; Handle open new window in renderer, until the destination graph doesn't rely on setting local storage
|
||||
;; No db cache persisting ensured. Should be handled by the caller
|
||||
(fn [repo]
|
||||
(ui-handler/open-new-window! repo)))
|
||||
|
||||
(js/window.apis.on "invokeLogseqAPI"
|
||||
(safe-api-call "invokeLogseqAPI"
|
||||
(fn [^js data]
|
||||
(let [sync-id (.-syncId data)
|
||||
method (.-method data)
|
||||
|
@ -179,7 +179,7 @@
|
|||
(catch js/Error e
|
||||
(ret-fn! {:error (.-message e)}))))))
|
||||
|
||||
(js/window.apis.on "syncAPIServerState"
|
||||
(safe-api-call "syncAPIServerState"
|
||||
(fn [^js data]
|
||||
(state/set-state! :electron/server (bean/->clj data)))))
|
||||
|
||||
|
|
|
@ -92,11 +92,13 @@
|
|||
(re-render-root! {}))
|
||||
([{:keys [clear-all-query-state?]
|
||||
:or {clear-all-query-state? false}}]
|
||||
{:post [(nil? %)]}
|
||||
(when-let [component (state/get-root-component)]
|
||||
(if clear-all-query-state?
|
||||
(db/clear-query-state!)
|
||||
(db/clear-query-state-without-refs-and-embeds!))
|
||||
(rum/request-render component))))
|
||||
(rum/request-render component))
|
||||
nil))
|
||||
|
||||
(defn highlight-element!
|
||||
[fragment]
|
||||
|
|
Loading…
Reference in New Issue