py-web-vue
Version:
Generic client application to work with a PyWebVue server
74 lines (69 loc) • 1.99 kB
JavaScript
const CTX = {};
export function setAddAttachment(fn) {
CTX.addAttachement = fn;
}
export const fileHandler = {
priority: 0,
async decorate(value) {
if (value === null || value === undefined) return value;
if (value.constructor && value.constructor === File) {
const {
name, lastModified, size, type,
} = value;
const arrayBuffer = await value.arrayBuffer();
const content = CTX.addAttachement(arrayBuffer);
return {
name,
lastModified,
size,
type,
content,
// used by server to prevent sending those fields back to JS
_filter: ['content'],
};
}
return value;
},
};
export const fileListHandler = {
priority: 0,
async decorate(value) {
if (value === null || value === undefined) return value;
if (typeof value === 'string') {
return value;
}
if ((value.constructor && value.constructor === FileList) || value.length) {
const results = [];
/* eslint-disable no-await-in-loop */
for (let i = 0; i < value.length; i++) {
results.push(await fileHandler.decorate(value[i]));
}
/* eslint-enable no-await-in-loop */
return results;
}
return value;
},
};
export const fileInObjectHandler = {
priority: 0,
async decorate(value) {
if (value === null || value === undefined) return value;
if (typeof value === 'string') {
return value;
}
if (value.constructor && value.constructor === Object) {
const newValue = {};
const names = Object.keys(value);
/* eslint-disable no-await-in-loop */
for (let i = 0; i < names.length; i++) {
const name = names[i];
newValue[name] = value[name];
newValue[name] = await fileListHandler.decorate(newValue[name]);
newValue[name] = await fileHandler.decorate(newValue[name]);
}
/* eslint-enable no-await-in-loop */
return newValue;
}
return value;
},
};