demarches-normaliennes/app/javascript/shared/activestorage/uploader.js

46 lines
1.2 KiB
JavaScript
Raw Normal View History

import { DirectUpload } from '@rails/activestorage';
2019-02-13 14:16:22 +01:00
import ProgressBar from './progress-bar';
import errorFromDirectUploadMessage from './errors';
2019-02-13 14:16:22 +01:00
/**
Uploader class is a delegate for DirectUpload instance
used to track lifecycle and progress of an upload.
2019-02-13 14:16:22 +01:00
*/
export default class Uploader {
constructor(input, file, directUploadUrl) {
this.directUpload = new DirectUpload(file, directUploadUrl, this);
this.progressBar = new ProgressBar(input, this.directUpload.id, file);
}
start() {
this.progressBar.start();
return new Promise((resolve, reject) => {
this.directUpload.create((errorMsg, attributes) => {
if (errorMsg) {
this.progressBar.error(errorMsg);
let error = errorFromDirectUploadMessage(errorMsg);
reject(error);
2019-02-13 14:16:22 +01:00
} else {
resolve(attributes.signed_id);
}
this.progressBar.end();
this.progressBar.destroy();
});
});
}
uploadRequestDidProgress(event) {
const progress = (event.loaded / event.total) * 100;
if (progress) {
this.progressBar.progress(progress);
}
}
directUploadWillStoreFileWithXHR(xhr) {
xhr.upload.addEventListener('progress', event =>
this.uploadRequestDidProgress(event)
);
}
}