Browse Source

enhance: display a loading button when importing files from the disk

Tienson Qin 4 years ago
parent
commit
d55b381e2e

+ 49 - 45
src/electron/electron/handler.cljs

@@ -54,13 +54,13 @@
 (defn- get-files
   [path]
   (let [result (->> (map
-                     (fn [path]
-                       (let [stat (fs/statSync path)]
-                         (when-not (.isDirectory stat)
-                           {:path (fix-win-path! path)
-                            :content (read-file path)
-                            :stat stat})))
-                     (readdir path))
+                      (fn [path]
+                        (let [stat (fs/statSync path)]
+                          (when-not (.isDirectory stat)
+                            {:path (fix-win-path! path)
+                             :content (read-file path)
+                             :stat stat})))
+                      (readdir path))
                     (remove nil?))]
     (vec (cons {:path (fix-win-path! path)} result))))
 
@@ -69,6 +69,9 @@
   (let [result (.showOpenDialogSync dialog (bean/->js
                                             {:properties ["openDirectory"]}))
         path (first result)]
+    (.. window -webContents
+        (send "open-dir-confirmed"
+              (bean/->js {:opened? true})))
     (get-files path)))
 
 (defmethod handle :getFiles [window [_ path]]
@@ -86,44 +89,45 @@
 
 (defn watch-dir!
   [win dir]
-  (let [watcher (.watch watcher dir
-                        (clj->js
-                         {:ignored (fn [path]
-                                     (or
-                                      (some #(string/starts-with? path (str dir "/" %))
-                                            ["." "assets" "node_modules"])
-                                      (some #(string/ends-with? path (str dir "/" %))
-                                            [".swap" ".crswap" ".tmp"])))
-                          :ignoreInitial true
-                          :persistent true
-                          :awaitWriteFinish true}))]
-    (.on watcher "add"
-         (fn [path]
-           (send-file-watcher! win "add"
-                               {:dir (fix-win-path! dir)
-                                :path (fix-win-path! path)
-                                :content (read-file path)
-                                :stat (fs/statSync path)})))
-    (.on watcher "change"
-         (fn [path]
-           (send-file-watcher! win "change"
-                               {:dir (fix-win-path! dir)
-                                :path (fix-win-path! path)
-                                :content (read-file path)
-                                :stat (fs/statSync path)})))
-    (.on watcher "unlink"
-         (fn [path]
-           (send-file-watcher! win "unlink"
-                               {:dir (fix-win-path! dir)
-                                :path (fix-win-path! path)})))
-    (.on watcher "error"
-         (fn [path]
-           (println "Watch error happened: "
-                    {:path path})))
-
-    (.on app "quit" #(.close watcher))
-
-    true))
+  (when (fs/existsSync dir)
+    (let [watcher (.watch watcher dir
+                          (clj->js
+                           {:ignored (fn [path]
+                                       (or
+                                        (some #(string/starts-with? path (str dir "/" %))
+                                              ["." "assets" "node_modules"])
+                                        (some #(string/ends-with? path (str dir "/" %))
+                                              [".swap" ".crswap" ".tmp"])))
+                            :ignoreInitial true
+                            :persistent true
+                            :awaitWriteFinish true}))]
+      (.on watcher "add"
+           (fn [path]
+             (send-file-watcher! win "add"
+                                 {:dir (fix-win-path! dir)
+                                  :path (fix-win-path! path)
+                                  :content (read-file path)
+                                  :stat (fs/statSync path)})))
+      (.on watcher "change"
+           (fn [path]
+             (send-file-watcher! win "change"
+                                 {:dir (fix-win-path! dir)
+                                  :path (fix-win-path! path)
+                                  :content (read-file path)
+                                  :stat (fs/statSync path)})))
+      (.on watcher "unlink"
+           (fn [path]
+             (send-file-watcher! win "unlink"
+                                 {:dir (fix-win-path! dir)
+                                  :path (fix-win-path! path)})))
+      (.on watcher "error"
+           (fn [path]
+             (println "Watch error happened: "
+                      {:path path})))
+
+      (.on app "quit" #(.close watcher))
+
+      true)))
 
 (defmethod handle :addDirWatcher [window [_ dir]]
   (when dir

+ 26 - 0
src/main/electron/listener.cljs

@@ -0,0 +1,26 @@
+(ns electron.listener
+  (:require [frontend.state :as state]
+            [frontend.handler.route :as route-handler]
+            [cljs-bean.core :as bean]
+            [frontend.fs.watcher-handler :as watcher-handler]))
+
+(defn listen-to-open-dir!
+  []
+  (js/window.apis.on "open-dir-confirmed"
+                     (fn []
+                       (state/set-loading-files! true)
+                       (when-not (state/home?)
+                         (route-handler/redirect-to-home!)))))
+
+(defn run-dirs-watcher!
+  []
+  ;; TODO: move "file-watcher" to electron.ipc.channels
+  (js/window.apis.on "file-watcher"
+                     (fn [data]
+                       (let [{:keys [type payload]} (bean/->clj data)]
+                         (watcher-handler/handle-changed! type payload)))))
+
+(defn listen!
+  []
+  (listen-to-open-dir!)
+  (run-dirs-watcher!))

+ 0 - 9
src/main/frontend/fs/watcher_handler.cljs

@@ -7,7 +7,6 @@
             [frontend.handler.route :as route-handler]
             [cljs-time.coerce :as tc]
             [frontend.config :as config]
-            [cljs-bean.core :as bean]
             [frontend.db :as db]
             [frontend.state :as state]
             [clojure.string :as string]))
@@ -58,11 +57,3 @@
         :else
         (log/error :fs/watcher-no-handler {:type type
                                            :payload payload})))))
