summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/api/crud.upload.js
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2020-07-22 14:05:15 +0200
committerJules Laplace <julescarbon@gmail.com>2020-07-22 14:05:15 +0200
commitef78bc6a084f92b4794e987b5832240d85b6479e (patch)
treeb314b630800db6aa60f28ef0b115625e6ca176db /animism-align/frontend/app/api/crud.upload.js
parent85d4cb9addf9ca887d3440b2786665d67d9917c4 (diff)
refactor app using babel module-resolver
Diffstat (limited to 'animism-align/frontend/app/api/crud.upload.js')
-rw-r--r--animism-align/frontend/app/api/crud.upload.js115
1 files changed, 115 insertions, 0 deletions
diff --git a/animism-align/frontend/app/api/crud.upload.js b/animism-align/frontend/app/api/crud.upload.js
new file mode 100644
index 0000000..b4d9d4e
--- /dev/null
+++ b/animism-align/frontend/app/api/crud.upload.js
@@ -0,0 +1,115 @@
+import { as_type } from 'app/api/crud.types'
+
+export function crud_upload(type, data, dispatch) {
+ return new Promise( (resolve, reject) => {
+ // console.log(type, data)
+ const { id } = data
+
+ const fd = new FormData()
+ if (!data.tag) {
+ data.tag = 'misc'
+ }
+
+ Object.keys(data).forEach(key => {
+ if (key.indexOf('__') !== -1) return
+ if (key === 'id') return
+ const fn_key = '__' + key + '_filename'
+ if (fn_key in data) {
+ fd.append(key, data[key], data[fn_key])
+ } else {
+ fd.append(key, data[key])
+ }
+ })
+
+ let url = id ? '/api/v1/' + type + '/' + id + '/'
+ : '/api/v1/' + type + '/'
+ // console.log(url)
+
+ const xhr = new XMLHttpRequest()
+ xhr.upload.addEventListener("progress", uploadProgress, false)
+ xhr.addEventListener("load", uploadComplete, false)
+ xhr.addEventListener("error", uploadFailed, false)
+ xhr.addEventListener("abort", uploadCancelled, false)
+ xhr.open("POST", url)
+ xhr.send(fd)
+
+ dispatch && dispatch({ type: as_type(type, 'upload_loading')})
+
+ let complete = false
+
+ function uploadProgress (e) {
+ if (e.lengthComputable) {
+ const percent = Math.round(e.loaded * 100 / e.total) || 0
+ if (percent > 99) {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_waiting'),
+ percent,
+ [type]: id,
+ })
+ } else {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_progress'),
+ percent,
+ [type]: id,
+ })
+ }
+ }
+ else {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_error'),
+ error: 'unable to compute upload progress',
+ [type]: id,
+ })
+ }
+ }
+
+ function uploadComplete (e) {
+ let parsed;
+ try {
+ parsed = JSON.parse(e.target.responseText)
+ } catch (e) {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_error'),
+ error: 'upload failed',
+ [type]: id,
+ })
+ reject(e)
+ return
+ }
+ dispatch && dispatch({
+ type: as_type(type, 'upload_complete'),
+ data: parsed,
+ [type]: id,
+ })
+ if (parsed.res) {
+ (parsed.res.length ? parsed.res : [parsed.res]).forEach(file => {
+ dispatch && dispatch({
+ type: as_type('upload', 'create'),
+ data: { res: file },
+ })
+ })
+ }
+ resolve(parsed)
+ }
+
+ function uploadFailed (evt) {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_error'),
+ error: 'upload failed',
+ [type]: id,
+ })
+ reject(evt)
+ }
+
+ function uploadCancelled (evt) {
+ dispatch && dispatch({
+ type: as_type(type, 'upload_error'),
+ error: 'upload cancelled',
+ [type]: id,
+ })
+ reject(evt)
+ }
+ })
+}
+
+export const upload_action = (type, data) => dispatch => crud_upload(type, data, dispatch)