list well known folders works in dao... not yet in ui

This commit is contained in:
Tankred Hase 2013-10-10 19:15:16 +02:00
parent 14965a7c32
commit 9ed7a696b4
6 changed files with 131 additions and 32 deletions

View File

@ -26,28 +26,7 @@ define([], function() {
secure: true, secure: true,
port: 465, port: 465,
host: 'smtp.gmail.com' host: 'smtp.gmail.com'
}, }
folders: [{
type: 'Inbox',
count: undefined,
path: 'INBOX'
}, {
type: 'Sent',
count: undefined,
path: '[Gmail]/Gesendet'
}, {
type: 'Outbox',
count: undefined,
path: 'OUTBOX'
}, {
type: 'Drafts',
count: undefined,
path: '[Gmail]/Entw&APw-rfe'
}, {
type: 'Trash',
count: undefined,
path: '[Gmail]/Papierkorb'
}]
} }
}; };

View File

@ -52,6 +52,10 @@ define(function(require) {
}; };
$scope.$watch('currentFolder', function() { $scope.$watch('currentFolder', function() {
if (!getFolder()) {
return;
}
// production... in chrome packaged app // production... in chrome packaged app
if (window.chrome && chrome.identity) { if (window.chrome && chrome.identity) {
initList(); initList();

View File

@ -1,11 +1,24 @@
define(function(require) { define(function(require) {
'use strict'; 'use strict';
var folders = require('js/app-config').config.gmail.folders; var appController = require('js/app-controller'),
emailDao;
var NavigationCtrl = function($scope) { var NavigationCtrl = function($scope) {
$scope.navOpen = false; $scope.navOpen = false;
emailDao = appController._emailDao;
initFolders(function(folders) {
$scope.folders = folders; $scope.folders = folders;
$scope.apply();
// select inbox as the current folder on init
$scope.openFolder($scope.folders[0]);
});
//
// scope functions
//
$scope.openNav = function() { $scope.openNav = function() {
$scope.navOpen = true; $scope.navOpen = true;
@ -19,8 +32,6 @@ define(function(require) {
$scope.currentFolder = folder; $scope.currentFolder = folder;
$scope.closeNav(); $scope.closeNav();
}; };
// select inbox as the current folder on init
$scope.openFolder($scope.folders[0]);
$scope.write = function(replyTo) { $scope.write = function(replyTo) {
var replyToId = (replyTo) ? replyTo.uid : '', var replyToId = (replyTo) ? replyTo.uid : '',
@ -38,6 +49,21 @@ define(function(require) {
window.open(url, 'Compose Message', 'toolbar=no,width=720,height=640,left=500,top=200,status=no,scrollbars=no,resize=no'); window.open(url, 'Compose Message', 'toolbar=no,width=720,height=640,left=500,top=200,status=no,scrollbars=no,resize=no');
}; };
//
// helper functions
//
function initFolders(callback) {
emailDao.imapListFolders(function(err, folders) {
if (err) {
console.log(err);
return;
}
callback(folders);
});
}
}; };
return NavigationCtrl; return NavigationCtrl;

View File

@ -105,9 +105,57 @@ define(function(require) {
* List the folders in the user's IMAP mailbox. * List the folders in the user's IMAP mailbox.
*/ */
EmailDAO.prototype.imapListFolders = function(callback) { EmailDAO.prototype.imapListFolders = function(callback) {
var self = this; var self = this,
dbType = 'folders';
self._imapClient.listAllFolders(callback); // check local cache
self._devicestorage.listItems(dbType, 0, null, function(err, stored) {
if (err) {
callback(err);
return;
}
if (!stored || stored.length < 1) {
// no folders cached... fetch from server
fetchFromServer();
return;
}
callback(null, stored[0]);
});
function fetchFromServer() {
var folders;
// fetch list from imap server
self._imapClient.listWellKnownFolders(function(err, wellKnownFolders) {
if (err) {
callback(err);
return;
}
folders = [
wellKnownFolders.inbox,
wellKnownFolders.sent, {
type: 'Outbox',
path: 'OUTBOX'
},
wellKnownFolders.drafts,
wellKnownFolders.trash
];
// cache locally
// persist encrypted list in device storage
self._devicestorage.storeList([folders], dbType, function(err) {
if (err) {
callback(err);
return;
}
callback(null, folders);
});
});
}
}; };
/** /**

View File

@ -40,6 +40,21 @@ define(function(require) {
}); });
}); });
describe('List well known folders', function() {
it('should work', function(done) {
// clear folders from cache
emailDao._devicestorage.removeList('folders', function(err) {
expect(err).to.not.exist;
emailDao.imapListFolders(function(err, folders) {
expect(err).to.not.exist;
expect(folders.length).to.be.at.least(1);
done();
});
});
});
});
describe('IMAP sync INBOX messages', function() { describe('IMAP sync INBOX messages', function() {
it('should work', function(done) { it('should work', function(done) {
emailDao.imapSync({ emailDao.imapSync({

View File

@ -218,11 +218,38 @@ define(function(require) {
}); });
describe('IMAP: list folders', function() { describe('IMAP: list folders', function() {
it('should work', function(done) { var dummyFolders = [{
imapClientStub.listAllFolders.yields(); type: 'Inbox',
emailDao.imapListFolders(function(err) { path: 'INBOX'
expect(imapClientStub.listAllFolders.calledOnce).to.be.true; }, {
type: 'Outbox',
path: 'OUTBOX'
}];
it('should work on empty local db', function(done) {
devicestorageStub.listItems.yields(null, [dummyFolders]);
emailDao.imapListFolders(function(err, folders) {
expect(err).to.not.exist; expect(err).to.not.exist;
expect(devicestorageStub.listItems.calledOnce).to.be.true;
expect(folders[0].type).to.equal('Inbox');
done();
});
});
it('should work with local cache', function(done) {
devicestorageStub.listItems.yields(null, []);
imapClientStub.listWellKnownFolders.yields(null, {
inbox: dummyFolders[0]
});
devicestorageStub.storeList.yields();
emailDao.imapListFolders(function(err, folders) {
expect(err).to.not.exist;
expect(devicestorageStub.listItems.calledOnce).to.be.true;
expect(imapClientStub.listWellKnownFolders.calledOnce).to.be.true;
expect(devicestorageStub.storeList.calledOnce).to.be.true;
expect(folders[0].type).to.equal('Inbox');
done(); done();
}); });
}); });