mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-29 20:19:22 +03:00
Restructure JavaScript
Split list code from MessageUserStore into MessagelistUserStore Move functions out of AppUser
This commit is contained in:
parent
60b7f61e42
commit
661cd2aaf9
26 changed files with 1144 additions and 1186 deletions
326
dev/App/User.js
326
dev/App/User.js
|
|
@ -1,17 +1,15 @@
|
|||
import 'External/User/ko';
|
||||
|
||||
import { isArray, arrayLength, pString, forEachObjectValue } from 'Common/Utils';
|
||||
import { isArray, pString } from 'Common/Utils';
|
||||
import { mailToHelper, setLayoutResizer } from 'Common/UtilsUser';
|
||||
|
||||
import {
|
||||
Notification,
|
||||
Scope
|
||||
} from 'Common/Enums';
|
||||
|
||||
import {
|
||||
FolderType,
|
||||
SetSystemFoldersNotification,
|
||||
MessageSetAction,
|
||||
ClientSideKeyName
|
||||
} from 'Common/EnumsUser';
|
||||
|
||||
|
|
@ -34,9 +32,7 @@ import {
|
|||
getFolderFromCacheList
|
||||
} from 'Common/Cache';
|
||||
|
||||
import { mailBox } from 'Common/Links';
|
||||
|
||||
import { getNotification, i18n } from 'Common/Translator';
|
||||
import { i18n, reloadTime } from 'Common/Translator';
|
||||
|
||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||
import { NotificationUserStore } from 'Stores/User/Notification';
|
||||
|
|
@ -45,12 +41,11 @@ import { ContactUserStore } from 'Stores/User/Contact';
|
|||
import { IdentityUserStore } from 'Stores/User/Identity';
|
||||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
import { PgpUserStore } from 'Stores/User/Pgp';
|
||||
import { MessageUserStore } from 'Stores/User/Message';
|
||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||
import { ThemeStore } from 'Stores/Theme';
|
||||
|
||||
import Remote from 'Remote/User/Fetch';
|
||||
|
||||
import { EmailModel } from 'Model/Email';
|
||||
import { AccountModel } from 'Model/Account';
|
||||
import { IdentityModel } from 'Model/Identity';
|
||||
|
||||
|
|
@ -66,24 +61,16 @@ import { ComposePopupView } from 'View/Popup/Compose';
|
|||
import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
|
||||
import { AskPopupView } from 'View/Popup/Ask';
|
||||
|
||||
import { timeToNode } from 'Common/Momentor';
|
||||
|
||||
// Every 5 minutes
|
||||
const refreshFolders = 300000;
|
||||
|
||||
let moveCache = {};
|
||||
import { folderInformationMultiply, refreshFoldersInterval, messagesMoveHelper, messagesDeleteHelper } from 'Common/Folders';
|
||||
import { loadFolders } from 'Model/FolderCollection';
|
||||
|
||||
class AppUser extends AbstractApp {
|
||||
constructor() {
|
||||
super(Remote);
|
||||
|
||||
this.moveOrDeleteResponseHelper = this.moveOrDeleteResponseHelper.bind(this);
|
||||
|
||||
this.messagesMoveTrigger = this.messagesMoveTrigger.debounce(500);
|
||||
|
||||
// wakeUp
|
||||
const interval = 3600000; // 60m
|
||||
var lastTime = Date.now();
|
||||
let lastTime = Date.now();
|
||||
setInterval(() => {
|
||||
const currentTime = Date.now();
|
||||
if (currentTime > (lastTime + interval + 1000)) {
|
||||
|
|
@ -105,126 +92,6 @@ class AppUser extends AbstractApp {
|
|||
(Settings.app('inIframe') ? parent : window).location.reload();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {boolean=} bDropPagePosition = false
|
||||
* @param {boolean=} bDropCurrenFolderCache = false
|
||||
*/
|
||||
reloadMessageList(bDropPagePosition = false, bDropCurrenFolderCache = false) {
|
||||
let iOffset = (MessageUserStore.listPage() - 1) * SettingsUserStore.messagesPerPage();
|
||||
|
||||
if (bDropCurrenFolderCache) {
|
||||
setFolderHash(FolderUserStore.currentFolderFullName(), '');
|
||||
}
|
||||
|
||||
if (bDropPagePosition) {
|
||||
MessageUserStore.listPage(1);
|
||||
MessageUserStore.listPageBeforeThread(1);
|
||||
iOffset = 0;
|
||||
|
||||
rl.route.setHash(
|
||||
mailBox(
|
||||
FolderUserStore.currentFolderFullNameHash(),
|
||||
MessageUserStore.listPage(),
|
||||
MessageUserStore.listSearch(),
|
||||
MessageUserStore.listThreadUid()
|
||||
),
|
||||
true,
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
MessageUserStore.listLoading(true);
|
||||
MessageUserStore.listError('');
|
||||
Remote.messageList(
|
||||
(iError, oData, bCached) => {
|
||||
if (iError) {
|
||||
if (Notification.RequestAborted !== iError) {
|
||||
MessageUserStore.list([]);
|
||||
MessageUserStore.listError(getNotification(iError));
|
||||
}
|
||||
} else {
|
||||
MessageUserStore.setMessageList(oData, bCached);
|
||||
}
|
||||
MessageUserStore.listLoading(false);
|
||||
},
|
||||
{
|
||||
Folder: FolderUserStore.currentFolderFullName(),
|
||||
Offset: iOffset,
|
||||
Limit: SettingsUserStore.messagesPerPage(),
|
||||
Search: MessageUserStore.listSearch(),
|
||||
ThreadUid: MessageUserStore.listThreadUid()
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
messagesMoveTrigger() {
|
||||
const sTrashFolder = FolderUserStore.trashFolder(),
|
||||
sSpamFolder = FolderUserStore.spamFolder();
|
||||
|
||||
forEachObjectValue(moveCache, item => {
|
||||
const isSpam = sSpamFolder === item.To,
|
||||
isTrash = sTrashFolder === item.To,
|
||||
isHam = !isSpam && sSpamFolder === item.From && getFolderInboxName() === item.To;
|
||||
|
||||
Remote.request('MessageMove',
|
||||
this.moveOrDeleteResponseHelper,
|
||||
{
|
||||
FromFolder: item.From,
|
||||
ToFolder: item.To,
|
||||
Uids: item.Uid.join(','),
|
||||
MarkAsRead: (isSpam || isTrash) ? 1 : 0,
|
||||
Learning: isSpam ? 'SPAM' : isHam ? 'HAM' : ''
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['MessageList']
|
||||
);
|
||||
});
|
||||
|
||||
moveCache = {};
|
||||
}
|
||||
|
||||
messagesMoveHelper(fromFolderFullName, toFolderFullName, uidsForMove) {
|
||||
const hash = '$$' + fromFolderFullName + '$$' + toFolderFullName + '$$';
|
||||
if (!moveCache[hash]) {
|
||||
moveCache[hash] = {
|
||||
From: fromFolderFullName,
|
||||
To: toFolderFullName,
|
||||
Uid: []
|
||||
};
|
||||
}
|
||||
|
||||
moveCache[hash].Uid = moveCache[hash].Uid.concat(uidsForMove).unique();
|
||||
this.messagesMoveTrigger();
|
||||
}
|
||||
|
||||
messagesDeleteHelper(sFromFolderFullName, aUidForRemove) {
|
||||
Remote.request('MessageDelete',
|
||||
this.moveOrDeleteResponseHelper,
|
||||
{
|
||||
Folder: sFromFolderFullName,
|
||||
Uids: aUidForRemove.join(',')
|
||||
},
|
||||
null,
|
||||
'',
|
||||
['MessageList']
|
||||
);
|
||||
}
|
||||
|
||||
moveOrDeleteResponseHelper(iError, oData) {
|
||||
if (iError) {
|
||||
setFolderHash(FolderUserStore.currentFolderFullName(), '');
|
||||
alert(getNotification(iError));
|
||||
} else if (FolderUserStore.currentFolder()) {
|
||||
if (2 === arrayLength(oData.Result)) {
|
||||
setFolderHash(oData.Result[0], oData.Result[1]);
|
||||
} else {
|
||||
setFolderHash(FolderUserStore.currentFolderFullName(), '');
|
||||
}
|
||||
this.reloadMessageList(!MessageUserStore.list.length);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} iDeleteType
|
||||
* @param {string} sFromFolderFullName
|
||||
|
|
@ -276,46 +143,16 @@ class AppUser extends AbstractApp {
|
|||
showScreenPopup(AskPopupView, [
|
||||
i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'),
|
||||
() => {
|
||||
this.messagesDeleteHelper(sFromFolderFullName, aUidForRemove);
|
||||
MessageUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove);
|
||||
messagesDeleteHelper(sFromFolderFullName, aUidForRemove);
|
||||
MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove);
|
||||
}
|
||||
]);
|
||||
} else if (oMoveFolder) {
|
||||
this.messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, aUidForRemove);
|
||||
MessageUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove, oMoveFolder.fullName);
|
||||
messagesMoveHelper(sFromFolderFullName, oMoveFolder.fullName, aUidForRemove);
|
||||
MessagelistUserStore.removeMessagesFromList(sFromFolderFullName, aUidForRemove, oMoveFolder.fullName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} sFromFolderFullName
|
||||
* @param {Array} aUidForMove
|
||||
* @param {string} sToFolderFullName
|
||||
* @param {boolean=} bCopy = false
|
||||
*/
|
||||
moveMessagesToFolder(sFromFolderFullName, aUidForMove, sToFolderFullName, bCopy) {
|
||||
if (sFromFolderFullName !== sToFolderFullName && arrayLength(aUidForMove)) {
|
||||
const oFromFolder = getFolderFromCacheList(sFromFolderFullName),
|
||||
oToFolder = getFolderFromCacheList(sToFolderFullName);
|
||||
|
||||
if (oFromFolder && oToFolder) {
|
||||
if (undefined === bCopy ? false : !!bCopy) {
|
||||
Remote.request('MessageCopy', null, {
|
||||
FromFolder: oFromFolder.fullName,
|
||||
ToFolder: oToFolder.fullName,
|
||||
Uids: aUidForMove.join(',')
|
||||
});
|
||||
} else {
|
||||
this.messagesMoveHelper(oFromFolder.fullName, oToFolder.fullName, aUidForMove);
|
||||
}
|
||||
|
||||
MessageUserStore.removeMessagesFromList(oFromFolder.fullName, aUidForMove, oToFolder.fullName, bCopy);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
accountsAndIdentities() {
|
||||
AccountUserStore.loading(true);
|
||||
IdentityUserStore.loading(true);
|
||||
|
|
@ -396,10 +233,10 @@ class AppUser extends AbstractApp {
|
|||
MessageFlagsCache.setFor(folderFromCache.fullName, message.Uid.toString(), message.Flags)
|
||||
);
|
||||
|
||||
MessageUserStore.reloadFlagsAndCachedMessage();
|
||||
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
||||
}
|
||||
|
||||
MessageUserStore.initUidNextAndNewMessages(
|
||||
MessagelistUserStore.initUidNextAndNewMessages(
|
||||
folderFromCache.fullName,
|
||||
result.UidNext,
|
||||
result.NewMessages
|
||||
|
|
@ -407,7 +244,7 @@ class AppUser extends AbstractApp {
|
|||
|
||||
if (!hash || unreadCountChange || result.Hash !== hash) {
|
||||
if (folderFromCache.fullName === FolderUserStore.currentFolderFullName()) {
|
||||
this.reloadMessageList();
|
||||
MessagelistUserStore.reload();
|
||||
} else if (getFolderInboxName() === folderFromCache.fullName) {
|
||||
Remote.messageList(null, {Folder: getFolderInboxName()}, true);
|
||||
}
|
||||
|
|
@ -421,126 +258,6 @@ class AppUser extends AbstractApp {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {boolean=} boot = false
|
||||
*/
|
||||
folderInformationMultiply(boot = false) {
|
||||
const folders = FolderUserStore.getNextFolderNames(refreshFolders);
|
||||
if (arrayLength(folders)) {
|
||||
Remote.request('FolderInformationMultiply', (iError, oData) => {
|
||||
if (!iError && arrayLength(oData.Result)) {
|
||||
const utc = Date.now();
|
||||
oData.Result.forEach(item => {
|
||||
const hash = getFolderHash(item.Folder),
|
||||
folder = getFolderFromCacheList(item.Folder);
|
||||
|
||||
if (folder) {
|
||||
folder.expires = utc;
|
||||
|
||||
setFolderHash(item.Folder, item.Hash);
|
||||
|
||||
folder.messageCountAll(item.MessageCount);
|
||||
|
||||
let unreadCountChange = folder.messageCountUnread() !== item.MessageUnseenCount;
|
||||
|
||||
folder.messageCountUnread(item.MessageUnseenCount);
|
||||
|
||||
if (unreadCountChange) {
|
||||
MessageFlagsCache.clearFolder(folder.fullName);
|
||||
}
|
||||
|
||||
if (!hash || item.Hash !== hash) {
|
||||
if (folder.fullName === FolderUserStore.currentFolderFullName()) {
|
||||
this.reloadMessageList();
|
||||
}
|
||||
} else if (unreadCountChange
|
||||
&& folder.fullName === FolderUserStore.currentFolderFullName()
|
||||
&& MessageUserStore.list.length) {
|
||||
this.folderInformation(folder.fullName, MessageUserStore.list());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (boot) {
|
||||
setTimeout(() => this.folderInformationMultiply(true), 2000);
|
||||
}
|
||||
}
|
||||
}, {
|
||||
Folders: folders
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} sFolderFullName
|
||||
* @param {number} iSetAction
|
||||
* @param {Array=} messages = null
|
||||
*/
|
||||
messageListAction(sFolderFullName, iSetAction, messages) {
|
||||
messages = messages || MessageUserStore.listChecked();
|
||||
|
||||
let folder = null,
|
||||
alreadyUnread = 0,
|
||||
rootUids = messages.map(oMessage => oMessage && oMessage.uid ? oMessage.uid : null)
|
||||
.validUnique(),
|
||||
length = rootUids.length;
|
||||
|
||||
if (sFolderFullName && length) {
|
||||
switch (iSetAction) {
|
||||
case MessageSetAction.SetSeen:
|
||||
length = 0;
|
||||
// fallthrough is intentionally
|
||||
case MessageSetAction.UnsetSeen:
|
||||
rootUids.forEach(sSubUid =>
|
||||
alreadyUnread += MessageFlagsCache.storeBySetAction(sFolderFullName, sSubUid, iSetAction)
|
||||
);
|
||||
|
||||
folder = getFolderFromCacheList(sFolderFullName);
|
||||
if (folder) {
|
||||
folder.messageCountUnread(folder.messageCountUnread() - alreadyUnread + length);
|
||||
}
|
||||
|
||||
Remote.request('MessageSetSeen', null, {
|
||||
Folder: sFolderFullName,
|
||||
Uids: rootUids.join(','),
|
||||
SetAction: iSetAction == MessageSetAction.SetSeen ? 1 : 0
|
||||
});
|
||||
break;
|
||||
|
||||
case MessageSetAction.SetFlag:
|
||||
case MessageSetAction.UnsetFlag:
|
||||
rootUids.forEach(sSubUid =>
|
||||
MessageFlagsCache.storeBySetAction(sFolderFullName, sSubUid, iSetAction)
|
||||
);
|
||||
Remote.request('MessageSetFlagged', null, {
|
||||
Folder: sFolderFullName,
|
||||
Uids: rootUids.join(','),
|
||||
SetAction: iSetAction == MessageSetAction.SetFlag ? 1 : 0
|
||||
});
|
||||
break;
|
||||
// no default
|
||||
}
|
||||
|
||||
MessageUserStore.reloadFlagsAndCachedMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} query
|
||||
* @param {Function} autocompleteCallback
|
||||
*/
|
||||
getAutocomplete(query, autocompleteCallback) {
|
||||
Remote.suggestions((iError, data) => {
|
||||
if (!iError && isArray(data.Result)) {
|
||||
autocompleteCallback(
|
||||
data.Result.map(item => (item && item[0] ? new EmailModel(item[0], item[1]) : null)).filter(v => v)
|
||||
);
|
||||
} else if (Notification.RequestAborted !== iError) {
|
||||
autocompleteCallback([]);
|
||||
}
|
||||
}, query);
|
||||
}
|
||||
|
||||
logout() {
|
||||
Remote.request('Logout', () => rl.logoutReload());
|
||||
}
|
||||
|
|
@ -569,7 +286,7 @@ class AppUser extends AbstractApp {
|
|||
SettingsUserStore.init();
|
||||
ContactUserStore.init();
|
||||
|
||||
Remote.foldersReload(value => {
|
||||
loadFolders(value => {
|
||||
try {
|
||||
if (value) {
|
||||
startScreens([
|
||||
|
|
@ -584,8 +301,8 @@ class AppUser extends AbstractApp {
|
|||
if (iF !== cF) {
|
||||
this.folderInformation(cF);
|
||||
}
|
||||
this.folderInformationMultiply();
|
||||
}, refreshFolders);
|
||||
folderInformationMultiply();
|
||||
}, refreshFoldersInterval);
|
||||
|
||||
ContactUserStore.init();
|
||||
|
||||
|
|
@ -596,7 +313,7 @@ class AppUser extends AbstractApp {
|
|||
if (getFolderInboxName() !== cF) {
|
||||
this.folderInformation(cF);
|
||||
}
|
||||
FolderUserStore.hasCapability('LIST-STATUS') || this.folderInformationMultiply(true);
|
||||
FolderUserStore.hasCapability('LIST-STATUS') || folderInformationMultiply(true);
|
||||
}, 1000);
|
||||
|
||||
setTimeout(() => Remote.request('AppDelayStart'), 35000);
|
||||
|
|
@ -639,7 +356,7 @@ class AppUser extends AbstractApp {
|
|||
}
|
||||
}, 1);
|
||||
|
||||
setInterval(this.reloadTime(), 60000);
|
||||
setInterval(reloadTime(), 60000);
|
||||
|
||||
PgpUserStore.init();
|
||||
} else {
|
||||
|
|
@ -655,13 +372,6 @@ class AppUser extends AbstractApp {
|
|||
}
|
||||
}
|
||||
|
||||
reloadTime()
|
||||
{
|
||||
setTimeout(() =>
|
||||
doc.querySelectorAll('time').forEach(element => timeToNode(element))
|
||||
, 1)
|
||||
}
|
||||
|
||||
showMessageComposer(params = [])
|
||||
{
|
||||
showScreenPopup(ComposePopupView, params);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue