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

pull/1274/head
Tienson Qin 2021-02-05 16:29:58 +08:00
parent 3d80dc2310
commit d55b381e2e
7 changed files with 87 additions and 58 deletions

View File

@ -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})))
(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))
(.on app "quit" #(.close watcher))
true))
true)))
(defmethod handle :addDirWatcher [window [_ dir]]
(when dir

View File

@ -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!))

View File

@ -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)))))

View File

@ -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!))))

View File

@ -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

View File

@ -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

View File

@ -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!