send/frontend/src/upload.js

257 lines
7.7 KiB
JavaScript
Raw Normal View History

/* 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,
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-13 18:02:27 +00:00
import $ from 'jquery/dist/jquery.slim';
2017-07-21 20:36:26 +00:00
2017-08-10 19:59:07 +00:00
const storage = new Storage();
$(() => {
gcmCompliant()
2017-08-05 19:23:58 +00:00
.then(function() {
const $pageOne = $('#page-one');
const $copyBtn = $('#copy-btn');
const $link = $('#link');
const $uploadWindow = $('.upload-window');
const $uploadError = $('#upload-error');
const $uploadProgress = $('#upload-progress');
$pageOne.removeAttr('hidden');
$('#file-upload').on('change', onUpload);
2017-08-05 19:23:58 +00:00
$(document.body).on('dragover', allowDrop).on('drop', onUpload);
// reset copy button
$copyBtn.attr({
disabled: !allowedCopy(),
'data-l10n-id': 'copyUrlFormButton'
2017-08-05 19:23:58 +00:00
});
$link.attr('disabled', false);
// copy link to clipboard
$copyBtn.on('click', () => {
if (allowedCopy() && copyToClipboard($link.attr('value'))) {
2017-08-05 19:23:58 +00:00
metrics.copiedLink({ location: 'success-screen' });
//disable button for 3s
$copyBtn.attr('disabled', true);
$link.attr('disabled', true);
$copyBtn.html(
'<img src="/resources/check-16.svg" class="icon-check"></img>'
);
setTimeout(() => {
$copyBtn.attr({
disabled: false,
'data-l10n-id': 'copyUrlFormButton'
});
$link.attr('disabled', false);
}, 3000);
}
2017-07-21 20:25:08 +00:00
});
2017-07-18 17:52:32 +00:00
2017-08-05 19:23:58 +00:00
$uploadWindow
.on('dragover', () => {
$uploadWindow.addClass('ondrag');
})
.on('dragleave', () => {
$uploadWindow.removeClass('ondrag');
});
// on file upload by browse or drag & drop
function onUpload(event) {
event.preventDefault();
2017-08-05 19:23:58 +00:00
const clickOrDrop = event.type === 'drop' ? 'drop' : 'click';
// don't allow upload if not on upload page
if ($pageOne.attr('hidden')) {
return;
}
storage.totalUploads += 1;
let file = '';
2017-08-05 19:23:58 +00:00
if (clickOrDrop === 'drop') {
if (!event.originalEvent.dataTransfer.files[0]) {
$uploadWindow.removeClass('ondrag');
return;
}
if (
event.originalEvent.dataTransfer.files.length > 1 ||
event.originalEvent.dataTransfer.files[0].size === 0
) {
$uploadWindow.removeClass('ondrag');
document.l10n
.formatValue('uploadPageMultipleFilesAlert')
.then(str => {
alert(str);
});
return;
}
file = event.originalEvent.dataTransfer.files[0];
} else {
file = event.target.files[0];
}
if (file.size > MAXFILESIZE) {
return document.l10n
.formatValue('fileTooBig', { size: bytes(MAXFILESIZE) })
.then(alert);
}
$pageOne.attr('hidden', true);
$uploadError.attr('hidden', true);
$uploadProgress.removeAttr('hidden');
2017-08-06 01:06:43 +00:00
document.l10n
.formatValue('uploadingPageProgress', {
size: bytes(file.size),
filename: file.name
})
.then(str => {
$('#upload-filename').text(str);
});
document.l10n.formatValue('importingFile').then(progress.setText);
//don't allow drag and drop when not on page-one
$(document.body).off('drop', onUpload);
2017-07-20 22:16:00 +00:00
const fileSender = new FileSender(file);
$('#cancel-upload').on('click', () => {
fileSender.cancel();
2017-08-05 19:23:58 +00:00
metrics.cancelledUpload({
size: file.size,
type: clickOrDrop
2017-07-24 05:26:06 +00:00
});
location.reload();
});
2017-07-24 05:26:06 +00:00
2017-08-06 01:06:43 +00:00
let uploadStart;
fileSender.on('progress', data => {
uploadStart = uploadStart || Date.now();
progress.setProgress({
complete: data[0],
total: data[1]
});
});
2017-08-06 01:06:43 +00:00
fileSender.on('encrypting', () => {
document.l10n.formatValue('encryptingFile').then(progress.setText);
});
let t;
const startTime = Date.now();
2017-08-05 19:23:58 +00:00
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();
2017-08-05 19:23:58 +00:00
const time = endTime - startTime;
const uploadTime = endTime - uploadStart;
2017-08-05 19:23:58 +00:00
const speed = file.size / (uploadTime / 1000);
const expiration = EXPIRE_SECONDS * 1000;
2017-08-05 19:23:58 +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,
2017-08-05 19:23:58 +00:00
totalTime: time,
typeOfUpload: clickOrDrop,
uploadSpeed: speed
};
$('#delete-file').on('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);
2017-08-06 01:06:43 +00:00
$pageOne.attr('hidden', true);
$uploadProgress.attr('hidden', true);
$uploadError.attr('hidden', true);
$('#share-link').removeAttr('hidden');
2017-08-11 02:01:39 +00:00
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.attr('hidden', true);
$uploadProgress.attr('hidden', true);
$uploadError.removeAttr('hidden');
window.clearTimeout(t);
2017-08-05 19:23:58 +00:00
metrics.stoppedUpload({
size: file.size,
type: clickOrDrop,
err
});
});
}, 10);
}
function allowDrop(ev) {
ev.preventDefault();
}
})
.catch(err => {
2017-08-05 19:23:58 +00:00
metrics.unsupported({ err }).then(() => {
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
});