1
0
Эх сурвалжийг харах

mobile: implement open-dir

Weihua Lu 4 жил өмнө
parent
commit
f7cd20a249

+ 9 - 1
src/main/frontend/fs.cljs

@@ -116,7 +116,15 @@
 
 (defn open-dir
   [ok-handler]
-  (let [record (if (util/electron?) node-record nfs-record)]
+  (let [record (cond
+                 (util/electron?)
+                 node-record
+
+                 (mobile-util/is-native-platform?)
+                 mobile-record
+
+                 :else
+                 nfs-record)]
     (p/let [result (protocol/open-dir record ok-handler)]
       (if (util/electron?)
         (let [[dir & paths] (bean/->clj result)]

+ 98 - 1
src/main/frontend/fs/capacitor_fs.cljs

@@ -1,9 +1,59 @@
 (ns frontend.fs.capacitor-fs
   (:require [frontend.fs.protocol :as protocol]
             [lambdaisland.glogi :as log]
+            [cljs.core.async :as a]
+            [cljs.core.async.interop :refer [<p!]]
+            [frontend.util :as futil]
             ["@capacitor/filesystem" :refer [Filesystem Directory Encoding]]
+            [frontend.mobile.util :as util]
             [promesa.core :as p]))
 
+(defn readdir
+  "readdir recursively"
+  [path]
+  (p/loop [result []
+           dirs [path]]
+    (if (empty? dirs)
+      result
+      (p/let [d (first dirs)
+              files (.readdir Filesystem (clj->js {:path d}))
+              files (-> files
+                        js->clj
+                        (get "files" []))
+              files (->> files
+                         (map (fn [file] (futil/node-path.join d file))))
+              files-with-stats (p/all
+                                (mapv
+                                 (fn [file]
+                                   (p/chain
+                                    (.stat Filesystem (clj->js {:path file}))
+                                    #(js->clj % :keywordize-keys true)))
+                                 files))
+              files-dir (->> files-with-stats
+                             (filterv
+                              (fn [{:keys [type]}]
+                                (= type "directory")))
+                             (mapv :uri))
+
+              files-result
+              (p/all
+               (->> files-with-stats
+                    (filter
+                     (fn [{:keys [type]}]
+                       (= type "file")))
+                    (mapv
+                     (fn [{:keys [uri] :as file-result}]
+                       (p/chain
+                        (.readFile Filesystem
+                                   (clj->js
+                                    {:path uri
+                                     :encoding (.-UTF8 Encoding)}))
+                        #(js->clj % :keywordize-keys true)
+                        :data
+                        #(assoc file-result :content %))))))]
+        (p/recur (concat result files-result)
+                 (concat (rest dirs) files-dir))))))
+
 (defrecord Capacitorfs []
   protocol/Fs
   (mkdir! [this dir]
@@ -55,8 +105,55 @@
   (stat [this dir path]
     nil)
   (open-dir [this ok-handler]
-    nil)
+    (p/let [path (p/chain
+                  (.pickFolder util/folder-picker)
+                  #(js->clj % :keywordize-keys true)
+                  :path)
+            files (readdir path)]
+      (js/console.log path)
+      (js/console.log files)
+      (into [] (concat [path] files))))
   (get-files [this path-or-handle ok-handler]
     nil)
   (watch-dir! [this dir]
     nil))
+
+
+(comment
+  ;;open-dir result
+  #_
+  ["/storage/emulated/0/untitled folder 21"
+   {:type    "file",
+    :size    2,
+    :mtime   1630049904000,
+    :uri     "file:///storage/emulated/0/untitled%20folder%2021/pages/contents.md",
+    :ctime   1630049904000,
+    :content "-\n"}
+   {:type    "file",
+    :size    0,
+    :mtime   1630049904000,
+    :uri     "file:///storage/emulated/0/untitled%20folder%2021/logseq/custom.css",
+    :ctime   1630049904000,
+    :content ""}
+   {:type    "file",
+    :size    2,
+    :mtime   1630049904000,
+    :uri     "file:///storage/emulated/0/untitled%20folder%2021/logseq/metadata.edn",
+    :ctime   1630049904000,
+    :content "{}"}
+   {:type  "file",
+    :size  181,
+    :mtime 1630050535000,
+    :uri
+    "file:///storage/emulated/0/untitled%20folder%2021/journals/2021_08_27.md",
+    :ctime 1630050535000,
+    :content
+    "- xx\n- xxx\n- xxx\n- xxxxxxxx\n- xxx\n- xzcxz\n- xzcxzc\n- asdsad\n- asdsadasda\n- asdsdaasdsad\n- asdasasdas\n- asdsad\n- sad\n- asd\n- asdsad\n- asdasd\n- sadsd\n-\n- asd\n- saddsa\n- asdsaasd\n- asd"}
+   {:type  "file",
+    :size  132,
+    :mtime 1630311293000,
+    :uri
+    "file:///storage/emulated/0/untitled%20folder%2021/journals/2021_08_30.md",
+    :ctime 1630311293000,
+    :content
+    "- ccc\n- sadsa\n- sadasd\n- asdasd\n- asdasd\n\t- asdasd\n\t\t- asdasdsasd\n\t\t\t- sdsad\n\t\t-\n- sadasd\n- asdas\n- sadasd\n-\n-\n\t- sadasdasd\n\t- asdsd"}])