ソースを参照

fix: terminate parser and persist dbs when reloading the app (electron)

Tienson Qin 4 年 前
コミット
90c2bd7cc2
2 ファイル変更47 行追加24 行削除
  1. 27 23
      src/main/electron/listener.cljs
  2. 20 1
      src/main/frontend/handler.cljs

+ 27 - 23
src/main/electron/listener.cljs

@@ -11,34 +11,38 @@
             [frontend.handler.metadata :as metadata-handler]
             [frontend.handler.metadata :as metadata-handler]
             [frontend.ui :as ui]))
             [frontend.ui :as ui]))
 
 
+(defn persist-dbs!
+  []
+  (->
+   (p/let [repos (idb/get-nfs-dbs)
+           repos (-> repos
+                     (conj (state/get-current-repo))
+                     (distinct))]
+     (if (seq repos)
+       (do
+         (notification/show!
+          (ui/loading "Logseq is saving the graphs to your local file system, please wait for several seconds.")
+          :warning)
+         (doseq [repo repos]
+           (metadata-handler/set-pages-metadata! repo))
+         (js/setTimeout
+          (fn []
+            (-> (p/all (map db/persist! repos))
+                (p/then (fn []
+                          (ipc/ipc "persistent-dbs-saved")))))
+          100))
+       (ipc/ipc "persistent-dbs-saved")))
+   (p/catch (fn [error]
+              (js/console.error error)
+              (ipc/ipc "persistent-dbs-error")))))
+
 (defn listen-persistent-dbs!
 (defn listen-persistent-dbs!
   []
   []
   ;; TODO: move "file-watcher" to electron.ipc.channels
   ;; TODO: move "file-watcher" to electron.ipc.channels
   (js/window.apis.on
   (js/window.apis.on
    "persistent-dbs"
    "persistent-dbs"
-   (fn [req]
-     (->
-      (p/let [repos (idb/get-nfs-dbs)
-              repos (-> repos
-                        (conj (state/get-current-repo))
-                        (distinct))]
-        (if (seq repos)
-          (do
-            (notification/show!
-             (ui/loading "Logseq is saving the graphs to your local file system, please wait for several seconds.")
-             :warning)
-            (doseq [repo repos]
-              (metadata-handler/set-pages-metadata! repo))
-            (js/setTimeout
-             (fn []
-               (-> (p/all (map db/persist! repos))
-                   (p/then (fn []
-                             (ipc/ipc "persistent-dbs-saved")))))
-             100))
-          (ipc/ipc "persistent-dbs-saved")))
-      (p/catch (fn [error]
-                 (js/console.error error)
-                 (ipc/ipc "persistent-dbs-error")))))))
+   (fn [_req]
+     (persist-dbs!))))
 
 
 (defn listen-to-electron!
 (defn listen-to-electron!
   []
   []

+ 20 - 1
src/main/frontend/handler.cljs

@@ -29,7 +29,8 @@
             [promesa.core :as p]
             [promesa.core :as p]
             [frontend.ui :as ui]
             [frontend.ui :as ui]
             [frontend.error :as error]
             [frontend.error :as error]
-            [frontend.util.pool :as pool]))
+            [frontend.util.pool :as pool]
+            [electron.listener :as electron-listener]))
 
 
 (defn set-global-error-notification!
 (defn set-global-error-notification!
   []
   []
@@ -209,3 +210,21 @@
 
 
 (defn stop! []
 (defn stop! []
   (prn "stop!"))
   (prn "stop!"))
+
+(defonce triggered? (atom false))
+(when (util/electron?)
+  (.addEventListener js/window "beforeunload"
+                     (fn [e]
+                       (when-not @triggered?
+                         (.preventDefault e)
+                         (state/pub-event! [:modal/show
+                                            [:div
+                                             [:h1.title "Reload Logseq?"]
+                                             (ui/button "YES"
+                                               :on-click (fn []
+                                                           (pool/terminate-parser-pool!)
+                                                           (p/let [_ (electron-listener/persist-dbs!)]
+                                                             (reset! triggered? true)
+                                                             (js/window.location.reload))))]])
+                         (reset! triggered? false)
+                         (set! (.-returnValue e) "")))))