mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Prevent Circular dependencies
This commit is contained in:
parent
bb4ff4fdc7
commit
c270f0ad9a
10 changed files with 99 additions and 125 deletions
|
|
@ -61,7 +61,13 @@ import { ComposePopupView } from 'View/Popup/Compose';
|
||||||
import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
|
import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
|
||||||
import { AskPopupView } from 'View/Popup/Ask';
|
import { AskPopupView } from 'View/Popup/Ask';
|
||||||
|
|
||||||
import { folderInformationMultiply, refreshFoldersInterval, messagesMoveHelper, messagesDeleteHelper } from 'Common/Folders';
|
import {
|
||||||
|
folderInformationMultiply,
|
||||||
|
refreshFoldersInterval,
|
||||||
|
messagesMoveHelper,
|
||||||
|
messagesDeleteHelper,
|
||||||
|
fetchFolderInformation
|
||||||
|
} from 'Common/Folders';
|
||||||
import { loadFolders } from 'Model/FolderCollection';
|
import { loadFolders } from 'Model/FolderCollection';
|
||||||
|
|
||||||
class AppUser extends AbstractApp {
|
class AppUser extends AbstractApp {
|
||||||
|
|
@ -207,7 +213,7 @@ class AppUser extends AbstractApp {
|
||||||
*/
|
*/
|
||||||
folderInformation(folder, list) {
|
folderInformation(folder, list) {
|
||||||
if (folder && folder.trim()) {
|
if (folder && folder.trim()) {
|
||||||
Remote.folderInformation(
|
fetchFolderInformation(
|
||||||
(iError, data) => {
|
(iError, data) => {
|
||||||
if (!iError && data.Result) {
|
if (!iError && data.Result) {
|
||||||
const result = data.Result,
|
const result = data.Result,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ import {
|
||||||
setFolderHash,
|
setFolderHash,
|
||||||
getFolderHash,
|
getFolderHash,
|
||||||
getFolderInboxName,
|
getFolderInboxName,
|
||||||
getFolderFromCacheList
|
getFolderFromCacheList,
|
||||||
|
getFolderUidNext
|
||||||
} from 'Common/Cache';
|
} from 'Common/Cache';
|
||||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||||
import { FolderUserStore } from 'Stores/User/Folder';
|
import { FolderUserStore } from 'Stores/User/Folder';
|
||||||
|
|
@ -26,6 +27,43 @@ sortFolders = folders => {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {?Function} fCallback
|
||||||
|
* @param {string} folder
|
||||||
|
* @param {Array=} list = []
|
||||||
|
*/
|
||||||
|
fetchFolderInformation = (fCallback, folder, list = []) => {
|
||||||
|
let fetch = !arrayLength(list);
|
||||||
|
const uids = [];
|
||||||
|
|
||||||
|
if (!fetch) {
|
||||||
|
list.forEach(messageListItem => {
|
||||||
|
if (!MessageFlagsCache.getFor(messageListItem.folder, messageListItem.uid)) {
|
||||||
|
uids.push(messageListItem.uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageListItem.threads.length) {
|
||||||
|
messageListItem.threads.forEach(uid => {
|
||||||
|
if (!MessageFlagsCache.getFor(messageListItem.folder, uid)) {
|
||||||
|
uids.push(uid);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fetch = uids.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fetch) {
|
||||||
|
Remote.request('FolderInformation', fCallback, {
|
||||||
|
Folder: folder,
|
||||||
|
FlagsUids: uids,
|
||||||
|
UidNext: getFolderUidNext(folder) // Used to check for new messages
|
||||||
|
});
|
||||||
|
} else if (SettingsUserStore.useThreads()) {
|
||||||
|
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Array=} aDisabled
|
* @param {Array=} aDisabled
|
||||||
* @param {Array=} aHeaderLines
|
* @param {Array=} aHeaderLines
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ const USER_VIEW_MODELS_HOOKS = [],
|
||||||
* @param {?number=} timeout
|
* @param {?number=} timeout
|
||||||
*/
|
*/
|
||||||
rl.pluginRemoteRequest = (callback, action, parameters, timeout) => {
|
rl.pluginRemoteRequest = (callback, action, parameters, timeout) => {
|
||||||
rl.app && rl.app.Remote.request('Plugin' + action, callback, parameters, timeout);
|
rl.app.Remote.request('Plugin' + action, callback, parameters, timeout);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
||||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||||
import * as Local from 'Storage/Client';
|
import * as Local from 'Storage/Client';
|
||||||
import { ThemeStore } from 'Stores/Theme';
|
import { ThemeStore } from 'Stores/Theme';
|
||||||
|
import Remote from 'Remote/User/Fetch';
|
||||||
|
|
||||||
export const
|
export const
|
||||||
|
|
||||||
|
|
@ -269,7 +270,7 @@ populateMessageBody = (oMessage, preload) => {
|
||||||
if (oMessage) {
|
if (oMessage) {
|
||||||
preload || MessageUserStore.hideMessageBodies();
|
preload || MessageUserStore.hideMessageBodies();
|
||||||
preload || MessageUserStore.loading(true);
|
preload || MessageUserStore.loading(true);
|
||||||
rl.app.Remote.message((iError, oData/*, bCached*/) => {
|
Remote.message((iError, oData/*, bCached*/) => {
|
||||||
if (iError) {
|
if (iError) {
|
||||||
if (Notification.RequestAborted !== iError && !preload) {
|
if (Notification.RequestAborted !== iError && !preload) {
|
||||||
MessageUserStore.message(null);
|
MessageUserStore.message(null);
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import { arrayLength, pString, pInt, b64EncodeJSONSafe } from 'Common/Utils';
|
import { pString, pInt, b64EncodeJSONSafe } from 'Common/Utils';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getFolderHash,
|
getFolderHash,
|
||||||
getFolderUidNext,
|
getFolderUidNext,
|
||||||
getFolderFromCacheList,
|
getFolderFromCacheList
|
||||||
MessageFlagsCache
|
|
||||||
} from 'Common/Cache';
|
} from 'Common/Cache';
|
||||||
|
|
||||||
import { SettingsGet } from 'Common/Globals';
|
import { SettingsGet } from 'Common/Globals';
|
||||||
|
|
@ -16,8 +15,6 @@ import { FolderUserStore } from 'Stores/User/Folder';
|
||||||
|
|
||||||
import { AbstractFetchRemote } from 'Remote/AbstractFetch';
|
import { AbstractFetchRemote } from 'Remote/AbstractFetch';
|
||||||
|
|
||||||
import { MessagelistUserStore } from 'Stores/User/Messagelist';
|
|
||||||
|
|
||||||
class RemoteUserFetch extends AbstractFetchRemote {
|
class RemoteUserFetch extends AbstractFetchRemote {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -97,57 +94,6 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {?Function} fCallback
|
|
||||||
* @param {string} folder
|
|
||||||
* @param {Array=} list = []
|
|
||||||
*/
|
|
||||||
folderInformation(fCallback, folder, list = []) {
|
|
||||||
let fetch = !arrayLength(list);
|
|
||||||
const uids = [];
|
|
||||||
|
|
||||||
if (!fetch) {
|
|
||||||
list.forEach(messageListItem => {
|
|
||||||
if (!MessageFlagsCache.getFor(messageListItem.folder, messageListItem.uid)) {
|
|
||||||
uids.push(messageListItem.uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messageListItem.threads.length) {
|
|
||||||
messageListItem.threads.forEach(uid => {
|
|
||||||
if (!MessageFlagsCache.getFor(messageListItem.folder, uid)) {
|
|
||||||
uids.push(uid);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
fetch = uids.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fetch) {
|
|
||||||
this.request('FolderInformation', fCallback, {
|
|
||||||
Folder: folder,
|
|
||||||
FlagsUids: uids,
|
|
||||||
UidNext: getFolderUidNext(folder) // Used to check for new messages
|
|
||||||
});
|
|
||||||
} else if (SettingsUserStore.useThreads()) {
|
|
||||||
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {?Function} fCallback
|
|
||||||
* @param {string} sFolderFullName
|
|
||||||
* @param {boolean} bSetSeen
|
|
||||||
* @param {Array} aThreadUids = null
|
|
||||||
*/
|
|
||||||
messageSetSeenToAll(sFolderFullName, bSetSeen, aThreadUids = null) {
|
|
||||||
this.request('MessageSetSeenToAll', null, {
|
|
||||||
Folder: sFolderFullName,
|
|
||||||
SetAction: bSetSeen ? 1 : 0,
|
|
||||||
ThreadUids: aThreadUids ? aThreadUids.join(',') : ''
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {?Function} fCallback
|
* @param {?Function} fCallback
|
||||||
* @param {Object} oData
|
* @param {Object} oData
|
||||||
|
|
@ -167,37 +113,6 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {?Function} fCallback
|
|
||||||
* @param {string} sFolderFullName
|
|
||||||
* @param {boolean} bSubscribe
|
|
||||||
*/
|
|
||||||
folderSetMetadata(fCallback, sFolderFullName, sKey, sValue) {
|
|
||||||
this.request('FolderSetMetadata', fCallback, {
|
|
||||||
Folder: sFolderFullName,
|
|
||||||
Key: sKey,
|
|
||||||
Value: sValue
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {?Function} fCallback
|
|
||||||
* @param {string} sQuery
|
|
||||||
* @param {number} iPage
|
|
||||||
*/
|
|
||||||
suggestions(fCallback, sQuery, iPage) {
|
|
||||||
this.request('Suggestions',
|
|
||||||
fCallback,
|
|
||||||
{
|
|
||||||
Query: sQuery,
|
|
||||||
Page: iPage
|
|
||||||
},
|
|
||||||
null,
|
|
||||||
'',
|
|
||||||
['Suggestions']
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
folderMove(sPrevFolderFullName, sNewFolderFullName, bSubscribe) {
|
folderMove(sPrevFolderFullName, sNewFolderFullName, bSubscribe) {
|
||||||
return this.post('FolderMove', FolderUserStore.foldersRenaming, {
|
return this.post('FolderMove', FolderUserStore.foldersRenaming, {
|
||||||
|
|
@ -207,12 +122,6 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
attachmentsActions(sAction, aHashes, fTrigger) {
|
|
||||||
return this.post('AttachmentsActions', fTrigger, {
|
|
||||||
Do: sAction,
|
|
||||||
Hashes: aHashes
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default new RemoteUserFetch();
|
export default new RemoteUserFetch();
|
||||||
|
|
|
||||||
|
|
@ -163,7 +163,11 @@ export class FoldersUserSettings /*extends AbstractViewSettings*/ {
|
||||||
toggleFolderKolabType(folder, event) {
|
toggleFolderKolabType(folder, event) {
|
||||||
let type = event.target.value;
|
let type = event.target.value;
|
||||||
// TODO: append '.default' ?
|
// TODO: append '.default' ?
|
||||||
Remote.folderSetMetadata(null, folder.fullName, FolderMetadataKeys.KolabFolderType, type);
|
Remote.request('FolderSetMetadata', null, {
|
||||||
|
Folder: folder.fullName,
|
||||||
|
Key: FolderMetadataKeys.KolabFolderType,
|
||||||
|
Value: type
|
||||||
|
});
|
||||||
folder.kolabType(type);
|
folder.kolabType(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ import { MessageUserStore } from 'Stores/User/Message';
|
||||||
import { NotificationUserStore } from 'Stores/User/Notification';
|
import { NotificationUserStore } from 'Stores/User/Notification';
|
||||||
import { SettingsUserStore } from 'Stores/User/Settings';
|
import { SettingsUserStore } from 'Stores/User/Settings';
|
||||||
|
|
||||||
//import Remote from 'Remote/User/Fetch'; // Circular dependency
|
import Remote from 'Remote/User/Fetch';
|
||||||
|
|
||||||
const
|
const
|
||||||
isChecked = item => item.checked();
|
isChecked = item => item.checked();
|
||||||
|
|
@ -169,7 +169,7 @@ MessagelistUserStore.reload = (bDropPagePosition = false, bDropCurrenFolderCache
|
||||||
|
|
||||||
MessagelistUserStore.loading(true);
|
MessagelistUserStore.loading(true);
|
||||||
MessagelistUserStore.error('');
|
MessagelistUserStore.error('');
|
||||||
rl.app.Remote.messageList(
|
Remote.messageList(
|
||||||
(iError, oData, bCached) => {
|
(iError, oData, bCached) => {
|
||||||
if (iError) {
|
if (iError) {
|
||||||
if (Notification.RequestAborted !== iError) {
|
if (Notification.RequestAborted !== iError) {
|
||||||
|
|
@ -279,7 +279,7 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => {
|
||||||
folder.messageCountUnread(folder.messageCountUnread() - alreadyUnread + length);
|
folder.messageCountUnread(folder.messageCountUnread() - alreadyUnread + length);
|
||||||
}
|
}
|
||||||
|
|
||||||
rl.app.Remote.request('MessageSetSeen', null, {
|
Remote.request('MessageSetSeen', null, {
|
||||||
Folder: sFolderFullName,
|
Folder: sFolderFullName,
|
||||||
Uids: rootUids.join(','),
|
Uids: rootUids.join(','),
|
||||||
SetAction: iSetAction == MessageSetAction.SetSeen ? 1 : 0
|
SetAction: iSetAction == MessageSetAction.SetSeen ? 1 : 0
|
||||||
|
|
@ -291,7 +291,7 @@ MessagelistUserStore.setAction = (sFolderFullName, iSetAction, messages) => {
|
||||||
rootUids.forEach(sSubUid =>
|
rootUids.forEach(sSubUid =>
|
||||||
MessageFlagsCache.storeBySetAction(sFolderFullName, sSubUid, iSetAction)
|
MessageFlagsCache.storeBySetAction(sFolderFullName, sSubUid, iSetAction)
|
||||||
);
|
);
|
||||||
rl.app.Remote.request('MessageSetFlagged', null, {
|
Remote.request('MessageSetFlagged', null, {
|
||||||
Folder: sFolderFullName,
|
Folder: sFolderFullName,
|
||||||
Uids: rootUids.join(','),
|
Uids: rootUids.join(','),
|
||||||
SetAction: iSetAction == MessageSetAction.SetFlag ? 1 : 0
|
SetAction: iSetAction == MessageSetAction.SetFlag ? 1 : 0
|
||||||
|
|
|
||||||
|
|
@ -687,7 +687,8 @@ class ComposePopupView extends AbstractViewPopup {
|
||||||
|
|
||||||
// getAutocomplete
|
// getAutocomplete
|
||||||
emailsSource(oData, fResponse) {
|
emailsSource(oData, fResponse) {
|
||||||
Remote.suggestions((iError, data) => {
|
Remote.request('Suggestions',
|
||||||
|
(iError, data) => {
|
||||||
if (!iError && isArray(data.Result)) {
|
if (!iError && isArray(data.Result)) {
|
||||||
fResponse(
|
fResponse(
|
||||||
data.Result.map(item => (item && item[0] ? (new EmailModel(item[0], item[1])).toLine(false) : null))
|
data.Result.map(item => (item && item[0] ? (new EmailModel(item[0], item[1])).toLine(false) : null))
|
||||||
|
|
@ -696,7 +697,15 @@ class ComposePopupView extends AbstractViewPopup {
|
||||||
} else if (Notification.RequestAborted !== iError) {
|
} else if (Notification.RequestAborted !== iError) {
|
||||||
fResponse([]);
|
fResponse([]);
|
||||||
}
|
}
|
||||||
}, oData.term);
|
},
|
||||||
|
{
|
||||||
|
Query: oData.term
|
||||||
|
// ,Page: 1
|
||||||
|
},
|
||||||
|
null,
|
||||||
|
'',
|
||||||
|
['Suggestions']
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadDraftFolder() {
|
reloadDraftFolder() {
|
||||||
|
|
|
||||||
|
|
@ -490,7 +490,7 @@ export class MailMessageList extends AbstractViewRight {
|
||||||
|
|
||||||
message.flags.push('\\seen');
|
message.flags.push('\\seen');
|
||||||
// message.flags.valueHasMutated();
|
// message.flags.valueHasMutated();
|
||||||
uids.push(message.uid);
|
iThreadUid && uids.push(message.uid);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (iThreadUid) {
|
if (iThreadUid) {
|
||||||
|
|
@ -501,7 +501,11 @@ export class MailMessageList extends AbstractViewRight {
|
||||||
|
|
||||||
MessageFlagsCache.clearFolder(sFolderFullName);
|
MessageFlagsCache.clearFolder(sFolderFullName);
|
||||||
|
|
||||||
Remote.messageSetSeenToAll(sFolderFullName, true, iThreadUid ? uids : null);
|
Remote.request('MessageSetSeenToAll', null, {
|
||||||
|
Folder: sFolderFullName,
|
||||||
|
SetAction: 1,
|
||||||
|
ThreadUids: uids.join(',')
|
||||||
|
});
|
||||||
|
|
||||||
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
MessagelistUserStore.reloadFlagsAndCachedMessage();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -522,7 +522,10 @@ export class MailMessageView extends AbstractViewRight {
|
||||||
.map(item => (item && !item.isLinked() && item.checked() ? item.download : ''))
|
.map(item => (item && !item.isLinked() && item.checked() ? item.download : ''))
|
||||||
.filter(v => v);
|
.filter(v => v);
|
||||||
if (hashes.length) {
|
if (hashes.length) {
|
||||||
Remote.attachmentsActions('Zip', hashes, this.downloadAsZipLoading)
|
Remote.post('AttachmentsActions', this.downloadAsZipLoading, {
|
||||||
|
Do: 'Zip',
|
||||||
|
Hashes: hashes
|
||||||
|
})
|
||||||
.then(result => {
|
.then(result => {
|
||||||
let hash = result && result.Result && result.Result.FileHash;
|
let hash = result && result.Result && result.Result.FileHash;
|
||||||
if (hash) {
|
if (hash) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue