Skip to content
This repository has been archived by the owner on Nov 8, 2018. It is now read-only.

Commit

Permalink
Merge pull request #1418 from owncloud/move-startup-logic
Browse files Browse the repository at this point in the history
Move startup logic to App::onStart
  • Loading branch information
ChristophWurst committed Apr 15, 2016
2 parents 3b920af + cba0744 commit 8b58e2a
Show file tree
Hide file tree
Showing 4 changed files with 199 additions and 175 deletions.
88 changes: 85 additions & 3 deletions js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,104 @@
define(function(require) {
'use strict';

var $ = require('jquery');
var Marionette = require('marionette');
var AppView = require('views/app');
var AccountController = require('controller/accountcontroller');
var FolderController = require('./controller/foldercontroller');
var Radio = require('radio');

// Load controllers/services
require('controller/accountcontroller');
require('controller/foldercontroller');
require('controller/messagecontroller');
require('service/accountservice');
require('service/folderservice');
require('notification');

var Mail = new Marionette.Application();
var Mail = Marionette.Application.extend({
initialize: function() {
this.listenTo(Radio.account, 'add', this.addAccount);
},
/**
* Handle mailto links
*
* @returns {boolean} whether the composer has been shown
*/
handleMailto: function() {
var hash = window.location.hash;
if (hash === '' || hash === '#') {
// Nothing to do
return false;
}

// Remove leading #
hash = hash.substr(1);

var composerOptions = {};
var params = hash.split('&');

_.each(params, function(param) {
param = param.split('=');
var key = param[0];
var value = param[1];
value = decodeURIComponent((value).replace(/\+/g, '%20'));

switch (key) {
case 'mailto':
case 'to':
composerOptions.to = value;
break;
case 'cc':
composerOptions.cc = value;
break;
case 'bcc':
composerOptions.bcc = value;
break;
case 'subject':
composerOptions.subject = value;
break;
case 'body':
composerOptions.body = value;
break;
}
});

window.location.hash = '';
Radio.ui.trigger('composer:show', composerOptions);
return true;
},
addAccount: function() {
Radio.ui.trigger('composer:leave');
Radio.ui.trigger('navigation:hide');
Radio.ui.trigger('setup:show');
}
});

Mail = new Mail();

Mail.on('start', function() {
Radio.account.trigger('load');
Radio.ui.trigger('content:loading');

var loadingAccounts = AccountController.loadAccounts();
var _this = this;
$.when(loadingAccounts).done(function(accounts) {
$('#app-navigation').removeClass('icon-loading');

if (accounts.isEmpty()) {
_this.addAccount();
} else {
if (!_this.handleMailto()) {
Radio.ui.trigger('messagecontent:show');
}

var firstAccount = accounts.at(0);
var firstFolder = firstAccount.get('folders').at(0);
FolderController.showFolder(firstAccount, firstFolder);
}

// Start fetching messages in background
require('background').messageFetcher.start();
});
});

Mail.view = new AppView();
Expand Down
29 changes: 12 additions & 17 deletions js/controller/accountcontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,39 +16,32 @@ define(function(require) {
var Radio = require('radio');
var UPDATE_INTERVAL = 5 * 60 * 1000; // 5 minutes

Radio.account.on('add', addAccount);
Radio.account.on('load', loadAccounts);

function addAccount() {
Radio.ui.trigger('composer:leave');
Radio.ui.trigger('navigation:hide');
Radio.ui.trigger('setup:show');
}

function startBackgroundChecks(accounts) {
setInterval((function(accounts) {
setInterval(function(accounts) {
require('background').checkForNotifications(accounts);
}(accounts)), UPDATE_INTERVAL);
}, UPDATE_INTERVAL);
}

/**
* Load all accounts
*
* @returns {Promise}
*/
function loadAccounts() {
var defer = $.Deferred();
var fetchingAccounts = Radio.account.request('entities');
Radio.ui.trigger('content:loading');

$.when(fetchingAccounts).done(function(accounts) {
if (accounts.length === 0) {
addAccount();
} else {
var firstAccount = accounts.at(0);
var loadingAccounts = accounts.map(function(account) {
return FolderController.loadFolder(account, firstAccount);
return FolderController.loadFolder(account);
});
$.when.apply($, loadingAccounts).done(function() {
$('#app-navigation').removeClass('icon-loading');
Radio.ui.trigger('messagecontent:show');

// Start fetching messages in background
require('background').messageFetcher.start();
defer.resolve(accounts);
});
}

Expand All @@ -57,6 +50,8 @@ define(function(require) {
$.when(fetchingAccounts).fail(function() {
Radio.ui.trigger('error:show', t('mail', 'Error while loading the accounts.'));
});

return defer.promise();
}

return {
Expand Down
167 changes: 102 additions & 65 deletions js/controller/foldercontroller.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,91 +16,128 @@ define(function(require) {
var Radio = require('radio');
var FolderService = require('service/folderservice');

function urldecode(str) {
return decodeURIComponent((str + '').replace(/\+/g, '%20'));
}
Radio.ui.on('folder:show', loadFolderMessages);

/**
* Handle mailto links
*
* @param {Account} account
* @returns {undefined}
*/
function handleMailTo() {
var hash = window.location.hash;
if (hash === '' || hash === '#') {
// Nothing to do
return;
}
function loadFolders(account) {
var fetchingFolders = FolderService.getFolderEntities(account);

Radio.ui.trigger('messagesview:messages:reset');
$('#app-navigation').addClass('icon-loading');

// Remove leading #
hash = hash.substr(1);

var composerOptions = {};
var params = hash.split('&');

_.each(params, function(param) {
param = param.split('=');
var key = param[0];
var value = urldecode(param[1]);

switch (key) {
case 'mailto':
case 'to':
composerOptions.to = value;
break;
case 'cc':
composerOptions.cc = value;
break;
case 'bcc':
composerOptions.bcc = value;
break;
case 'subject':
composerOptions.subject = value;
break;
case 'body':
composerOptions.body = value;
break;
}
$.when(fetchingFolders).fail(function() {
Radio.ui.trigger('error:show', t('mail', 'Error while loading the selected account.'));
});

window.location.hash = '';
Radio.ui.trigger('composer:show', composerOptions);
return fetchingFolders.promise();
}

/**
* @param {Account} account
* @param {Account} active
* @param {Folder} folder
* @param {boolean} noSelect
* @returns {undefined}
*/
function loadFolder(account, active) {
var fetchingFolders = FolderService.getFolderEntities(account);

Radio.ui.trigger('messagesview:messages:reset');
$('#app-navigation').addClass('icon-loading');
function loadFolderMessages(account, folder, noSelect) {
Radio.ui.trigger('composer:leave');

$.when(fetchingFolders).done(function(accountFolders) {
if (account === active) {
var folder = accountFolders.at(0);
if (require('state').messagesLoading !== null) {
require('state').messagesLoading.abort();
}
if (require('state').messageLoading !== null) {
require('state').messageLoading.abort();
}

Radio.ui.trigger('folder:show', account, folder, false);
// Set folder active
Radio.folder.trigger('setactive', account, folder);
Radio.ui.trigger('content:loading');
Radio.ui.trigger('messagesview:messages:reset');

// Open composer if 'mailto' url-param is set
handleMailTo();
$('#load-new-mail-messages').hide();
$('#load-more-mail-messages').hide();

if (noSelect) {
$('#emptycontent').show();
require('state').currentAccount = account;
require('state').currentFolder = folder;
Radio.ui.trigger('messagesview:message:setactive', null);
require('state').currentlyLoading = null;
} else {
require('communication').fetchMessageList(account, folder, {
onSuccess: function(messages, cached) {
Radio.ui.trigger('messagecontent:show');
require('state').currentlyLoading = null;
require('state').currentAccount = account;
require('state').currentFolder = folder;
Radio.ui.trigger('messagesview:message:setactive', null);

// Fade out the message composer
$('#mail_new_message').prop('disabled', false);

if (messages.length > 0) {
Radio.ui.trigger('messagesview:messages:add', messages);

// Fetch first 10 messages in background
_.each(messages.slice(0, 10), function(
message) {
require('background').messageFetcher.push(message.id);
});

var messageId = messages[0].id;
Radio.message.trigger('load', account, folder, messageId);
// Show 'Load More' button if there are
// more messages than the pagination limit
if (messages.length > 20) {
$('#load-more-mail-messages')
.fadeIn()
.css('display', 'block');
}
} else {
$('#emptycontent').show();
}
$('#load-new-mail-messages')
.fadeIn()
.css('display', 'block')
.prop('disabled', false);

if (cached) {
// Trigger folder update
// TODO: replace with horde sync once it's implemented
Radio.ui.trigger('messagesview:messages:update');
}
},
onError: function(error, textStatus) {
if (textStatus !== 'abort') {
// Set the old folder as being active
var folder = require('state').currentFolder;
Radio.folder.trigger('setactive', account, folder);
Radio.ui.trigger('error:show', t('mail', 'Error while loading messages.'));
}
},
cache: true
});
}
}

// Save current folder
Radio.folder.trigger('setactive', account, folder);
require('state').currentAccount = account;
require('state').currentFolder = folder;
}
});
$.when(fetchingFolders).fail(function() {
Radio.ui.trigger('error:show', t('mail', 'Error while loading the selected account.'));
});
/**
* @param {Account} account
* @param {Folder} folder
* @returns {Promise}
*/
function showFolder(account, folder) {
loadFolderMessages(account, folder, false);

return fetchingFolders.promise();
// Save current folder
Radio.folder.trigger('setactive', account, folder);
require('state').currentAccount = account;
require('state').currentFolder = folder;
}

return {
loadFolder: loadFolder
loadFolder: loadFolders,
showFolder: showFolder
};
});
Loading

0 comments on commit 8b58e2a

Please sign in to comment.