|
@@ -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
|