From 28d2b357186136bd66bd5d4ce6d0906df83353db Mon Sep 17 00:00:00 2001
From: Ramires Viana <59319979+ramiresviana@users.noreply.github.com>
Date: Tue, 7 Jul 2020 19:58:07 +0000
Subject: [PATCH] refactor: upload utils

---
 frontend/src/components/files/Listing.vue | 180 ++--------------------
 frontend/src/utils/upload.js              | 168 ++++++++++++++++++++
 2 files changed, 177 insertions(+), 171 deletions(-)
 create mode 100644 frontend/src/utils/upload.js

diff --git a/frontend/src/components/files/Listing.vue b/frontend/src/components/files/Listing.vue
index 175f254e..c846e2e9 100644
--- a/frontend/src/components/files/Listing.vue
+++ b/frontend/src/components/files/Listing.vue
@@ -89,12 +89,10 @@
 
 <script>
 import { mapState, mapMutations } from 'vuex'
-import throttle from 'lodash.throttle'
 import Item from './ListingItem'
 import css from '@/utils/css'
 import { users, files as api } from '@/api'
-import buttons from '@/utils/buttons'
-import url from '@/utils/url'
+import * as upload  from '@/utils/upload'
 
 export default {
   name: 'listing',
@@ -325,8 +323,8 @@ export default {
         base = el.querySelector('.name').innerHTML + '/'
       }
 
-      let files = await this.scanFiles(dt);
-      let path = this.$route.path + base;
+      let files = await upload.scanFiles(dt)
+      let path = this.$route.path + base
       let items = this.req.items
 
       if (base !== '') {
@@ -337,7 +335,7 @@ export default {
         }
       }
 
-      let conflict = this.checkConflict(files, items)
+      let conflict = upload.checkConflict(files, items)
 
       if (conflict) {
         this.$store.commit('showHover', {
@@ -345,48 +343,14 @@ export default {
           confirm: (event) => {
             event.preventDefault()
             this.$store.commit('closeHovers')
-            this.handleFiles(files, path, true)
+            upload.handleFiles(files, path, true)
           }
         })
 
         return
       }
 
-      this.handleFiles(files, path)
-    },
-    checkConflict (files, items) {
-      if (typeof items === 'undefined' || items === null) {
-        items = []
-      }
-
-      let folder_upload = false
-      if (files[0].fullPath !== undefined) {
-        folder_upload = true
-      }
-
-      let conflict = false
-      for (let i = 0; i < files.length; i++) {
-        let file = files[i]
-        let name = file.name
-
-        if (folder_upload) {
-          let dirs = file.fullPath.split("/")
-          if (dirs.length > 1) {
-            name = dirs[0]
-          }
-        }
-
-        let res = items.findIndex(function hasConflict (element) {
-          return (element.name === this)
-        }, name)
-
-        if (res >= 0) {
-          conflict = true
-          break
-        }
-      }
-
-      return conflict
+      upload.handleFiles(files, path)
     },
     uploadInput (event) {
       this.$store.commit('closeHovers')
@@ -401,8 +365,8 @@ export default {
         }
       }
 
-      let path = this.$route.path;
-      let conflict = this.checkConflict(files, this.req.items)
+      let path = this.$route.path
+      let conflict = upload.checkConflict(files, this.req.items)
 
       if (conflict) {
         this.$store.commit('showHover', {
@@ -416,7 +380,7 @@ export default {
 
         return
       }
-      this.handleFiles(files, path)
+      upload.handleFiles(files, path)
     },
     resetOpacity () {
       let items = document.getElementsByClassName('item')
@@ -425,132 +389,6 @@ export default {
         file.style.opacity = 1
       })
     },
-    scanFiles(dt) {
-        return new Promise((resolve) => {
-            let reading = 0
-            const contents = []
-
-            if (dt.items !== undefined) {
-              for (let item of dt.items) {
-                if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
-                  const entry = item.webkitGetAsEntry()
-                  readEntry(entry)
-                }
-              }
-            } else {
-              resolve(dt.files)
-            }
-
-            function readEntry(entry, directory = "") {
-                if (entry.isFile) {
-                    reading++
-                    entry.file(file => {
-                        reading--
-
-                        file.fullPath = `${directory}${file.name}`
-                        contents.push(file)
-
-                        if (reading === 0) {
-                            resolve(contents)
-                        }
-                    })
-                } else if (entry.isDirectory) {
-                    const dir = {
-                      isDir: true,
-                      path: `${directory}${entry.name}`
-                    }
-
-                    contents.push(dir)
-
-                    readReaderContent(entry.createReader(), `${directory}${entry.name}`)
-                }
-            }
-
-            function readReaderContent(reader, directory) {
-                reading++
-
-                reader.readEntries(function (entries) {
-                    reading--
-                    if (entries.length > 0) {
-                        for (const entry of entries) {
-                            readEntry(entry, `${directory}/`)
-                        }
-
-                        readReaderContent(reader, `${directory}/`)
-                    }
-
-                    if (reading === 0) {
-                        resolve(contents)
-                    }
-                })
-            }
-        })
-    },
-    handleFiles (files, path, overwrite = false) {
-      if (this.uploading.count == 0) {
-        buttons.loading('upload')
-      }
-
-      let promises = []
-
-      let onupload = (id) => (event) => {
-        this.$store.commit('uploadigSetProgress', { id, loaded: event.loaded })
-      }
-
-      for (let i = 0; i < files.length; i++) {
-        let file = files[i]
-
-        if (!file.isDir) {
-          let filename = (file.fullPath !== undefined) ? file.fullPath : file.name
-          let filenameEncoded = url.encodeRFC5987ValueChars(filename)
-
-          let id = this.uploading.id
-
-          this.$store.commit('uploadingIncrementSize', file.size)
-          this.$store.commit('uploadingIncrementId')
-          this.$store.commit('uploadingIncrementCount')
-
-          let promise = api.post(path + filenameEncoded, file, overwrite, throttle(onupload(id), 100)).finally(() => {
-            this.$store.commit('uploadingDecreaseCount')
-          })
-
-          promises.push(promise)
-        } else {
-          let uri = path
-          let folders = file.path.split("/")
-
-          for (let i = 0; i < folders.length; i++) {
-            let folder = folders[i]
-            let folderEncoded = encodeURIComponent(folder)
-            uri += folderEncoded + "/"
-          }
-
-          api.post(uri)
-        }
-      }
-
-      let finish = () => {
-        if (this.uploading.count > 0) {
-          return
-        }
-
-        buttons.success('upload')
-
-        this.$store.commit('setReload', true)
-        this.$store.commit('uploadingReset')
-      }
-
-      Promise.all(promises)
-        .then(() => {
-          finish()
-        })
-        .catch(error => {
-          finish()
-          this.$showError(error)
-        })
-
-      return false
-    },
     async sort (by) {
       let asc = false
 
diff --git a/frontend/src/utils/upload.js b/frontend/src/utils/upload.js
new file mode 100644
index 00000000..f1921953
--- /dev/null
+++ b/frontend/src/utils/upload.js
@@ -0,0 +1,168 @@
+import store from '@/store'
+import { files as api } from '@/api'
+import throttle from 'lodash.throttle'
+import buttons from '@/utils/buttons'
+import url from '@/utils/url'
+
+export function checkConflict(files, items) {
+  if (typeof items === 'undefined' || items === null) {
+    items = []
+  }
+
+  let folder_upload = false
+  if (files[0].fullPath !== undefined) {
+    folder_upload = true
+  }
+
+  let conflict = false
+  for (let i = 0; i < files.length; i++) {
+    let file = files[i]
+    let name = file.name
+
+    if (folder_upload) {
+      let dirs = file.fullPath.split("/")
+      if (dirs.length > 1) {
+        name = dirs[0]
+      }
+    }
+
+    let res = items.findIndex(function hasConflict(element) {
+      return (element.name === this)
+    }, name)
+
+    if (res >= 0) {
+      conflict = true
+      break
+    }
+  }
+
+  return conflict
+}
+
+export function scanFiles(dt) {
+  return new Promise((resolve) => {
+    let reading = 0
+    const contents = []
+
+    if (dt.items !== undefined) {
+      for (let item of dt.items) {
+        if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
+          const entry = item.webkitGetAsEntry()
+          readEntry(entry)
+        }
+      }
+    } else {
+      resolve(dt.files)
+    }
+
+    function readEntry(entry, directory = "") {
+      if (entry.isFile) {
+        reading++
+        entry.file(file => {
+          reading--
+
+          file.fullPath = `${directory}${file.name}`
+          contents.push(file)
+
+          if (reading === 0) {
+            resolve(contents)
+          }
+        })
+      } else if (entry.isDirectory) {
+        const dir = {
+          isDir: true,
+          path: `${directory}${entry.name}`
+        }
+
+        contents.push(dir)
+
+        readReaderContent(entry.createReader(), `${directory}${entry.name}`)
+      }
+    }
+
+    function readReaderContent(reader, directory) {
+      reading++
+
+      reader.readEntries(function (entries) {
+        reading--
+        if (entries.length > 0) {
+          for (const entry of entries) {
+            readEntry(entry, `${directory}/`)
+          }
+
+          readReaderContent(reader, `${directory}/`)
+        }
+
+        if (reading === 0) {
+          resolve(contents)
+        }
+      })
+    }
+  })
+}
+
+export function handleFiles(files, path, overwrite = false) {
+  if (store.state.uploading.count == 0) {
+    buttons.loading('upload')
+  }
+
+  let promises = []
+
+  let onupload = (id) => (event) => {
+    store.commit('uploadigSetProgress', { id, loaded: event.loaded })
+  }
+
+  for (let i = 0; i < files.length; i++) {
+    let file = files[i]
+
+    if (!file.isDir) {
+      let filename = (file.fullPath !== undefined) ? file.fullPath : file.name
+      let filenameEncoded = url.encodeRFC5987ValueChars(filename)
+
+      let id = store.state.uploading.id
+
+      store.commit('uploadingIncrementSize', file.size)
+      store.commit('uploadingIncrementId')
+      store.commit('uploadingIncrementCount')
+
+      let promise = api.post(path + filenameEncoded, file, overwrite, throttle(onupload(id), 100)).finally(() => {
+        store.commit('uploadingDecreaseCount')
+      })
+
+      promises.push(promise)
+    } else {
+      let uri = path
+      let folders = file.path.split("/")
+
+      for (let i = 0; i < folders.length; i++) {
+        let folder = folders[i]
+        let folderEncoded = encodeURIComponent(folder)
+        uri += folderEncoded + "/"
+      }
+
+      api.post(uri)
+    }
+  }
+
+  let finish = () => {
+    if (store.state.uploading.count > 0) {
+      return
+    }
+
+    buttons.success('upload')
+
+    store.commit('setReload', true)
+    store.commit('uploadingReset')
+  }
+
+  Promise.all(promises)
+    .then(() => {
+      finish()
+    })
+    .catch(error => {
+      finish()
+      this.$showError(error)
+    })
+
+  return false
+}
\ No newline at end of file