2017-07-24 20:07:49 +00:00
|
|
|
/* global MAXFILESIZE EXPIRE_SECONDS */
|
2017-08-10 17:02:13 +00:00
|
|
|
import { Raven } from './common';
|
|
|
|
import FileSender from './fileSender';
|
|
|
|
import {
|
2017-08-11 02:01:39 +00:00
|
|
|
allowedCopy,
|
2017-08-06 01:06:43 +00:00
|
|
|
bytes,
|
2017-08-04 03:13:17 +00:00
|
|
|
copyToClipboard,
|
2017-08-03 21:07:22 +00:00
|
|
|
notify,
|
|
|
|
gcmCompliant,
|
|
|
|
ONE_DAY_IN_MS
|
2017-08-10 17:02:13 +00:00
|
|
|
} from './utils';
|
|
|
|
import Storage from './storage';
|
|
|
|
import * as metrics from './metrics';
|
|
|
|
import * as progress from './progress';
|
2017-08-11 02:01:39 +00:00
|
|
|
import * as fileList from './fileList';
|
2017-08-17 16:15:45 +00:00
|
|
|
import checkImg from '../../public/resources/check-16.svg';
|
2017-07-21 20:36:26 +00:00
|
|
|
|
2017-08-10 19:59:07 +00:00
|
|
|
const storage = new Storage();
|
2017-06-01 22:10:00 +00:00
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
async function upload(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
const pageOne = document.getElementById('page-one');
|
|
|
|
const link = document.getElementById('link');
|
|
|
|
const uploadWindow = document.querySelector('.upload-window');
|
|
|
|
const uploadError = document.getElementById('upload-error');
|
|
|
|
const uploadProgress = document.getElementById('upload-progress');
|
|
|
|
const clickOrDrop = event.type === 'drop' ? 'drop' : 'click';
|
|
|
|
|
|
|
|
// don't allow upload if not on upload page
|
|
|
|
if (pageOne.hidden) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
storage.totalUploads += 1;
|
|
|
|
|
|
|
|
let file = '';
|
|
|
|
if (clickOrDrop === 'drop') {
|
2017-08-16 18:03:17 +00:00
|
|
|
if (!event.dataTransfer.files[0]) {
|
2017-08-14 19:04:03 +00:00
|
|
|
uploadWindow.classList.remove('ondrag');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (
|
2017-08-16 18:03:17 +00:00
|
|
|
event.dataTransfer.files.length > 1 ||
|
|
|
|
event.dataTransfer.files[0].size === 0
|
2017-08-14 19:04:03 +00:00
|
|
|
) {
|
|
|
|
uploadWindow.classList.remove('ondrag');
|
|
|
|
document.l10n.formatValue('uploadPageMultipleFilesAlert').then(str => {
|
|
|
|
alert(str);
|
|
|
|
});
|
|
|
|
return;
|
|
|
|
}
|
2017-08-16 18:03:17 +00:00
|
|
|
file = event.dataTransfer.files[0];
|
2017-08-14 19:04:03 +00:00
|
|
|
} else {
|
|
|
|
file = event.target.files[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (file.size > MAXFILESIZE) {
|
|
|
|
return document.l10n
|
|
|
|
.formatValue('fileTooBig', { size: bytes(MAXFILESIZE) })
|
|
|
|
.then(alert);
|
|
|
|
}
|
|
|
|
|
|
|
|
pageOne.hidden = true;
|
|
|
|
uploadError.hidden = true;
|
|
|
|
uploadProgress.hidden = false;
|
|
|
|
document.l10n
|
|
|
|
.formatValue('uploadingPageProgress', {
|
|
|
|
size: bytes(file.size),
|
|
|
|
filename: file.name
|
|
|
|
})
|
|
|
|
.then(str => {
|
|
|
|
document.getElementById('upload-filename').textContent = str;
|
|
|
|
});
|
|
|
|
document.l10n.formatValue('importingFile').then(progress.setText);
|
|
|
|
//don't allow drag and drop when not on page-one
|
|
|
|
document.body.removeEventListener('drop', upload);
|
|
|
|
|
|
|
|
const fileSender = new FileSender(file);
|
|
|
|
document.getElementById('cancel-upload').addEventListener('click', () => {
|
|
|
|
fileSender.cancel();
|
|
|
|
metrics.cancelledUpload({
|
|
|
|
size: file.size,
|
|
|
|
type: clickOrDrop
|
|
|
|
});
|
|
|
|
location.reload();
|
|
|
|
});
|
|
|
|
|
|
|
|
let uploadStart;
|
|
|
|
fileSender.on('progress', data => {
|
|
|
|
uploadStart = uploadStart || Date.now();
|
|
|
|
progress.setProgress({
|
|
|
|
complete: data[0],
|
|
|
|
total: data[1]
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
fileSender.on('encrypting', () => {
|
|
|
|
document.l10n.formatValue('encryptingFile').then(progress.setText);
|
|
|
|
});
|
|
|
|
|
|
|
|
let t;
|
|
|
|
const startTime = Date.now();
|
|
|
|
metrics.startedUpload({
|
|
|
|
size: file.size,
|
|
|
|
type: clickOrDrop
|
|
|
|
});
|
|
|
|
// For large files we need to give the ui a tick to breathe and update
|
|
|
|
// before we kick off the FileSender
|
|
|
|
setTimeout(() => {
|
|
|
|
fileSender
|
|
|
|
.upload()
|
|
|
|
.then(info => {
|
|
|
|
const endTime = Date.now();
|
|
|
|
const time = endTime - startTime;
|
|
|
|
const uploadTime = endTime - uploadStart;
|
|
|
|
const speed = file.size / (uploadTime / 1000);
|
|
|
|
const expiration = EXPIRE_SECONDS * 1000;
|
|
|
|
|
|
|
|
link.setAttribute('value', `${info.url}#${info.secretKey}`);
|
|
|
|
|
2017-08-17 16:27:06 +00:00
|
|
|
const copyText = document.getElementById('copy-text');
|
|
|
|
copyText.setAttribute(
|
|
|
|
'data-l10n-args',
|
|
|
|
JSON.stringify({ filename: file.name })
|
|
|
|
);
|
|
|
|
copyText.setAttribute('data-l10n-id', 'copyUrlFormLabelWithName');
|
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
metrics.completedUpload({
|
|
|
|
size: file.size,
|
|
|
|
time,
|
|
|
|
speed,
|
|
|
|
type: clickOrDrop
|
|
|
|
});
|
|
|
|
|
|
|
|
const fileData = {
|
|
|
|
name: file.name,
|
|
|
|
size: file.size,
|
|
|
|
fileId: info.fileId,
|
|
|
|
url: info.url,
|
|
|
|
secretKey: info.secretKey,
|
|
|
|
deleteToken: info.deleteToken,
|
|
|
|
creationDate: new Date(),
|
|
|
|
expiry: expiration,
|
|
|
|
totalTime: time,
|
|
|
|
typeOfUpload: clickOrDrop,
|
|
|
|
uploadSpeed: speed
|
|
|
|
};
|
|
|
|
|
|
|
|
document.getElementById('delete-file').addEventListener('click', () => {
|
|
|
|
FileSender.delete(fileData.fileId, fileData.deleteToken).then(() => {
|
|
|
|
const ttl =
|
|
|
|
ONE_DAY_IN_MS - (Date.now() - fileData.creationDate.getTime());
|
|
|
|
metrics
|
|
|
|
.deletedUpload({
|
|
|
|
size: fileData.size,
|
|
|
|
time: fileData.totalTime,
|
|
|
|
speed: fileData.uploadSpeed,
|
|
|
|
type: fileData.typeOfUpload,
|
|
|
|
location: 'success-screen',
|
|
|
|
ttl
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
storage.remove(fileData.fileId);
|
|
|
|
location.reload();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
storage.addFile(info.fileId, fileData);
|
|
|
|
|
|
|
|
pageOne.hidden = true;
|
|
|
|
uploadProgress.hidden = true;
|
|
|
|
uploadError.hidden = true;
|
|
|
|
document.getElementById('share-link').hidden = false;
|
|
|
|
|
|
|
|
fileList.addFile(fileData);
|
|
|
|
document.l10n.formatValue('notifyUploadDone').then(str => {
|
|
|
|
notify(str);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
// err is 0 when coming from a cancel upload event
|
|
|
|
if (err === 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// only show error page when the error is anything other than user cancelling the upload
|
|
|
|
Raven.captureException(err);
|
|
|
|
pageOne.hidden = true;
|
|
|
|
uploadProgress.hidden = true;
|
|
|
|
uploadError.hidden = false;
|
|
|
|
window.clearTimeout(t);
|
|
|
|
|
|
|
|
metrics.stoppedUpload({
|
|
|
|
size: file.size,
|
|
|
|
type: clickOrDrop,
|
|
|
|
err
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}, 10);
|
|
|
|
}
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
2017-08-03 21:07:22 +00:00
|
|
|
gcmCompliant()
|
2017-08-05 19:23:58 +00:00
|
|
|
.then(function() {
|
2017-08-14 19:04:03 +00:00
|
|
|
const pageOne = document.getElementById('page-one');
|
|
|
|
const copyBtn = document.getElementById('copy-btn');
|
|
|
|
const link = document.getElementById('link');
|
|
|
|
const uploadWindow = document.querySelector('.upload-window');
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
pageOne.hidden = false;
|
|
|
|
document.getElementById('file-upload').addEventListener('change', upload);
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
document.body.addEventListener('dragover', allowDrop);
|
|
|
|
document.body.addEventListener('drop', upload);
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-03 21:07:22 +00:00
|
|
|
// reset copy button
|
2017-08-14 19:04:03 +00:00
|
|
|
copyBtn.disabled = !allowedCopy();
|
|
|
|
copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton');
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
link.disabled = false;
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-03 21:07:22 +00:00
|
|
|
// copy link to clipboard
|
2017-08-14 19:04:03 +00:00
|
|
|
copyBtn.addEventListener('click', () => {
|
|
|
|
if (allowedCopy() && copyToClipboard(link.getAttribute('value'))) {
|
2017-08-05 19:23:58 +00:00
|
|
|
metrics.copiedLink({ location: 'success-screen' });
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-04 21:44:11 +00:00
|
|
|
//disable button for 3s
|
2017-08-14 19:04:03 +00:00
|
|
|
copyBtn.disabled = true;
|
|
|
|
link.disabled = true;
|
2017-08-17 16:15:45 +00:00
|
|
|
copyBtn.innerHTML = `<img src="${checkImg}" class="icon-check"></img>`;
|
2017-08-04 20:41:06 +00:00
|
|
|
setTimeout(() => {
|
2017-08-14 19:04:03 +00:00
|
|
|
copyBtn.disabled = !allowedCopy();
|
|
|
|
copyBtn.setAttribute('data-l10n-id', 'copyUrlFormButton');
|
|
|
|
link.disabled = false;
|
2017-08-04 21:44:11 +00:00
|
|
|
}, 3000);
|
|
|
|
}
|
2017-07-21 20:25:08 +00:00
|
|
|
});
|
2017-07-18 17:52:32 +00:00
|
|
|
|
2017-08-14 19:04:03 +00:00
|
|
|
uploadWindow.addEventListener('dragover', () =>
|
|
|
|
uploadWindow.classList.add('ondrag')
|
|
|
|
);
|
|
|
|
uploadWindow.addEventListener('dragleave', () =>
|
|
|
|
uploadWindow.classList.remove('ondrag')
|
|
|
|
);
|
2017-08-04 20:41:06 +00:00
|
|
|
|
2017-08-03 21:07:22 +00:00
|
|
|
// on file upload by browse or drag & drop
|
|
|
|
|
|
|
|
function allowDrop(ev) {
|
|
|
|
ev.preventDefault();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(err => {
|
2017-08-05 19:23:58 +00:00
|
|
|
metrics.unsupported({ err }).then(() => {
|
2017-08-03 21:07:22 +00:00
|
|
|
location.replace('/unsupported/gcm');
|
2017-07-13 14:05:45 +00:00
|
|
|
});
|
2017-06-23 17:35:17 +00:00
|
|
|
});
|
2017-06-06 21:24:51 +00:00
|
|
|
});
|