hook multifile to ui

This commit is contained in:
Emily 2018-07-31 11:09:18 -07:00
parent e42ad175db
commit c9ae76b209
77 changed files with 1528 additions and 1111 deletions

View file

@ -1,17 +1,14 @@
import FileSender from './fileSender';
import FileReceiver from './fileReceiver';
import {
copyToClipboard,
delay,
fadeOut,
openLinksInNewTab,
percent
} from './utils';
import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils';
import * as metrics from './metrics';
import { hasPassword } from './api';
import Archive from './archive';
export default function(state, emitter) {
let lastRender = 0;
let updateTitle = false;
state.files = [];
function render() {
emitter.emit('render');
@ -64,6 +61,16 @@ export default function(state, emitter) {
metrics.changedDownloadLimit(file);
});
emitter.on('removeUpload', async ({ file }) => {
for (let i = 0; i < state.files.length; i++) {
if (state.files[i] === file) {
state.files.splice(i, 1);
render();
return;
}
}
});
emitter.on('delete', async ({ file, location }) => {
try {
metrics.deletedUpload({
@ -85,11 +92,22 @@ export default function(state, emitter) {
state.transfer.cancel();
});
emitter.on('upload', async ({ file, type }) => {
emitter.on('addFiles', async ({ files }) => {
for (let i = 0; i < files.length; i++) {
state.files.push(files[i]);
}
render();
});
//TODO: hook up to multi-file upload functionality
emitter.on('upload', async ({ files, type, dlCount, password }) => {
const file = new Archive(files);
const size = file.size;
const sender = new FileSender(file);
sender.on('progress', updateProgress);
sender.on('encrypting', render);
sender.on('complete', render);
state.transfer = sender;
state.uploading = true;
render();
@ -98,19 +116,25 @@ export default function(state, emitter) {
await delay(200);
try {
metrics.startedUpload({ size, type });
const ownedFile = await sender.upload();
ownedFile.type = type;
state.storage.totalUploads += 1;
metrics.completedUpload(ownedFile);
state.storage.addFile(ownedFile);
if (password) {
emitter.emit('password', { password, file: ownedFile });
}
emitter.emit('changeLimit', { file: ownedFile, value: dlCount });
const cancelBtn = document.getElementById('cancel-upload');
if (cancelBtn) {
cancelBtn.hidden = 'hidden';
}
if (document.querySelector('.page')) {
await delay(1000);
await fadeOut('.page');
}
emitter.emit('pushState', `/share/${ownedFile.id}`);
} catch (err) {
@ -127,6 +151,8 @@ export default function(state, emitter) {
}
} finally {
openLinksInNewTab(links, false);
state.files = [];
state.password = '';
state.uploading = false;
state.transfer = null;
}
@ -150,6 +176,17 @@ export default function(state, emitter) {
render();
});
emitter.on('getPasswordExist', async ({ id }) => {
try {
state.fileInfo = await hasPassword(id);
render();
} catch (e) {
if (e.message === '404') {
return emitter.emit('pushState', '/404');
}
}
});
emitter.on('getMetadata', async () => {
const file = state.fileInfo;
@ -172,6 +209,7 @@ export default function(state, emitter) {
emitter.on('download', async file => {
state.transfer.on('progress', updateProgress);
state.transfer.on('decrypting', render);
state.transfer.on('complete', render);
const links = openLinksInNewTab();
const size = file.size;
try {
@ -186,12 +224,11 @@ export default function(state, emitter) {
const speed = size / (time / 1000);
if (document.querySelector('.page')) {
await delay(1000);
await fadeOut('.page');
}
state.storage.totalDownloads += 1;
state.transfer.reset();
metrics.completedDownload({ size, time, speed });
emitter.emit('pushState', '/completed');
//emitter.emit('pushState', '/completed');
} catch (err) {
if (err.message === '0') {
// download cancelled