Restructure JavaScript

Split list code from MessageUserStore into MessagelistUserStore
Move functions out of AppUser
This commit is contained in:
the-djmaze 2022-02-23 19:26:52 +01:00
parent 60b7f61e42
commit 661cd2aaf9
26 changed files with 1144 additions and 1186 deletions

View file

@ -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);