Просмотр исходного кода

fix: aways clean all load state when nfs open

Andelf 3 лет назад
Родитель
Сommit
63d268f5f0
1 измененных файлов с 75 добавлено и 72 удалено
  1. 75 72
      src/main/frontend/handler/web/nfs.cljs

+ 75 - 72
src/main/frontend/handler/web/nfs.cljs

@@ -2,28 +2,28 @@
   "The File System Access API, https://web.dev/file-system-access/."
   (:require ["/frontend/utils" :as utils]
             [cljs-bean.core :as bean]
+            [clojure.core.async :as async]
             [clojure.set :as set]
             [clojure.string :as string]
             [frontend.config :as config]
             [frontend.db :as db]
+            [frontend.encrypt :as encrypt]
             [frontend.fs :as fs]
             [frontend.fs.nfs :as nfs]
             [frontend.handler.common :as common-handler]
             [frontend.handler.repo :as repo-handler]
             [frontend.handler.route :as route-handler]
             [frontend.idb :as idb]
+            [frontend.mobile.util :as mobile-util]
             [frontend.search :as search]
             [frontend.state :as state]
             [frontend.util :as util]
             [frontend.util.fs :as util-fs]
             [goog.object :as gobj]
             [lambdaisland.glogi :as log]
-            [promesa.core :as p]
-            [frontend.mobile.util :as mobile-util]
-            [logseq.graph-parser.util :as gp-util]
             [logseq.graph-parser.config :as gp-config]
-            [clojure.core.async :as async]
-            [frontend.encrypt :as encrypt]))
+            [logseq.graph-parser.util :as gp-util]
+            [promesa.core :as p]))
 
 (defn remove-ignore-files
   [files dir-name nfs?]
@@ -118,17 +118,17 @@
     (set-files-aux! handles)))
 
 ;; TODO: extract code for `ls-dir-files` and `reload-dir!`
