feat(electron): copy file when upload asset

pull/1179/head
charlie 2021-01-24 20:47:06 +08:00
parent 25c7726331
commit 6b61a3c762
3 changed files with 35 additions and 8 deletions

View File

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

View File

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

View File

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