(function() { 'use strict'; var weechat = angular.module('weechat'); var neoDropCrypto = require('./neodrop-crypto'); weechat.factory('imgur', ['$rootScope', 'settings', function($rootScope, settings) { var BASE = '{{DROPS_ORIGIN}}'; var showErrorMsg = function(message) { $rootScope.uploadError = true; $rootScope.uploadErrorMessage = message || 'Encrypted upload failed.'; if (!$rootScope.$$phase) $rootScope.$apply(); setTimeout(function() { $rootScope.uploadError = false; if (!$rootScope.$$phase) $rootScope.$apply(); }, 5000); }; var process = function(file, callback) { if (!file || typeof file.size !== 'number') return; if (file.size > neoDropCrypto.LARGE_MAX) { showErrorMsg('NeoDrop files are limited to 1 GiB.'); return; } var profile = (settings.dropProfile === 'large' || file.size > neoDropCrypto.SMALL_MAX) ? 1 : 0; var progressBars = document.getElementById('imgur-upload-progress'); var bar = document.createElement('div'); bar.className = 'imgur-progress-bar'; progressBars.appendChild(bar); neoDropCrypto.upload(file, { base: BASE, profile: profile, onProgress: function(value) { bar.style.width = Math.round(value * 100) + '%'; } }).then(function(result) { if (typeof $rootScope.registerNeoDrop === 'function') { $rootScope.registerNeoDrop(result.readUrl, result.deleteCapability); } if (callback) callback(result.readUrl, result.deleteCapability); }).catch(function(error) { showErrorMsg(error.message); }).finally(function() { setTimeout(function() { if (bar.parentNode) bar.parentNode.removeChild(bar); }, 500); }); }; var deleteImage = function(capability, callback) { var split = String(capability || '').split('.'); if (split.length !== 2) return showErrorMsg('Invalid deletion capability.'); fetch(BASE + '/api/v1/objects/' + split[0], { method: 'DELETE', headers: {'Authorization': 'Bearer ' + split[1]} }).then(function(response) { if (!response.ok) throw new Error('Unable to delete encrypted file.'); if (callback) callback(capability); }).catch(function() { showErrorMsg('Unable to delete encrypted file.'); }); }; return {process: process, deleteImage: deleteImage}; }]); })();