Browse Source

feat(electron): copy file when upload asset

charlie 4 years ago
parent
commit
6b61a3c762

+ 20 - 2
resources/js/preload.js

@@ -1,3 +1,5 @@
+const fs = require('fs')
+const path = require('path')
 const { ipcRenderer, contextBridge, shell } = require('electron')
 
 contextBridge.exposeInMainWorld('apis', {
@@ -6,8 +8,8 @@ contextBridge.exposeInMainWorld('apis', {
   },
 
   on: (channel, callback) => {
-    const newCallback = (_, data) => callback(data);
-    ipcRenderer.on(channel, newCallback);
+    const newCallback = (_, data) => callback(data)
+    ipcRenderer.on(channel, newCallback)
   },
 
   checkForUpdates: async (...args) => {
@@ -28,5 +30,21 @@ contextBridge.exposeInMainWorld('apis', {
 
   async openExternal (url, options) {
     await shell.openExternal(url, options)
+  },
+
+  async copyFileToAssets (repoPathRoot, to, from) {
+    if (fs.statSync(from).isDirectory()) {
+      throw new Error('not support copy directory')
+    }
+
+    const dest = path.join(repoPathRoot, to)
+    const assetsRoot = path.dirname(dest)
+
+    if (!/assets$/.test(assetsRoot)) {
+      throw new Error('illegal assets dirname')
+    }
+
+    await fs.promises.mkdir(assetsRoot, { recursive: true })
+    await fs.promises.copyFile(from, dest)
   }
 })

+ 1 - 1
src/main/frontend/components/block.cljs

@@ -226,7 +226,7 @@
   (let [src (::src state)
         granted? (state/sub [:nfs/user-granted? (state/get-current-repo)])]
 
-    (when granted?
+    (when (or granted? (util/electron?))
       (p/then (editor-handler/make-asset-url href) #(reset! src %)))
 
     (when @src

+ 14 - 5
src/main/frontend/handler/editor.cljs

@@ -1552,21 +1552,30 @@
    (when-let [block-file (db-model/get-block-file block-id)]
      (p/let [[repo-dir assets-dir] (ensure-assets-dir! repo)]
        (let [prefix (:file/path block-file)
-             prefix (and prefix (string/replace prefix "/" "_"))
+             prefix (and prefix (string/replace
+                                 (if (util/electron?)
+                                   (string/replace prefix (str repo-dir "/") "")
+                                   prefix) "/" "_"))
              prefix (and prefix (subs prefix 0 (string/last-index-of prefix ".")))]
          (save-assets! repo repo-dir assets-dir files
                        (fn [index]
                          (str prefix "_" (.now js/Date) "_" index)))))))
   ([repo dir path files gen-filename]
    (p/all
-    (for [[index file] (map-indexed vector files)]
+    (for [[index ^js file] (map-indexed vector files)]
       (let [ext (.-name file)
             ext (if ext (subs ext (string/last-index-of ext ".")) "")
             filename (str (gen-filename index file) ext)
             filename (str path "/" filename)]
-        ;(js/console.debug "Write asset #" filename file)
-        (p/then (fs/write-file! repo dir filename (.stream file) nil)
-                #(p/resolved [filename file])))))))
+        (js/console.debug "Write asset #" dir filename file)
+        (if (util/electron?)
+          (let [from (.-path file)]
+            (if (string/blank? from)
+              (throw (js/Error. "TODO: can not resolved From file path"))
+              (p/then (js/window.apis.copyFileToAssets dir filename from)
+                      #(p/resolved [filename file]))))
+          (p/then (fs/write-file! repo dir filename (.stream file) nil)
+                  #(p/resolved [filename file]))))))))
 
 (defonce *assets-url-cache (atom {}))