mirror of
https://github.com/the-djmaze/snappymail.git
synced 2025-01-09 16:28:00 +08:00
1497 lines
37 KiB
JavaScript
1497 lines
37 KiB
JavaScript
|
|
import {window, _, $} from 'common';
|
|
import progressJs from 'progressJs';
|
|
import Tinycon from 'Tinycon';
|
|
|
|
import {
|
|
noop, trim, log, isArray, inArray, isUnd, isNormal, isPosNumeric, isNonEmptyArray,
|
|
pInt, pString, delegateRunOnDestroy, mailToHelper, windowResize
|
|
} from 'Common/Utils';
|
|
|
|
import {
|
|
Layout, Capa, StorageResultType, Notification, FolderType,
|
|
SetSystemFoldersNotification, MessageSetAction, ClientSideKeyName
|
|
} from 'Common/Enums';
|
|
|
|
import {
|
|
$html,
|
|
leftPanelWidth, leftPanelDisabled,
|
|
bAnimationSupported, bMobileDevice
|
|
} from 'Common/Globals';
|
|
|
|
import {UNUSED_OPTION_VALUE} from 'Common/Consts';
|
|
import Plugins from 'Common/Plugins';
|
|
import Links from 'Common/Links';
|
|
import Events from 'Common/Events';
|
|
import Translator from 'Common/Translator';
|
|
import Momentor from 'Common/Momentor';
|
|
import Cache from 'Common/Cache';
|
|
|
|
import SocialStore from 'Stores/Social';
|
|
import SettingsStore from 'Stores/User/Settings';
|
|
import AccountStore from 'Stores/User/Account';
|
|
import IdentityStore from 'Stores/User/Identity';
|
|
import TemplateStore from 'Stores/User/Template';
|
|
import FolderStore from 'Stores/User/Folder';
|
|
import PgpStore from 'Stores/User/Pgp';
|
|
import MessageStore from 'Stores/User/Message';
|
|
import ContactStore from 'Stores/User/Contact';
|
|
|
|
import Local from 'Storage/Client';
|
|
import Settings from 'Storage/Settings';
|
|
import RainLoopStorage from 'Storage/RainLoop';
|
|
|
|
import Remote from 'Remote/User/Ajax';
|
|
import Promises from 'Promises/User/Ajax';
|
|
|
|
import EmailModel from 'Model/Email';
|
|
import AccountModel from 'Model/Account';
|
|
import IdentityModel from 'Model/Identity';
|
|
import TemplateModel from 'Model/Template';
|
|
import OpenPgpKeyModel from 'Model/OpenPgpKey';
|
|
|
|
import kn from 'Knoin/Knoin';
|
|
|
|
import {AbstractApp} from 'App/Abstract';
|
|
|
|
class AppUser extends AbstractApp
|
|
{
|
|
oMoveCache = {};
|
|
|
|
constructor()
|
|
{
|
|
super(Remote);
|
|
|
|
this.quotaDebounce = _.debounce(this.quota, 1000 * 30);
|
|
this.moveOrDeleteResponseHelper = _.bind(this.moveOrDeleteResponseHelper, this);
|
|
|
|
this.messagesMoveTrigger = _.debounce(this.messagesMoveTrigger, 500);
|
|
|
|
window.setInterval(() => Events.pub('interval.30s'), 30000);
|
|
window.setInterval(() => Events.pub('interval.1m'), 60000);
|
|
window.setInterval(() => Events.pub('interval.2m'), 60000 * 2);
|
|
window.setInterval(() => Events.pub('interval.3m'), 60000 * 3);
|
|
window.setInterval(() => Events.pub('interval.5m'), 60000 * 5);
|
|
window.setInterval(() => Events.pub('interval.10m'), 60000 * 10);
|
|
window.setInterval(() => Events.pub('interval.15m'), 60000 * 15);
|
|
window.setInterval(() => Events.pub('interval.20m'), 60000 * 15);
|
|
|
|
window.setTimeout(() => window.setInterval(() => Events.pub('interval.2m-after5m'), 60000 * 2), 60000 * 5);
|
|
window.setTimeout(() => window.setInterval(() => Events.pub('interval.5m-after5m'), 60000 * 5), 60000 * 5);
|
|
window.setTimeout(() => window.setInterval(() => Events.pub('interval.10m-after5m'), 60000 * 10), 60000 * 5);
|
|
|
|
$.wakeUp(() => {
|
|
if (RainLoopStorage.checkTimestamp())
|
|
{
|
|
this.reload();
|
|
}
|
|
|
|
Remote.jsVersion((sResult, oData) => {
|
|
if (StorageResultType.Success === sResult && oData && !oData.Result)
|
|
{
|
|
this.reload();
|
|
}
|
|
}, Settings.appSettingsGet('version'));
|
|
|
|
}, {}, 60 * 60 * 1000);
|
|
|
|
if (RainLoopStorage.checkTimestamp())
|
|
{
|
|
this.reload();
|
|
}
|
|
|
|
if (Settings.settingsGet('UserBackgroundHash'))
|
|
{
|
|
_.delay(() => {
|
|
$('#rl-bg')
|
|
.attr('style', 'background-image: none !important;')
|
|
.backstretch(Links.userBackground(Settings.settingsGet('UserBackgroundHash')), {
|
|
fade: bAnimationSupported ? 1000 : 0,
|
|
centeredX: true,
|
|
centeredY: true
|
|
})
|
|
.removeAttr('style')
|
|
;
|
|
}, 1000);
|
|
}
|
|
|
|
this.socialUsers = _.bind(this.socialUsers, this);
|
|
}
|
|
|
|
remote() {
|
|
return Remote;
|
|
}
|
|
|
|
reload() {
|
|
if (window.parent && !!Settings.appSettingsGet('inIframe'))
|
|
{
|
|
window.parent.location.reload();
|
|
}
|
|
else
|
|
{
|
|
window.location.reload();
|
|
}
|
|
}
|
|
|
|
reloadFlagsCurrentMessageListAndMessageFromCache() {
|
|
_.each(MessageStore.messageList(), (message) => {
|
|
Cache.initMessageFlagsFromCache(message);
|
|
});
|
|
Cache.initMessageFlagsFromCache(MessageStore.message());
|
|
}
|
|
|
|
/**
|
|
* @param {boolean=} bDropPagePosition = false
|
|
* @param {boolean=} bDropCurrenFolderCache = false
|
|
*/
|
|
reloadMessageList(bDropPagePosition = false, bDropCurrenFolderCache = false) {
|
|
|
|
let
|
|
iOffset = (MessageStore.messageListPage() - 1) * SettingsStore.messagesPerPage()
|
|
;
|
|
|
|
if (bDropCurrenFolderCache)
|
|
{
|
|
Cache.setFolderHash(FolderStore.currentFolderFullNameRaw(), '');
|
|
}
|
|
|
|
if (bDropPagePosition)
|
|
{
|
|
MessageStore.messageListPage(1);
|
|
MessageStore.messageListPageBeforeThread(1);
|
|
iOffset = 0;
|
|
|
|
kn.setHash(Links.mailBox(
|
|
FolderStore.currentFolderFullNameHash(),
|
|
MessageStore.messageListPage(),
|
|
MessageStore.messageListSearch(),
|
|
MessageStore.messageListThreadUid()
|
|
), true, true);
|
|
}
|
|
|
|
MessageStore.messageListLoading(true);
|
|
Remote.messageList((sResult, oData, bCached) => {
|
|
|
|
if (StorageResultType.Success === sResult && oData && oData.Result)
|
|
{
|
|
MessageStore.messageListError('');
|
|
MessageStore.messageListLoading(false);
|
|
|
|
MessageStore.setMessageList(oData, bCached);
|
|
}
|
|
else if (StorageResultType.Unload === sResult)
|
|
{
|
|
MessageStore.messageListError('');
|
|
MessageStore.messageListLoading(false);
|
|
}
|
|
else if (StorageResultType.Abort !== sResult)
|
|
{
|
|
MessageStore.messageList([]);
|
|
MessageStore.messageListLoading(false);
|
|
MessageStore.messageListError(oData && oData.ErrorCode ?
|
|
Translator.getNotification(oData.ErrorCode) : Translator.i18n('NOTIFICATIONS/CANT_GET_MESSAGE_LIST')
|
|
);
|
|
}
|
|
|
|
}, FolderStore.currentFolderFullNameRaw(), iOffset, SettingsStore.messagesPerPage(),
|
|
MessageStore.messageListSearch(), MessageStore.messageListThreadUid());
|
|
}
|
|
|
|
recacheInboxMessageList() {
|
|
Remote.messageList(noop, Cache.getFolderInboxName(), 0, SettingsStore.messagesPerPage(), '', '', true);
|
|
}
|
|
|
|
/**
|
|
* @param {Function} fResultFunc
|
|
* @return {boolean}
|
|
*/
|
|
contactsSync(fResultFunc) {
|
|
|
|
const oContacts = ContactStore.contacts;
|
|
if (oContacts.importing() || oContacts.syncing() || !ContactStore.enableContactsSync() || !ContactStore.allowContactsSync())
|
|
{
|
|
return false;
|
|
}
|
|
|
|
oContacts.syncing(true);
|
|
|
|
Remote.contactsSync((sResult, oData) => {
|
|
|
|
oContacts.syncing(false);
|
|
|
|
if (fResultFunc)
|
|
{
|
|
fResultFunc(sResult, oData);
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
messagesMoveTrigger() {
|
|
|
|
const
|
|
sTrashFolder = FolderStore.trashFolder(),
|
|
sSpamFolder = FolderStore.spamFolder()
|
|
;
|
|
|
|
_.each(this.oMoveCache, (oItem) => {
|
|
|
|
var
|
|
bSpam = sSpamFolder === oItem.To,
|
|
bTrash = sTrashFolder === oItem.To,
|
|
bHam = !bSpam && sSpamFolder === oItem.From && Cache.getFolderInboxName() === oItem.To
|
|
;
|
|
|
|
Remote.messagesMove(this.moveOrDeleteResponseHelper, oItem.From, oItem.To, oItem.Uid,
|
|
bSpam ? 'SPAM' : (bHam ? 'HAM' : ''), bSpam || bTrash);
|
|
});
|
|
|
|
this.oMoveCache = {};
|
|
}
|
|
|
|
messagesMoveHelper(sFromFolderFullNameRaw, sToFolderFullNameRaw, aUidForMove) {
|
|
|
|
var sH = '$$' + sFromFolderFullNameRaw + '$$' + sToFolderFullNameRaw + '$$';
|
|
if (!this.oMoveCache[sH])
|
|
{
|
|
this.oMoveCache[sH] = {
|
|
From: sFromFolderFullNameRaw,
|
|
To: sToFolderFullNameRaw,
|
|
Uid: []
|
|
};
|
|
}
|
|
|
|
this.oMoveCache[sH].Uid = _.union(this.oMoveCache[sH].Uid, aUidForMove);
|
|
this.messagesMoveTrigger();
|
|
}
|
|
|
|
messagesCopyHelper(sFromFolderFullNameRaw, sToFolderFullNameRaw, aUidForCopy) {
|
|
Remote.messagesCopy(
|
|
this.moveOrDeleteResponseHelper,
|
|
sFromFolderFullNameRaw,
|
|
sToFolderFullNameRaw,
|
|
aUidForCopy
|
|
);
|
|
}
|
|
|
|
messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove) {
|
|
Remote.messagesDelete(
|
|
this.moveOrDeleteResponseHelper,
|
|
sFromFolderFullNameRaw,
|
|
aUidForRemove
|
|
);
|
|
}
|
|
|
|
moveOrDeleteResponseHelper(sResult, oData) {
|
|
|
|
if (StorageResultType.Success === sResult && FolderStore.currentFolder())
|
|
{
|
|
if (oData && isArray(oData.Result) && 2 === oData.Result.length)
|
|
{
|
|
Cache.setFolderHash(oData.Result[0], oData.Result[1]);
|
|
}
|
|
else
|
|
{
|
|
Cache.setFolderHash(FolderStore.currentFolderFullNameRaw(), '');
|
|
|
|
if (oData && -1 < inArray(oData.ErrorCode,
|
|
[Notification.CantMoveMessage, Notification.CantCopyMessage]))
|
|
{
|
|
window.alert(Translator.getNotification(oData.ErrorCode));
|
|
}
|
|
}
|
|
|
|
this.reloadMessageList(0 === MessageStore.messageList().length);
|
|
this.quotaDebounce();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {string} sFromFolderFullNameRaw
|
|
* @param {Array} aUidForRemove
|
|
*/
|
|
deleteMessagesFromFolderWithoutCheck(sFromFolderFullNameRaw, aUidForRemove) {
|
|
this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
|
|
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
|
|
}
|
|
|
|
/**
|
|
* @param {number} iDeleteType
|
|
* @param {string} sFromFolderFullNameRaw
|
|
* @param {Array} aUidForRemove
|
|
* @param {boolean=} bUseFolder = true
|
|
*/
|
|
deleteMessagesFromFolder(iDeleteType, sFromFolderFullNameRaw, aUidForRemove, bUseFolder) {
|
|
|
|
let
|
|
oMoveFolder = null,
|
|
nSetSystemFoldersNotification = null
|
|
;
|
|
|
|
switch (iDeleteType)
|
|
{
|
|
case FolderType.Spam:
|
|
oMoveFolder = Cache.getFolderFromCacheList(FolderStore.spamFolder());
|
|
nSetSystemFoldersNotification = SetSystemFoldersNotification.Spam;
|
|
break;
|
|
case FolderType.NotSpam:
|
|
oMoveFolder = Cache.getFolderFromCacheList(Cache.getFolderInboxName());
|
|
break;
|
|
case FolderType.Trash:
|
|
oMoveFolder = Cache.getFolderFromCacheList(FolderStore.trashFolder());
|
|
nSetSystemFoldersNotification = SetSystemFoldersNotification.Trash;
|
|
break;
|
|
case FolderType.Archive:
|
|
oMoveFolder = Cache.getFolderFromCacheList(FolderStore.archiveFolder());
|
|
nSetSystemFoldersNotification = SetSystemFoldersNotification.Archive;
|
|
break;
|
|
}
|
|
|
|
bUseFolder = isUnd(bUseFolder) ? true : !!bUseFolder;
|
|
if (bUseFolder)
|
|
{
|
|
if ((FolderType.Spam === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.spamFolder()) ||
|
|
(FolderType.Trash === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.trashFolder()) ||
|
|
(FolderType.Archive === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.archiveFolder()))
|
|
{
|
|
bUseFolder = false;
|
|
}
|
|
}
|
|
|
|
if (!oMoveFolder && bUseFolder)
|
|
{
|
|
kn.showScreenPopup(require('View/Popup/FolderSystem'), [nSetSystemFoldersNotification]);
|
|
}
|
|
else if (!bUseFolder || (FolderType.Trash === iDeleteType &&
|
|
(sFromFolderFullNameRaw === FolderStore.spamFolder() || sFromFolderFullNameRaw === FolderStore.trashFolder())))
|
|
{
|
|
kn.showScreenPopup(require('View/Popup/Ask'), [Translator.i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), () => {
|
|
this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
|
|
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
|
|
}]);
|
|
}
|
|
else if (oMoveFolder)
|
|
{
|
|
this.messagesMoveHelper(sFromFolderFullNameRaw, oMoveFolder.fullNameRaw, aUidForRemove);
|
|
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oMoveFolder.fullNameRaw);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {string} sFromFolderFullNameRaw
|
|
* @param {Array} aUidForMove
|
|
* @param {string} sToFolderFullNameRaw
|
|
* @param {boolean=} bCopy = false
|
|
*/
|
|
moveMessagesToFolder(sFromFolderFullNameRaw, aUidForMove, sToFolderFullNameRaw, bCopy) {
|
|
|
|
if (sFromFolderFullNameRaw !== sToFolderFullNameRaw && isArray(aUidForMove) && 0 < aUidForMove.length)
|
|
{
|
|
const
|
|
oFromFolder = Cache.getFolderFromCacheList(sFromFolderFullNameRaw),
|
|
oToFolder = Cache.getFolderFromCacheList(sToFolderFullNameRaw)
|
|
;
|
|
|
|
if (oFromFolder && oToFolder)
|
|
{
|
|
if (isUnd(bCopy) ? false : !!bCopy)
|
|
{
|
|
this.messagesCopyHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove);
|
|
}
|
|
else
|
|
{
|
|
this.messagesMoveHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove);
|
|
}
|
|
|
|
MessageStore.removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy);
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* @param {Function=} callback = null
|
|
*/
|
|
foldersReload(callback = null) {
|
|
|
|
Promises.foldersReload(FolderStore.foldersLoading).then((value) => {
|
|
if (callback)
|
|
{
|
|
callback(!!value);
|
|
}
|
|
}).catch(() => {
|
|
if (callback)
|
|
{
|
|
_.delay(() => callback(false), 1);
|
|
}
|
|
});
|
|
}
|
|
|
|
foldersPromisesActionHelper(promise, errorDefCode) {
|
|
|
|
Promises
|
|
.abort('Folders')
|
|
.fastResolve(true)
|
|
.then(() => promise)
|
|
.catch((errorCode) => {
|
|
FolderStore.folderList.error(Translator.getNotification(errorCode, '', errorDefCode));
|
|
}).fin(() => {
|
|
Promises.foldersReloadWithTimeout(FolderStore.foldersLoading);
|
|
}).done()
|
|
;
|
|
}
|
|
|
|
reloadOpenPgpKeys() {
|
|
|
|
if (PgpStore.capaOpenPGP())
|
|
{
|
|
var
|
|
aKeys = [],
|
|
oEmail = new EmailModel(),
|
|
oOpenpgpKeyring = PgpStore.openpgpKeyring,
|
|
oOpenpgpKeys = oOpenpgpKeyring ? oOpenpgpKeyring.getAllKeys() : []
|
|
;
|
|
|
|
_.each(oOpenpgpKeys, (oItem, iIndex) => {
|
|
if (oItem && oItem.primaryKey)
|
|
{
|
|
var
|
|
aEmails = [],
|
|
aUsers = [],
|
|
oPrimaryUser = oItem.getPrimaryUser(),
|
|
sUser = (oPrimaryUser && oPrimaryUser.user) ? oPrimaryUser.user.userId.userid
|
|
: (oItem.users && oItem.users[0] ? oItem.users[0].userId.userid : '')
|
|
;
|
|
|
|
if (oItem.users)
|
|
{
|
|
_.each(oItem.users, (item) => {
|
|
if (item.userId)
|
|
{
|
|
oEmail.clear();
|
|
oEmail.mailsoParse(item.userId.userid);
|
|
if (oEmail.validate())
|
|
{
|
|
aEmails.push(oEmail.email);
|
|
aUsers.push(item.userId.userid);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
if (aEmails.length)
|
|
{
|
|
aKeys.push(new OpenPgpKeyModel(
|
|
iIndex,
|
|
oItem.primaryKey.getFingerprint(),
|
|
oItem.primaryKey.getKeyId().toHex().toLowerCase(),
|
|
_.uniq(_.compact(_.map(oItem.getKeyIds(), (item) => item && item.toHex ? item.toHex() : null))),
|
|
aUsers,
|
|
aEmails,
|
|
oItem.isPrivate(),
|
|
oItem.armor(),
|
|
sUser)
|
|
);
|
|
}
|
|
}
|
|
});
|
|
|
|
delegateRunOnDestroy(PgpStore.openpgpkeys());
|
|
PgpStore.openpgpkeys(aKeys);
|
|
}
|
|
}
|
|
|
|
accountsCounts() {
|
|
return false;
|
|
// AccountStore.accounts.loading(true);
|
|
//
|
|
// Remote.accountsCounts((sResult, oData) => {
|
|
//
|
|
// AccountStore.accounts.loading(false);
|
|
//
|
|
// if (StorageResultType.Success === sResult && oData.Result && oData.Result['Counts'])
|
|
// {
|
|
// var
|
|
// sEmail = AccountStore.email(),
|
|
// aAcounts = AccountStore.accounts()
|
|
// ;
|
|
//
|
|
// _.each(oData.Result['Counts'], (oItem) => {
|
|
//
|
|
// var oAccount = _.find(aAcounts, (oAccount) => {
|
|
// return oAccount && oItem[0] === oAccount.email && sEmail !== oAccount.email;
|
|
// });
|
|
//
|
|
// if (oAccount)
|
|
// {
|
|
// oAccount.count(pInt(oItem[1]));
|
|
// }
|
|
// });
|
|
// }
|
|
// });
|
|
}
|
|
|
|
accountsAndIdentities(bBoot) {
|
|
|
|
AccountStore.accounts.loading(true);
|
|
IdentityStore.identities.loading(true);
|
|
|
|
Remote.accountsAndIdentities((sResult, oData) => {
|
|
|
|
AccountStore.accounts.loading(false);
|
|
IdentityStore.identities.loading(false);
|
|
|
|
if (StorageResultType.Success === sResult && oData.Result)
|
|
{
|
|
var
|
|
aCounts = {},
|
|
sParentEmail = Settings.settingsGet('ParentEmail'),
|
|
sAccountEmail = AccountStore.email()
|
|
;
|
|
|
|
sParentEmail = '' === sParentEmail ? sAccountEmail : sParentEmail;
|
|
|
|
if (isArray(oData.Result.Accounts))
|
|
{
|
|
_.each(AccountStore.accounts(), (oAccount) => {
|
|
aCounts[oAccount.email] = oAccount.count();
|
|
});
|
|
|
|
delegateRunOnDestroy(AccountStore.accounts());
|
|
|
|
AccountStore.accounts(_.map(oData.Result.Accounts,
|
|
(sValue) => new AccountModel(sValue, sValue !== sParentEmail, aCounts[sValue] || 0)));
|
|
}
|
|
|
|
if (isUnd(bBoot) ? false : !!bBoot)
|
|
{
|
|
_.delay(() => this.accountsCounts(), 1000 * 5);
|
|
Events.sub('interval.10m-after5m', () => this.accountsCounts());
|
|
}
|
|
|
|
if (isArray(oData.Result.Identities))
|
|
{
|
|
delegateRunOnDestroy(IdentityStore.identities());
|
|
|
|
IdentityStore.identities(_.map(oData.Result.Identities, (oIdentityData) => {
|
|
|
|
const
|
|
sId = pString(oIdentityData.Id),
|
|
sEmail = pString(oIdentityData.Email),
|
|
oIdentity = new IdentityModel(sId, sEmail)
|
|
;
|
|
|
|
oIdentity.name(pString(oIdentityData.Name));
|
|
oIdentity.replyTo(pString(oIdentityData.ReplyTo));
|
|
oIdentity.bcc(pString(oIdentityData.Bcc));
|
|
oIdentity.signature(pString(oIdentityData.Signature));
|
|
oIdentity.signatureInsertBefore(!!oIdentityData.SignatureInsertBefore);
|
|
|
|
return oIdentity;
|
|
}));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
templates() {
|
|
|
|
TemplateStore.templates.loading(true);
|
|
|
|
Remote.templates((result, data) => {
|
|
|
|
TemplateStore.templates.loading(false);
|
|
|
|
if (StorageResultType.Success === result && data.Result &&
|
|
isArray(data.Result.Templates))
|
|
{
|
|
delegateRunOnDestroy(TemplateStore.templates());
|
|
|
|
TemplateStore.templates(_.compact(_.map(data.Result.Templates, (templateData) => {
|
|
const template = new TemplateModel();
|
|
return template.parse(templateData) ? template : null;
|
|
})));
|
|
}
|
|
});
|
|
}
|
|
|
|
quota() {
|
|
Remote.quota((result, data) => {
|
|
if (StorageResultType.Success === result && data && data.Result &&
|
|
isArray(data.Result) && 1 < data.Result.length &&
|
|
isPosNumeric(data.Result[0], true) && isPosNumeric(data.Result[1], true))
|
|
{
|
|
require('Stores/User/Quota').populateData(
|
|
pInt(data.Result[1]), pInt(data.Result[0]));
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* @param {string} folder
|
|
* @param {Array=} list = []
|
|
*/
|
|
folderInformation(folder, list) {
|
|
if ('' !== trim(folder))
|
|
{
|
|
Remote.folderInformation((result, data) => {
|
|
if (StorageResultType.Success === result)
|
|
{
|
|
if (data && data.Result && data.Result.Hash && data.Result.Folder)
|
|
{
|
|
let
|
|
uid = '',
|
|
check = false,
|
|
unreadCountChange = false
|
|
;
|
|
|
|
const folderFromCache = Cache.getFolderFromCacheList(data.Result.Folder);
|
|
if (folderFromCache)
|
|
{
|
|
folderFromCache.interval = Momentor.momentNowUnix();
|
|
|
|
if (data.Result.Hash)
|
|
{
|
|
Cache.setFolderHash(data.Result.Folder, data.Result.Hash);
|
|
}
|
|
|
|
if (isNormal(data.Result.MessageCount))
|
|
{
|
|
folderFromCache.messageCountAll(data.Result.MessageCount);
|
|
}
|
|
|
|
if (isNormal(data.Result.MessageUnseenCount))
|
|
{
|
|
if (pInt(folderFromCache.messageCountUnread()) !== pInt(data.Result.MessageUnseenCount))
|
|
{
|
|
unreadCountChange = true;
|
|
}
|
|
|
|
folderFromCache.messageCountUnread(data.Result.MessageUnseenCount);
|
|
}
|
|
|
|
if (unreadCountChange)
|
|
{
|
|
Cache.clearMessageFlagsFromCacheByFolder(folderFromCache.fullNameRaw);
|
|
}
|
|
|
|
if (data.Result.Flags)
|
|
{
|
|
for (uid in data.Result.Flags)
|
|
{
|
|
if (data.Result.Flags.hasOwnProperty(uid))
|
|
{
|
|
check = true;
|
|
const flags = data.Result.Flags[uid];
|
|
Cache.storeMessageFlagsToCacheByFolderAndUid(folderFromCache.fullNameRaw, uid.toString(), [
|
|
!flags.IsSeen, !!flags.IsFlagged, !!flags.IsAnswered, !!flags.IsForwarded, !!flags.IsReadReceipt
|
|
]);
|
|
}
|
|
}
|
|
|
|
if (check)
|
|
{
|
|
this.reloadFlagsCurrentMessageListAndMessageFromCache();
|
|
}
|
|
}
|
|
|
|
MessageStore.initUidNextAndNewMessages(folderFromCache.fullNameRaw, data.Result.UidNext, data.Result.NewMessages);
|
|
|
|
const hash = Cache.getFolderHash(data.Result.Folder);
|
|
if (data.Result.Hash !== hash || '' === hash || unreadCountChange)
|
|
{
|
|
if (folderFromCache.fullNameRaw === FolderStore.currentFolderFullNameRaw())
|
|
{
|
|
this.reloadMessageList();
|
|
}
|
|
else if (Cache.getFolderInboxName() === folderFromCache.fullNameRaw)
|
|
{
|
|
this.recacheInboxMessageList();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}, folder, list);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {boolean=} boot = false
|
|
*/
|
|
folderInformationMultiply(boot = false) {
|
|
|
|
const folders = FolderStore.getNextFolderNames();
|
|
if (isNonEmptyArray(folders))
|
|
{
|
|
Remote.folderInformationMultiply((sResult, oData) => {
|
|
if (StorageResultType.Success === sResult)
|
|
{
|
|
if (oData && oData.Result && oData.Result.List && isNonEmptyArray(oData.Result.List))
|
|
{
|
|
const utc = Momentor.momentNowUnix();
|
|
_.each(oData.Result.List, (oItem) => {
|
|
|
|
var
|
|
sHash = Cache.getFolderHash(oItem.Folder),
|
|
oFolder = Cache.getFolderFromCacheList(oItem.Folder),
|
|
bUnreadCountChange = false
|
|
;
|
|
|
|
if (oFolder)
|
|
{
|
|
oFolder.interval = utc;
|
|
|
|
if (oItem.Hash)
|
|
{
|
|
Cache.setFolderHash(oItem.Folder, oItem.Hash);
|
|
}
|
|
|
|
if (isNormal(oItem.MessageCount))
|
|
{
|
|
oFolder.messageCountAll(oItem.MessageCount);
|
|
}
|
|
|
|
if (isNormal(oItem.MessageUnseenCount))
|
|
{
|
|
if (pInt(oFolder.messageCountUnread()) !== pInt(oItem.MessageUnseenCount))
|
|
{
|
|
bUnreadCountChange = true;
|
|
}
|
|
|
|
oFolder.messageCountUnread(oItem.MessageUnseenCount);
|
|
}
|
|
|
|
if (bUnreadCountChange)
|
|
{
|
|
Cache.clearMessageFlagsFromCacheByFolder(oFolder.fullNameRaw);
|
|
}
|
|
|
|
if (oItem.Hash !== sHash || '' === sHash)
|
|
{
|
|
if (oFolder.fullNameRaw === FolderStore.currentFolderFullNameRaw())
|
|
{
|
|
this.reloadMessageList();
|
|
}
|
|
}
|
|
else if (bUnreadCountChange)
|
|
{
|
|
if (oFolder.fullNameRaw === FolderStore.currentFolderFullNameRaw())
|
|
{
|
|
const aList = MessageStore.messageList();
|
|
if (isNonEmptyArray(aList))
|
|
{
|
|
this.folderInformation(oFolder.fullNameRaw, aList);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
if (boot)
|
|
{
|
|
_.delay(() => this.folderInformationMultiply(true), 2000);
|
|
}
|
|
}
|
|
}
|
|
}, folders);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param {string} sFolderFullNameRaw
|
|
* @param {string|bool} mUid
|
|
* @param {number} iSetAction
|
|
* @param {Array=} aMessages = null
|
|
*/
|
|
messageListAction(sFolderFullNameRaw, mUid, iSetAction, aMessages) {
|
|
|
|
var
|
|
oFolder = null,
|
|
aRootUids = [],
|
|
iAlreadyUnread = 0
|
|
;
|
|
|
|
if (isUnd(aMessages))
|
|
{
|
|
aMessages = MessageStore.messageListChecked();
|
|
}
|
|
|
|
aRootUids = _.uniq(_.compact(_.map(aMessages, (oMessage) => (oMessage && oMessage.uid) ? oMessage.uid : null)));
|
|
|
|
if ('' !== sFolderFullNameRaw && 0 < aRootUids.length)
|
|
{
|
|
switch (iSetAction) {
|
|
case MessageSetAction.SetSeen:
|
|
|
|
_.each(aRootUids, (sSubUid) => {
|
|
iAlreadyUnread += Cache.storeMessageFlagsToCacheBySetAction(
|
|
sFolderFullNameRaw, sSubUid, iSetAction);
|
|
});
|
|
|
|
oFolder = Cache.getFolderFromCacheList(sFolderFullNameRaw);
|
|
if (oFolder)
|
|
{
|
|
oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread);
|
|
}
|
|
|
|
Remote.messageSetSeen(noop, sFolderFullNameRaw, aRootUids, true);
|
|
break;
|
|
|
|
case MessageSetAction.UnsetSeen:
|
|
|
|
_.each(aRootUids, (sSubUid) => {
|
|
iAlreadyUnread += Cache.storeMessageFlagsToCacheBySetAction(
|
|
sFolderFullNameRaw, sSubUid, iSetAction);
|
|
});
|
|
|
|
oFolder = Cache.getFolderFromCacheList(sFolderFullNameRaw);
|
|
if (oFolder)
|
|
{
|
|
oFolder.messageCountUnread(oFolder.messageCountUnread() - iAlreadyUnread + aRootUids.length);
|
|
}
|
|
|
|
Remote.messageSetSeen(noop, sFolderFullNameRaw, aRootUids, false);
|
|
break;
|
|
|
|
case MessageSetAction.SetFlag:
|
|
|
|
_.each(aRootUids, (sSubUid) => {
|
|
Cache.storeMessageFlagsToCacheBySetAction(
|
|
sFolderFullNameRaw, sSubUid, iSetAction);
|
|
});
|
|
|
|
Remote.messageSetFlagged(noop, sFolderFullNameRaw, aRootUids, true);
|
|
break;
|
|
|
|
case MessageSetAction.UnsetFlag:
|
|
|
|
_.each(aRootUids, (sSubUid) => {
|
|
Cache.storeMessageFlagsToCacheBySetAction(
|
|
sFolderFullNameRaw, sSubUid, iSetAction);
|
|
});
|
|
|
|
Remote.messageSetFlagged(noop, sFolderFullNameRaw, aRootUids, false);
|
|
break;
|
|
}
|
|
|
|
this.reloadFlagsCurrentMessageListAndMessageFromCache();
|
|
MessageStore.message.viewTrigger(!MessageStore.message.viewTrigger());
|
|
}
|
|
}
|
|
|
|
googleConnect() {
|
|
window.open(Links.socialGoogle(), 'Google', 'left=200,top=100,width=650,height=600,menubar=no,status=no,resizable=yes,scrollbars=yes');
|
|
}
|
|
|
|
twitterConnect() {
|
|
window.open(Links.socialTwitter(), 'Twitter', 'left=200,top=100,width=650,height=350,menubar=no,status=no,resizable=yes,scrollbars=yes');
|
|
}
|
|
|
|
facebookConnect() {
|
|
window.open(Links.socialFacebook(), 'Facebook', 'left=200,top=100,width=650,height=335,menubar=no,status=no,resizable=yes,scrollbars=yes');
|
|
}
|
|
|
|
/**
|
|
* @param {boolean=} fireAllActions = false
|
|
*/
|
|
socialUsers(fireAllActions = false) {
|
|
if (true === fireAllActions)
|
|
{
|
|
SocialStore.google.loading(true);
|
|
SocialStore.facebook.loading(true);
|
|
SocialStore.twitter.loading(true);
|
|
}
|
|
|
|
Remote.socialUsers((result, data) => {
|
|
|
|
if (StorageResultType.Success === result && data && data.Result)
|
|
{
|
|
SocialStore.google.userName(data.Result.Google || '');
|
|
SocialStore.facebook.userName(data.Result.Facebook || '');
|
|
SocialStore.twitter.userName(data.Result.Twitter || '');
|
|
}
|
|
else
|
|
{
|
|
SocialStore.google.userName('');
|
|
SocialStore.facebook.userName('');
|
|
SocialStore.twitter.userName('');
|
|
}
|
|
|
|
SocialStore.google.loading(false);
|
|
SocialStore.facebook.loading(false);
|
|
SocialStore.twitter.loading(false);
|
|
});
|
|
}
|
|
|
|
googleDisconnect() {
|
|
SocialStore.google.loading(true);
|
|
Remote.googleDisconnect(this.socialUsers);
|
|
}
|
|
|
|
facebookDisconnect() {
|
|
SocialStore.facebook.loading(true);
|
|
Remote.facebookDisconnect(this.socialUsers);
|
|
}
|
|
|
|
twitterDisconnect() {
|
|
SocialStore.twitter.loading(true);
|
|
Remote.twitterDisconnect(this.socialUsers);
|
|
}
|
|
|
|
/**
|
|
* @param {string} query
|
|
* @param {Function} callback
|
|
*/
|
|
getAutocomplete(query, callback) {
|
|
Remote.suggestions((result, data) => {
|
|
if (StorageResultType.Success === result && data && isArray(data.Result))
|
|
{
|
|
callback(_.compact(_.map(data.Result,
|
|
(item) => item && item[0] ? new EmailModel(item[0], item[1]) : null)));
|
|
}
|
|
else if (StorageResultType.Abort !== result)
|
|
{
|
|
callback([]);
|
|
}
|
|
}, query);
|
|
}
|
|
|
|
/**
|
|
* @param {string} sFullNameHash
|
|
* @param {boolean} bExpanded
|
|
*/
|
|
setExpandedFolder(sFullNameHash, bExpanded) {
|
|
let aExpandedList = Local.get(ClientSideKeyName.ExpandedFolders);
|
|
if (!isArray(aExpandedList))
|
|
{
|
|
aExpandedList = [];
|
|
}
|
|
|
|
if (bExpanded)
|
|
{
|
|
aExpandedList.push(sFullNameHash);
|
|
aExpandedList = _.uniq(aExpandedList);
|
|
}
|
|
else
|
|
{
|
|
aExpandedList = _.without(aExpandedList, sFullNameHash);
|
|
}
|
|
|
|
Local.set(ClientSideKeyName.ExpandedFolders, aExpandedList);
|
|
}
|
|
|
|
initHorizontalLayoutResizer(sClientSideKeyName) {
|
|
|
|
var
|
|
iMinHeight = 200,
|
|
iMaxHeight = 500,
|
|
oTop = null,
|
|
oBottom = null,
|
|
|
|
fSetHeight = (height) => {
|
|
if (height)
|
|
{
|
|
if (oTop)
|
|
{
|
|
oTop.attr('style', 'height:' + height + 'px');
|
|
}
|
|
|
|
if (oBottom)
|
|
{
|
|
oBottom.attr('style', 'top:' + (55 /* top toolbar */ + height) + 'px');
|
|
}
|
|
}
|
|
},
|
|
|
|
fResizeCreateFunction = (event) => {
|
|
if (event && event.target)
|
|
{
|
|
var oResizableHandle = $(event.target).find('.ui-resizable-handle');
|
|
|
|
oResizableHandle
|
|
.on('mousedown', () => {
|
|
$html.addClass('rl-resizer');
|
|
})
|
|
.on('mouseup', () => {
|
|
$html.removeClass('rl-resizer');
|
|
})
|
|
;
|
|
}
|
|
},
|
|
|
|
fResizeStartFunction = () => {
|
|
$html.addClass('rl-resizer');
|
|
},
|
|
|
|
fResizeResizeFunction = _.debounce(() => {
|
|
$html.addClass('rl-resizer');
|
|
}, 500, true),
|
|
|
|
fResizeStopFunction = (oEvent, oObject) => {
|
|
$html.removeClass('rl-resizer');
|
|
if (oObject && oObject.size && oObject.size.height)
|
|
{
|
|
Local.set(sClientSideKeyName, oObject.size.height);
|
|
|
|
fSetHeight(oObject.size.height);
|
|
|
|
windowResize();
|
|
}
|
|
},
|
|
|
|
oOptions = {
|
|
helper: 'ui-resizable-helper-h',
|
|
minHeight: iMinHeight,
|
|
maxHeight: iMaxHeight,
|
|
handles: 's',
|
|
create: fResizeCreateFunction,
|
|
resize: fResizeResizeFunction,
|
|
start: fResizeStartFunction,
|
|
stop: fResizeStopFunction
|
|
},
|
|
|
|
fDisable = (bDisable) => {
|
|
if (bDisable)
|
|
{
|
|
if (oTop && oTop.hasClass('ui-resizable'))
|
|
{
|
|
oTop
|
|
.resizable('destroy')
|
|
.removeAttr('style')
|
|
;
|
|
}
|
|
|
|
if (oBottom)
|
|
{
|
|
oBottom.removeAttr('style');
|
|
}
|
|
}
|
|
else if ($html.hasClass('rl-bottom-preview-pane'))
|
|
{
|
|
oTop = $('.b-message-list-wrapper');
|
|
oBottom = $('.b-message-view-wrapper');
|
|
|
|
if (!oTop.hasClass('ui-resizable'))
|
|
{
|
|
oTop.resizable(oOptions);
|
|
}
|
|
|
|
const iHeight = pInt(Local.get(sClientSideKeyName)) || 300;
|
|
fSetHeight(iHeight > iMinHeight ? iHeight : iMinHeight);
|
|
}
|
|
}
|
|
;
|
|
|
|
fDisable(false);
|
|
|
|
Events.sub('layout', (layout) => {
|
|
fDisable(Layout.BottomPreview !== layout);
|
|
});
|
|
}
|
|
|
|
initVerticalLayoutResizer(sClientSideKeyName) {
|
|
|
|
var
|
|
iDisabledWidth = 60,
|
|
iMinWidth = 155,
|
|
oLeft = $('#rl-left'),
|
|
oRight = $('#rl-right'),
|
|
|
|
mLeftWidth = Local.get(sClientSideKeyName) || null,
|
|
|
|
fSetWidth = (iWidth) => {
|
|
if (iWidth)
|
|
{
|
|
leftPanelWidth(iWidth);
|
|
|
|
$html.removeClass('rl-resizer');
|
|
|
|
oLeft.css({
|
|
width: '' + iWidth + 'px'
|
|
});
|
|
|
|
oRight.css({
|
|
left: '' + iWidth + 'px'
|
|
});
|
|
}
|
|
},
|
|
|
|
fDisable = (bDisable) => {
|
|
if (bDisable)
|
|
{
|
|
oLeft.resizable('disable');
|
|
fSetWidth(iDisabledWidth);
|
|
}
|
|
else
|
|
{
|
|
oLeft.resizable('enable');
|
|
var iWidth = pInt(Local.get(sClientSideKeyName)) || iMinWidth;
|
|
fSetWidth(iWidth > iMinWidth ? iWidth : iMinWidth);
|
|
}
|
|
},
|
|
|
|
fResizeCreateFunction = (oEvent) => {
|
|
if (oEvent && oEvent.target)
|
|
{
|
|
$(oEvent.target).find('.ui-resizable-handle')
|
|
.on('mousedown', () => {
|
|
$html.addClass('rl-resizer');
|
|
})
|
|
.on('mouseup', () => {
|
|
$html.removeClass('rl-resizer');
|
|
})
|
|
;
|
|
}
|
|
},
|
|
fResizeResizeFunction = _.debounce(() => {
|
|
$html.addClass('rl-resizer');
|
|
}, 500, true),
|
|
fResizeStartFunction = () => {
|
|
$html.addClass('rl-resizer');
|
|
},
|
|
fResizeStopFunction = (oEvent, oObject) => {
|
|
$html.removeClass('rl-resizer');
|
|
if (oObject && oObject.size && oObject.size.width)
|
|
{
|
|
Local.set(sClientSideKeyName, oObject.size.width);
|
|
|
|
leftPanelWidth(oObject.size.width);
|
|
|
|
oRight.css({
|
|
left: '' + oObject.size.width + 'px'
|
|
});
|
|
|
|
oLeft.css({
|
|
position: '',
|
|
top: '',
|
|
left: '',
|
|
height: ''
|
|
});
|
|
}
|
|
}
|
|
;
|
|
|
|
if (null !== mLeftWidth)
|
|
{
|
|
fSetWidth(mLeftWidth > iMinWidth ? mLeftWidth : iMinWidth);
|
|
}
|
|
|
|
oLeft.resizable({
|
|
helper: 'ui-resizable-helper-w',
|
|
minWidth: iMinWidth,
|
|
maxWidth: 350,
|
|
handles: 'e',
|
|
create: fResizeCreateFunction,
|
|
resize: fResizeResizeFunction,
|
|
start: fResizeStartFunction,
|
|
stop: fResizeStopFunction
|
|
});
|
|
|
|
Events.sub('left-panel.off', () => {
|
|
fDisable(true);
|
|
});
|
|
|
|
Events.sub('left-panel.on', () => {
|
|
fDisable(false);
|
|
});
|
|
}
|
|
|
|
logout() {
|
|
Remote.logout(() => {
|
|
this.loginAndLogoutReload(false, true,
|
|
Settings.settingsGet('ParentEmail') && 0 < Settings.settingsGet('ParentEmail').length);
|
|
});
|
|
}
|
|
|
|
bootstartTwoFactorScreen() {
|
|
kn.showScreenPopup(require('View/Popup/TwoFactorConfiguration'), [true]);
|
|
}
|
|
|
|
bootstartWelcomePopup(url) {
|
|
kn.showScreenPopup(require('View/Popup/WelcomePage'), [url]);
|
|
}
|
|
|
|
bootstartLoginScreen() {
|
|
|
|
$html.removeClass('rl-user-auth').addClass('rl-user-no-auth');
|
|
|
|
const customLoginLink = pString(Settings.appSettingsGet('customLoginLink'));
|
|
if (!customLoginLink)
|
|
{
|
|
kn.startScreens([
|
|
require('Screen/User/Login')
|
|
]);
|
|
|
|
Plugins.runHook('rl-start-login-screens');
|
|
Events.pub('rl.bootstart-login-screens');
|
|
}
|
|
else
|
|
{
|
|
kn.routeOff();
|
|
kn.setHash(Links.root(), true);
|
|
kn.routeOff();
|
|
|
|
_.defer(function () {
|
|
window.location.href = customLoginLink;
|
|
});
|
|
}
|
|
}
|
|
|
|
bootend() {
|
|
if (progressJs)
|
|
{
|
|
kn.hideLoading();
|
|
|
|
progressJs.set(100).end();
|
|
}
|
|
else
|
|
{
|
|
kn.hideLoading();
|
|
}
|
|
}
|
|
|
|
bootstart() {
|
|
|
|
super.bootstart();
|
|
|
|
require('Stores/User/App').populate();
|
|
require('Stores/User/Settings').populate();
|
|
require('Stores/User/Notification').populate();
|
|
require('Stores/User/Account').populate();
|
|
require('Stores/User/Contact').populate();
|
|
|
|
var
|
|
sJsHash = Settings.appSettingsGet('jsHash'),
|
|
sStartupUrl = pString(Settings.settingsGet('StartupUrl')),
|
|
iContactsSyncInterval = pInt(Settings.settingsGet('ContactsSyncInterval')),
|
|
bGoogle = Settings.settingsGet('AllowGoogleSocial'),
|
|
bFacebook = Settings.settingsGet('AllowFacebookSocial'),
|
|
bTwitter = Settings.settingsGet('AllowTwitterSocial')
|
|
;
|
|
|
|
if (progressJs)
|
|
{
|
|
progressJs.set(90);
|
|
}
|
|
|
|
leftPanelDisabled.subscribe((value) => {
|
|
Events.pub('left-panel.' + (value ? 'off' : 'on'));
|
|
});
|
|
|
|
this.setWindowTitle('');
|
|
if (Settings.settingsGet('Auth'))
|
|
{
|
|
$html.addClass('rl-user-auth');
|
|
|
|
if (Settings.capa(Capa.TwoFactor) &&
|
|
Settings.capa(Capa.TwoFactorForce) &&
|
|
Settings.settingsGet('RequireTwoFactor'))
|
|
{
|
|
this.bootend();
|
|
this.bootstartTwoFactorScreen();
|
|
}
|
|
else
|
|
{
|
|
this.setWindowTitle(Translator.i18n('TITLES/LOADING'));
|
|
|
|
// require.ensure([], function() { // require code splitting
|
|
|
|
this.foldersReload((value) => {
|
|
|
|
this.bootend();
|
|
|
|
if (value)
|
|
{
|
|
if ('' !== sStartupUrl)
|
|
{
|
|
kn.routeOff();
|
|
kn.setHash(Links.root(sStartupUrl), true);
|
|
kn.routeOn();
|
|
}
|
|
|
|
if (window.jassl && window.crypto && window.crypto.getRandomValues && Settings.capa(Capa.OpenPGP))
|
|
{
|
|
const openpgpCallback = (openpgp) => {
|
|
|
|
PgpStore.openpgp = openpgp;
|
|
|
|
if (window.Worker)
|
|
{
|
|
try
|
|
{
|
|
PgpStore.openpgp.initWorker({path: Links.openPgpWorkerJs()});
|
|
}
|
|
catch (e)
|
|
{
|
|
log(e);
|
|
}
|
|
}
|
|
|
|
PgpStore.openpgpKeyring = new openpgp.Keyring();
|
|
PgpStore.capaOpenPGP(true);
|
|
|
|
Events.pub('openpgp.init');
|
|
|
|
this.reloadOpenPgpKeys();
|
|
};
|
|
|
|
if (window.openpgp)
|
|
{
|
|
openpgpCallback(window.openpgp);
|
|
}
|
|
else
|
|
{
|
|
window.jassl(Links.openPgpJs()).then(() => {
|
|
if (window.openpgp)
|
|
{
|
|
openpgpCallback(window.openpgp);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PgpStore.capaOpenPGP(false);
|
|
}
|
|
|
|
kn.startScreens([
|
|
require('Screen/User/MailBox'),
|
|
Settings.capa(Capa.Settings) ? require('Screen/User/Settings') : null
|
|
// false ? require('Screen/User/About') : null
|
|
]);
|
|
|
|
if (bGoogle || bFacebook || bTwitter)
|
|
{
|
|
this.socialUsers(true);
|
|
}
|
|
|
|
Events.sub('interval.2m', () => this.folderInformation(Cache.getFolderInboxName()));
|
|
Events.sub('interval.3m', () => {
|
|
const sF = FolderStore.currentFolderFullNameRaw();
|
|
if (Cache.getFolderInboxName() !== sF)
|
|
{
|
|
this.folderInformation(sF);
|
|
}
|
|
});
|
|
|
|
Events.sub('interval.2m-after5m', () => this.folderInformationMultiply());
|
|
Events.sub('interval.15m', () => this.quota());
|
|
Events.sub('interval.20m', () => this.foldersReload());
|
|
|
|
iContactsSyncInterval = 5 <= iContactsSyncInterval ? iContactsSyncInterval : 20;
|
|
iContactsSyncInterval = 320 >= iContactsSyncInterval ? iContactsSyncInterval : 320;
|
|
|
|
_.delay(() => this.contactsSync(), 10000);
|
|
_.delay(() => this.folderInformationMultiply(true), 2000);
|
|
|
|
window.setInterval(() => this.contactsSync(), iContactsSyncInterval * 60000 + 5000);
|
|
|
|
this.accountsAndIdentities(true);
|
|
|
|
_.delay(() => {
|
|
const sF = FolderStore.currentFolderFullNameRaw();
|
|
if (Cache.getFolderInboxName() !== sF)
|
|
{
|
|
this.folderInformation(sF);
|
|
}
|
|
}, 1000);
|
|
|
|
_.delay(() => this.quota(), 5000);
|
|
_.delay(() => Remote.appDelayStart(noop), 35000);
|
|
|
|
Events.sub('rl.auto-logout', () => this.logout());
|
|
|
|
Plugins.runHook('rl-start-user-screens');
|
|
Events.pub('rl.bootstart-user-screens');
|
|
|
|
if (Settings.settingsGet('WelcomePageUrl'))
|
|
{
|
|
_.delay(() => this.bootstartWelcomePopup(Settings.settingsGet('WelcomePageUrl')), 1000);
|
|
}
|
|
|
|
if (!!Settings.settingsGet('AccountSignMe') &&
|
|
window.navigator.registerProtocolHandler &&
|
|
Settings.capa(Capa.Composer))
|
|
{
|
|
_.delay(() => {
|
|
try {
|
|
window.navigator.registerProtocolHandler('mailto',
|
|
window.location.protocol + '//' + window.location.host + window.location.pathname + '?mailto&to=%s',
|
|
'' + (Settings.settingsGet('Title') || 'RainLoop'));
|
|
} catch (e) {/* eslint-disable-line no-empty */}
|
|
|
|
if (Settings.settingsGet('MailToEmail'))
|
|
{
|
|
mailToHelper(Settings.settingsGet('MailToEmail'), require('View/Popup/Compose'));
|
|
}
|
|
}, 500);
|
|
}
|
|
|
|
if (!bMobileDevice)
|
|
{
|
|
_.defer(() => this.initVerticalLayoutResizer(ClientSideKeyName.FolderListSize));
|
|
|
|
if (Tinycon && Settings.appSettingsGet('faviconStatus') && !Settings.appSettingsGet('listPermanentFiltered'))
|
|
{
|
|
Tinycon.setOptions({
|
|
fallback: false
|
|
});
|
|
|
|
Events.sub('mailbox.inbox-unread-count',
|
|
(iCount) => Tinycon.setBubble(0 < iCount ? (99 < iCount ? 99 : iCount) : 0));
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.logout();
|
|
}
|
|
|
|
});
|
|
|
|
// }); // require code splitting
|
|
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.bootend();
|
|
this.bootstartLoginScreen();
|
|
}
|
|
|
|
if (bGoogle)
|
|
{
|
|
window['rl_' + sJsHash + '_google_service'] = () => {
|
|
SocialStore.google.loading(true);
|
|
this.socialUsers();
|
|
};
|
|
}
|
|
|
|
if (bFacebook)
|
|
{
|
|
window['rl_' + sJsHash + '_facebook_service'] = () => {
|
|
SocialStore.facebook.loading(true);
|
|
this.socialUsers();
|
|
};
|
|
}
|
|
|
|
if (bTwitter)
|
|
{
|
|
window['rl_' + sJsHash + '_twitter_service'] = () => {
|
|
SocialStore.twitter.loading(true);
|
|
this.socialUsers();
|
|
};
|
|
}
|
|
|
|
Events.sub('interval.1m', () => Momentor.reload());
|
|
|
|
Plugins.runHook('rl-start-screens');
|
|
Events.pub('rl.bootstart-end');
|
|
}
|
|
}
|
|
|
|
export default new AppUser();
|