-(defn ls-dir-files-with-handler!
+(defn ^:large-vars/cleanup-todo ls-dir-files-with-handler!
   ([ok-handler] (ls-dir-files-with-handler! ok-handler nil))
   ([ok-handler {:keys [empty-dir?-or-pred dir-result-fn]}]
-  (let [path-handles (atom {})
-        electron? (util/electron?)
-        mobile-native? (mobile-util/native-platform?)
-        nfs? (and (not electron?)
-                  (not mobile-native?))
-        *repo (atom nil)]
+   (let [path-handles (atom {})
+         electron? (util/electron?)
+         mobile-native? (mobile-util/native-platform?)
+         nfs? (and (not electron?)
+                   (not mobile-native?))
+         *repo (atom nil)]
     ;; TODO: add ext filter to avoid loading .git or other ignored file handlers
-    (->
+     (->
       (p/let [result (if (fn? dir-result-fn)
                        (dir-result-fn {:path-handles path-handles :nfs? nfs?})
                        (fs/open-dir (fn [path handle]
@@ -150,63 +150,63 @@
               _ (state/set-loading-files! repo true)
               _ (when-not (or (state/home?) (state/setups-picker?))
                   (route-handler/redirect-to-home! false))]
-             (reset! *repo repo)
-             (when-not (string/blank? dir-name)
-               (p/let [root-handle-path (str config/local-handle-prefix dir-name)
-                       _ (when nfs?
-                           (idb/set-item! root-handle-path root-handle)
-                           (nfs/add-nfs-file-handle! root-handle-path root-handle))
-                       result (nth result 1)
-                       files (-> (->db-files mobile-native? electron? dir-name result)
-                                 (remove-ignore-files dir-name nfs?))
-                       _ (when nfs?
-                           (let [file-paths (set (map :file/path files))]
-                             (swap! path-handles (fn [handles]
-                                                   (->> handles
-                                                        (filter (fn [[path _handle]]
-                                                                  (or
-                                                                    (contains? file-paths
-                                                                               (string/replace-first path (str dir-name "/") ""))
-                                                                    (let [last-part (last (string/split path "/"))]
-                                                                      (contains? #{config/app-name
-                                                                                   gp-config/default-draw-directory
-                                                                                   (config/get-journals-directory)
-                                                                                   (config/get-pages-directory)}
-                                                                                 last-part)))))
-                                                        (into {})))))
+        (reset! *repo repo)
+        (when-not (string/blank? dir-name)
+          (p/let [root-handle-path (str config/local-handle-prefix dir-name)
+                  _ (when nfs?
+                      (idb/set-item! root-handle-path root-handle)
+                      (nfs/add-nfs-file-handle! root-handle-path root-handle))
+                  result (nth result 1)
+                  files (-> (->db-files mobile-native? electron? dir-name result)
+                            (remove-ignore-files dir-name nfs?))
+                  _ (when nfs?
+                      (let [file-paths (set (map :file/path files))]
+                        (swap! path-handles (fn [handles]
+                                              (->> handles
+                                                   (filter (fn [[path _handle]]
+                                                             (or
+                                                              (contains? file-paths
+                                                                         (string/replace-first path (str dir-name "/") ""))
+                                                              (let [last-part (last (string/split path "/"))]
+                                                                (contains? #{config/app-name
+                                                                             gp-config/default-draw-directory
+                                                                             (config/get-journals-directory)
+                                                                             (config/get-pages-directory)}
+                                                                           last-part)))))
+                                                   (into {})))))
 
-                           (set-files! @path-handles))
-                       markup-files (filter-markup-and-built-in-files files)]
-                      (-> (p/all (map (fn [file]
-                                        (p/let [content (if nfs?
-                                                          (.text (:file/file file))
-                                                          (:file/content file))
-                                                content (encrypt/decrypt content)]
-                                               (assoc file :file/content content))) markup-files))
-                          (p/then (fn [result]
-                                    (p/let [files (map #(dissoc % :file/file) result)
-                                            graph-txid-meta (util-fs/read-graph-txid-info dir-name)
-                                            graph-uuid (and (vector? graph-txid-meta) (second graph-txid-meta))]
-                                      (if-let [exists-graph (state/get-sync-graph-by-uuid graph-uuid)]
-                                        (state/pub-event!
-                                         [:notification/show
-                                          {:content (str "This graph already exists in \"" (:root exists-graph) "\"")
-                                           :status :warning}])
-                                        (do
-                                          (repo-handler/start-repo-db-if-not-exists! repo)
-                                          (async/go
-                                            (let [_finished? (async/<! (repo-handler/load-repo-to-db! repo
-                                                                                                      {:new-graph?   true
-                                                                                                       :empty-graph? (nil? (seq markup-files))
-                                                                                                       :nfs-files    files}))]
-                                              (state/add-repo! {:url repo :nfs? true})
-                                              (state/set-loading-files! repo false)
-                                              (when ok-handler (ok-handler {:url repo}))
-                                              (fs/watch-dir! dir-name)
-                                              (db/persist-if-idle! repo))))))))
-                          (p/catch (fn [error]
-                                     (log/error :nfs/load-files-error repo)
-                                     (log/error :exception error)))))))
+                      (set-files! @path-handles))
+                  markup-files (filter-markup-and-built-in-files files)]
+            (-> (p/all (map (fn [file]
+                              (p/let [content (if nfs?
+                                                (.text (:file/file file))
+                                                (:file/content file))
+                                      content (encrypt/decrypt content)]
+                                (assoc file :file/content content))) markup-files))
+                (p/then (fn [result]
+                          (p/let [files (map #(dissoc % :file/file) result)
+                                  graph-txid-meta (util-fs/read-graph-txid-info dir-name)
+                                  graph-uuid (and (vector? graph-txid-meta) (second graph-txid-meta))]
+                            (if-let [exists-graph (state/get-sync-graph-by-uuid graph-uuid)]
+                              (state/pub-event!
+                               [:notification/show
+                                {:content (str "This graph already exists in \"" (:root exists-graph) "\"")
+                                 :status :warning}])
+                              (do
+                                (repo-handler/start-repo-db-if-not-exists! repo)
+                                (async/go
+                                  (let [_finished? (async/<! (repo-handler/load-repo-to-db! repo
+                                                                                            {:new-graph?   true
+                                                                                             :empty-graph? (nil? (seq markup-files))
+                                                                                             :nfs-files    files}))]
+                                    (state/add-repo! {:url repo :nfs? true})
+                                    (state/set-loading-files! repo false)
+                                    (when ok-handler (ok-handler {:url repo}))
+                                    (fs/watch-dir! dir-name)
+                                    (db/persist-if-idle! repo))))))))
+                (p/catch (fn [error]
+                           (log/error :nfs/load-files-error repo)
+                           (log/error :exception error)))))))
       (p/catch (fn [error]
                  (log/error :exception error)
                  (when mobile-native?
@@ -214,8 +214,11 @@
                     [:notification/show {:content (str error) :status :error}]))
                  (when (contains? #{"AbortError" "Error"} (gobj/get error "name"))
                    (when @*repo (state/set-loading-files! @*repo false))
-                   (throw error)
-                   )))))))
+                   (throw error))))
+      (p/finally
+        (fn []
+          (state/set-db-restoring! false)
+          (state/set-loading-files! @*repo false)))))))
 
 (defn ls-dir-files-with-path!
   ([path] (ls-dir-files-with-path! path nil))
@@ -227,7 +230,7 @@
                                                 (fn [path handle]
                                                   (when nfs?
                                                     (swap! path-handles assoc path handle))))]
-                                 [path files-result])))]
+                            [path files-result])))]
      (ls-dir-files-with-handler!
       (:ok-handler opts)
       (merge {:dir-result-fn dir-result-fn} opts)))))