-
-(defn run-dirs-watcher!
-  []
-  ;; TODO: move "file-watcher" to electron.ipc.channels
-  (js/window.apis.on "file-watcher"
-                     (fn [data]
-                       (let [{:keys [type payload]} (bean/->clj data)]
-                         (handle-changed! type payload)))))

+ 3 - 2
src/main/frontend/handler.cljs

@@ -23,7 +23,8 @@
             [goog.object :as gobj]
             [frontend.idb :as idb]
             [lambdaisland.glogi :as log]
-            [frontend.handler.common :as common-handler]))
+            [frontend.handler.common :as common-handler]
+            [electron.listener :as el]))
 
 (defn- watch-for-date!
   []
@@ -159,4 +160,4 @@
     (file-handler/run-writes-chan!)
     (editor-handler/periodically-save!)
     (when (util/electron?)
-      (fs-watcher-handler/run-dirs-watcher!))))
+      (el/listen!))))

+ 6 - 2
src/main/frontend/handler/web/nfs.cljs

@@ -8,6 +8,7 @@
             [frontend.handler.common :as common-handler]
             ["/frontend/utils" :as utils]
             [frontend.handler.repo :as repo-handler]
+            [frontend.handler.route :as route-handler]
             [frontend.idb :as idb]
             [frontend.state :as state]
             [clojure.string :as string]
@@ -108,6 +109,8 @@
                                    (when nfs?
                                      (swap! path-handles assoc path handle))))
              _ (state/set-loading-files! true)
+             _ (when-not (state/home?)
+                 (route-handler/redirect-to-home!))
              root-handle (first result)
              dir-name (if nfs?
                         (gobj/get root-handle "name")
@@ -144,7 +147,6 @@
                                            (:file/content file))]
                            (assoc file :file/content content))) markup-files))
            (p/then (fn [result]
-                     _ (state/set-loading-files! false)
                      (let [files (map #(dissoc % :file/file) result)]
                        (repo-handler/start-repo-db-if-not-exists! repo {:db-type :local-native-fs})
                        (repo-handler/load-repo-to-db! repo
@@ -152,13 +154,15 @@
                                                        :nfs-files    files})
 
                        (state/add-repo! {:url repo :nfs? true})
+                       (state/set-loading-files! false)
                        (and ok-handler (ok-handler))
                        (when (util/electron?)
                          (fs/watch-dir! dir-name)))))
            (p/catch (fn [error]
                       (log/error :nfs/load-files-error error)))))
      (p/catch (fn [error]
-                (when (not= "AbortError" (gobj/get error "name"))
+                (if (contains? #{"AbortError" "Error"} (gobj/get error "name"))
+                  (state/set-loading-files! false)
                   (log/error :nfs/open-dir-error error)))))))
 
 (defn get-local-repo

+ 4 - 1
src/main/frontend/state.cljs

@@ -27,7 +27,6 @@
     :repo/sync-status {}
     :repo/changed-files nil
     :nfs/user-granted? {}
-    :nfs/loading-files? nil
     :nfs/refreshing? nil
     ;; TODO: how to detect the network reliably?
     :network/online? true
@@ -113,6 +112,10 @@
   []
   (get-in (get-route-match) [:data :name]))
 
+(defn home?
+  []
+  (= :home (get-current-route)))
+
 (defn get-current-page
   []
   (and

+ 1 - 1
src/main/frontend/ui.cljs

@@ -237,7 +237,7 @@
     (if (util/ios?) (.add cl "is-ios"))
     (if (util/mobile?) (.add cl "is-mobile"))
     (if (util/safari?) (.add cl "is-safari"))
-    (if (util/electron?)
+    (when (util/electron?)
       (js/window.apis.on "full-screen" #(js-invoke cl (if (= % "enter") "add" "remove") "is-fullscreen")))))
 
 (defn inject-dynamic-style-node!