const FileSender = require('./fileSender'); const { notify, gcmCompliant } = require('./utils'); const $ = require('jquery'); require('jquery-circle-progress'); const Raven = window.Raven; $(document).ready(function() { gcmCompliant() .catch(err => { $('#page-one').attr('hidden', true); $('#unsupported-browser').removeAttr('hidden'); window.analytics .sendEvent('sender', 'unsupported', { cd7: err }); }); $('#file-upload').change(onUpload); $('#send-new-completed').click(function() { window.analytics .sendEvent('sender', 'restarted', { cd2: 'completed' }); }) $('#send-new-error').click(function() { window.analytics .sendEvent('sender', 'restarted', { cd2: 'errored' }); }) $('body').on('dragover', allowDrop).on('drop', onUpload); // reset copy button const $copyBtn = $('#copy-btn'); $copyBtn.attr('disabled', false); $('#link').attr('disabled', false); $copyBtn.attr('data-l10n-id', 'copyUrlFormButton'); if (localStorage.length === 0) { toggleHeader(); } else { for (let i = 0; i < localStorage.length; i++) { const id = localStorage.key(i); //check if file exists before adding to list checkExistence(id, true); } } // copy link to clipboard $copyBtn.click(() => { window.analytics .sendEvent('sender', 'copied', { cd6: 'success-screen' }); const aux = document.createElement('input'); aux.setAttribute('value', $('#link').attr('value')); document.body.appendChild(aux); aux.select(); document.execCommand('copy'); document.body.removeChild(aux); //disable button for 3s $copyBtn.attr('disabled', true); $('#link').attr('disabled', true); $copyBtn.html(''); window.setTimeout(() => { $copyBtn.attr('disabled', false); $('#link').attr('disabled', false); $copyBtn.attr('data-l10n-id', 'copyUrlFormButton'); }, 3000); }); $('.upload-window').on('dragover', () => { $('.upload-window').addClass('ondrag'); }); $('.upload-window').on('dragleave', () => { $('.upload-window').removeClass('ondrag'); }); //initiate progress bar $('#ul-progress').circleProgress({ value: 0.0, startAngle: -Math.PI / 2, fill: '#3B9DFF', size: 158, animation: { duration: 300 } }); //link back to homepage $('.send-new').attr('href', window.location); // on file upload by browse or drag & drop function onUpload(event) { event.preventDefault(); let file = ''; if (event.type === 'drop') { if (event.originalEvent.dataTransfer.files.length > 1 || event.originalEvent.dataTransfer.files[0].size === 0){ $('.upload-window').removeClass('ondrag'); document.l10n.formatValue('uploadPageMultipleFilesAlert') .then(str => { alert(str); }); return; } file = event.originalEvent.dataTransfer.files[0]; } else { file = event.target.files[0]; } $('#page-one').attr('hidden', true); $('#upload-error').attr('hidden', true); $('#upload-progress').removeAttr('hidden'); //don't allow drag and drop when not on page-one $('body').off('drop', onUpload); const expiration = 24 * 60 * 60 * 1000; //will eventually come from a field const fileSender = new FileSender(file); $('#cancel-upload').click(() => { fileSender.cancel(); location.reload(); document.l10n.formatValue('uploadCancelNotification') .then(str => { notify(str); }); }); fileSender.on('progress', progress => { const percent = progress[0] / progress[1]; // update progress bar $('#ul-progress').circleProgress('value', percent); $('#ul-progress').circleProgress().on('circle-animation-end', function() { $('.percent-number').html(`${Math.floor(percent * 100)}`); }); if (progress[1] < 1000000) { $('.progress-text').text( `${file.name} (${(progress[0] / 1000).toFixed(1)}KB of ${(progress[1] / 1000).toFixed(1)}KB)` ); } else if (progress[1] < 1000000000) { $('.progress-text').text( `${file.name} (${(progress[0] / 1000000).toFixed(1)}MB of ${(progress[1] / 1000000).toFixed(1)}MB)` ); } else { $('.progress-text').text( `${file.name} (${(progress[0] / 1000000).toFixed(1)}MB of ${(progress[1] / 1000000000).toFixed(1)}GB)` ); } }); fileSender.on('loading', isStillLoading => { // The file is loading into Firefox at this stage if (isStillLoading) { console.log('Processing'); } else { console.log('Finished processing'); } }); fileSender.on('hashing', isStillHashing => { // The file is being hashed if (isStillHashing) { console.log('Hashing'); } else { console.log('Finished hashing'); } }); fileSender.on('encrypting', isStillEncrypting => { // The file is being encrypted if (isStillEncrypting) { console.log('Encrypting'); } else { console.log('Finished encrypting'); } }); let t = ''; fileSender .upload() .then(info => { const fileData = { name: file.name, fileId: info.fileId, url: info.url, secretKey: info.secretKey, deleteToken: info.deleteToken, creationDate: new Date(), expiry: expiration }; localStorage.setItem(info.fileId, JSON.stringify(fileData)); $('#upload-filename').attr('data-l10n-id', 'uploadSuccessConfirmHeader'); t = window.setTimeout(() => { $('#page-one').attr('hidden', true); $('#upload-progress').attr('hidden', true); $('#upload-error').attr('hidden', true); $('#share-link').removeAttr('hidden'); }, 1000); populateFileList(JSON.stringify(fileData)); document.l10n.formatValue('notifyUploadDone') .then(str => { notify(str); }); }) .catch(err => { Raven.captureException(err); console.log(err); $('#page-one').attr('hidden', true); $('#upload-progress').attr('hidden', true); $('#upload-error').removeAttr('hidden'); window.clearTimeout(t); }); } function allowDrop(ev) { ev.preventDefault(); } function checkExistence(id, populate) { const xhr = new XMLHttpRequest(); xhr.onreadystatechange = () => { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { if (populate) { populateFileList(localStorage.getItem(id)); } } else if (xhr.status === 404) { localStorage.removeItem(id); } } }; xhr.open('get', '/exists/' + id, true); xhr.send(); } //update file table with current files in localStorage function populateFileList(file) { try { file = JSON.parse(file); } catch (e) { return; } const row = document.createElement('tr'); const name = document.createElement('td'); const link = document.createElement('td'); const $copyIcon = $('', { src: '/resources/copy-16.svg', class: 'icon-copy', 'data-l10n-id': 'copyUrlHover'}); const expiry = document.createElement('td'); const del = document.createElement('td'); const $delIcon = $('', { src: '/resources/close-16.svg', class: 'icon-delete', 'data-l10n-id': 'deleteButtonHover' }); const popupDiv = document.createElement('div'); const $popupText = $('