diff --git a/src/js/app-config.js b/src/js/app-config.js index e1328a8..b15ca45 100644 --- a/src/js/app-config.js +++ b/src/js/app-config.js @@ -27,7 +27,8 @@ define([], function() { port: 465, host: 'smtp.gmail.com' } - } + }, + checkOutboxInterval: 30000 }; /** diff --git a/src/js/controller/navigation.js b/src/js/controller/navigation.js index 376f365..0323a21 100644 --- a/src/js/controller/navigation.js +++ b/src/js/controller/navigation.js @@ -4,7 +4,8 @@ define(function(require) { var angular = require('angular'), appController = require('js/app-controller'), _ = require('underscore'), - emailDao; + config = require('js/app-config').config, + emailDao, senderIntervalId; // // Controller @@ -91,6 +92,69 @@ define(function(require) { } }; + $scope.sendFirstFromOutbox = function() { + var dbType = 'email_OUTBOX', + outbox = _.findWhere($scope.folders, { + type: 'Outbox' + }); + + checkStorage(); + + function checkStorage() { + // get last item from outbox + emailDao._devicestorage.listItems(dbType, 0, null, function(err, pending) { + if (err) { + console.error(err); + return; + } + + // update outbox folder count + outbox.count = pending.length; + $scope.$apply(); + if (pending.length < 1) { + return; + } + + // sending the first one pending + send(pending[0]); + }); + } + + function send(email) { + emailDao.smtpSend(email, function(err) { + if (err) { + console.error(err); + return; + } + + removeFromStorage(email.id); + }); + } + + function removeFromStorage(id) { + if (!id) { + console.error('Cannot remove email from storage without a valid id!'); + return; + } + + // delete email from local storage + var key = dbType + '_' + id; + emailDao._devicestorage.removeList(key, function(err) { + if (err) { + console.error(err); + return; + } + + outbox.count = (outbox.count > 0) ? outbox.count - 1 : outbox.count; + $scope.$apply(); + }); + } + }; + + // + // Start + // + initFolders(function(folders) { $scope.folders = folders; // select inbox as the current folder on init @@ -113,6 +177,9 @@ define(function(require) { f.count = 0; }); + // start checking outbox periodically + startOutboxSender(); + callback(folders); $scope.$apply(); }); @@ -141,6 +208,11 @@ define(function(require) { path: 'TRASH' }]); } + + function startOutboxSender() { + // start periodic checking of outbox + senderIntervalId = setInterval($scope.sendFirstFromOutbox, config.checkOutboxInterval); + } }; // diff --git a/src/js/controller/write.js b/src/js/controller/write.js index 2b503e7..f95391f 100644 --- a/src/js/controller/write.js +++ b/src/js/controller/write.js @@ -76,7 +76,7 @@ define(function(require) { $scope.ciphertextPreview = (body) ? aes.encrypt(body, key, iv) : ''; }; - $scope.sendEmail = function() { + $scope.sendToOutbox = function() { var to, body, email; // validate recipients @@ -106,15 +106,18 @@ define(function(require) { }); }); - emailDao.smtpSend(email, function(err) { + // set an id for the email and store in outbox + email.id = util.UUID(); + emailDao._devicestorage.storeList([email], 'email_OUTBOX', function(err) { if (err) { - console.log(err); + console.error(err); return; } var ps = $scope.$parent.$parent; ps.closeWriter(); ps.$apply(); + ps.sendFirstFromOutbox(); }); }; }; diff --git a/src/tpl/write.html b/src/tpl/write.html index 2fdfe65..d582afd 100644 --- a/src/tpl/write.html +++ b/src/tpl/write.html @@ -37,7 +37,7 @@
- +