mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-30 20:49:20 +03:00
Revamp mailbox management so that reloading of the whole folder tree is not needed
This commit is contained in:
parent
5fdc38a40d
commit
2719f08e26
8 changed files with 67 additions and 60 deletions
|
|
@ -346,26 +346,6 @@ class AppUser extends AbstractApp {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Function=} callback = null
|
||||
*/
|
||||
foldersReload(callback = null) {
|
||||
Remote.foldersReload(callback);
|
||||
}
|
||||
|
||||
foldersPromisesActionHelper(promise, errorDefCode) {
|
||||
Remote.abort('Folders')
|
||||
.fastResolve(true)
|
||||
.then(() => promise)
|
||||
.then(
|
||||
() => Remote.foldersReloadWithTimeout(),
|
||||
error => {
|
||||
FolderUserStore.folderListError(getNotification(error.code, '', errorDefCode) + '.\n' + error.message);
|
||||
Remote.foldersReloadWithTimeout();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
reloadOpenPgpKeys() {
|
||||
if (PgpUserStore.capaOpenPGP()) {
|
||||
const keys = [],
|
||||
|
|
@ -720,7 +700,7 @@ class AppUser extends AbstractApp {
|
|||
SettingsUserStore.init();
|
||||
ContactUserStore.init();
|
||||
|
||||
this.foldersReload(value => {
|
||||
Remote.foldersReload(value => {
|
||||
try {
|
||||
if (value) {
|
||||
startScreens([
|
||||
|
|
@ -738,9 +718,6 @@ class AppUser extends AbstractApp {
|
|||
this.folderInformationMultiply();
|
||||
}, refreshFolders);
|
||||
|
||||
// Every 15 minutes
|
||||
setInterval(()=>this.foldersReload(), 900000);
|
||||
|
||||
ContactUserStore.init();
|
||||
|
||||
this.accountsAndIdentities();
|
||||
|
|
|
|||
|
|
@ -20,6 +20,8 @@ import { i18n, trigger as translatorTrigger } from 'Common/Translator';
|
|||
|
||||
import { AbstractModel } from 'Knoin/AbstractModel';
|
||||
|
||||
//import { mailBox } from 'Common/Links';
|
||||
|
||||
const
|
||||
normalizeFolder = sFolderFullName => ('' === sFolderFullName
|
||||
|| UNUSED_OPTION_VALUE === sFolderFullName
|
||||
|
|
@ -236,7 +238,10 @@ export class FolderModel extends AbstractModel {
|
|||
static reviveFromJson(json) {
|
||||
const folder = super.reviveFromJson(json);
|
||||
if (folder) {
|
||||
folder.deep = json.FullName.split(folder.delimiter).length - 1;
|
||||
const path = folder.fullName.split(folder.delimiter);
|
||||
folder.deep = path.length - 1;
|
||||
path.pop();
|
||||
folder.parentName = path.join(folder.delimiter);
|
||||
|
||||
let type = (folder.metadata[FolderMetadataKeys.KolabFolderType]
|
||||
|| folder.metadata[FolderMetadataKeys.KolabFolderTypeShared]
|
||||
|
|
@ -360,6 +365,8 @@ export class FolderModel extends AbstractModel {
|
|||
!!folder.subFolders().find(
|
||||
folder => folder.hasUnreadMessages() | folder.hasSubscribedUnreadMessagesSubfolders()
|
||||
)
|
||||
|
||||
// ,href: () => folder.canBeSelected() && mailBox(folder.fullNameHash)
|
||||
});
|
||||
|
||||
folder.addSubscribables({
|
||||
|
|
|
|||
|
|
@ -194,10 +194,6 @@ export class AbstractFetchRemote
|
|||
this.request('GetPublicKey', fCallback);
|
||||
}
|
||||
|
||||
fastResolve(mData) {
|
||||
return Promise.resolve(mData);
|
||||
}
|
||||
|
||||
setTrigger(trigger, value) {
|
||||
if (trigger) {
|
||||
value = !!value;
|
||||
|
|
|
|||
|
|
@ -207,21 +207,17 @@ class RemoteUserFetch extends AbstractFetchRemote {
|
|||
* @param {?Function} fCallback
|
||||
*/
|
||||
foldersReload(fCallback) {
|
||||
clearTimeout(this.foldersTimeout);
|
||||
this.abort('Folders')
|
||||
.post('Folders', FolderUserStore.foldersLoading)
|
||||
.then(data => {
|
||||
data = FolderCollectionModel.reviveFromJson(data.Result);
|
||||
data && data.storeIt();
|
||||
fCallback && fCallback(true);
|
||||
// Repeat every 15 minutes
|
||||
this.foldersTimeout = setTimeout(() => this.foldersReload(), 900000);
|
||||
})
|
||||
.catch(() => fCallback && setTimeout(() => fCallback(false), 1));
|
||||
}
|
||||
|
||||
foldersReloadWithTimeout() {
|
||||
this.setTrigger(FolderUserStore.foldersLoading, true);
|
||||
|
||||
clearTimeout(this.foldersTimeout);
|
||||
this.foldersTimeout = setTimeout(() => this.foldersReload(), 500);
|
||||
.catch(() => fCallback && setTimeout(fCallback, 1, false));
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import { ClientSideKeyName, FolderMetadataKeys } from 'Common/EnumsUser';
|
|||
import { Settings } from 'Common/Globals';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
|
||||
import { setFolder, removeFolderFromCacheList } from 'Common/Cache';
|
||||
import { setFolder, getFolderFromCacheList, removeFolderFromCacheList } from 'Common/Cache';
|
||||
import { Capa } from 'Common/Enums';
|
||||
import { defaultOptionsAfterRender } from 'Common/Utils';
|
||||
import { initOnStartOrLangChange, i18n } from 'Common/Translator';
|
||||
|
|
@ -71,21 +71,27 @@ export class FoldersUserSettings /*extends AbstractViewSettings*/ {
|
|||
|
||||
if (nameToEdit && folder.name() !== nameToEdit) {
|
||||
Local.set(ClientSideKeyName.FoldersLashHash, '');
|
||||
Remote
|
||||
.post('FolderRename', FolderUserStore.foldersRenaming, {
|
||||
Remote.abort('Folders').post('FolderRename', FolderUserStore.foldersRenaming, {
|
||||
Folder: folder.fullName,
|
||||
NewFolderName: nameToEdit
|
||||
})
|
||||
.then(data => {
|
||||
folder.name(nameToEdit/*data.Name*/);
|
||||
if (folder.subFolders.length) {
|
||||
Remote.foldersReloadWithTimeout();
|
||||
// rename all subfolders folder.delimiter
|
||||
Remote.setTrigger(FolderUserStore.foldersLoading, true);
|
||||
clearTimeout(Remote.foldersTimeout);
|
||||
Remote.foldersTimeout = setTimeout(() => Remote.foldersReload(), 500);
|
||||
// TODO: rename all subfolders with folder.delimiter to prevent reload?
|
||||
} else {
|
||||
removeFolderFromCacheList(folder.fullName);
|
||||
data = data.Result;
|
||||
folder.fullName = data.FullName;
|
||||
setFolder(folder);
|
||||
/*
|
||||
const folder = getFolderFromCacheList(folder.parentName);
|
||||
var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
|
||||
console.log((folder ? folder.subFolders : FolderUserStore.folderList).sort(collator.compare));
|
||||
*/
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
|
|
@ -131,14 +137,19 @@ export class FoldersUserSettings /*extends AbstractViewSettings*/ {
|
|||
if (folderToRemove) {
|
||||
Local.set(ClientSideKeyName.FoldersLashHash, '');
|
||||
|
||||
// rl.app.foldersPromisesActionHelper
|
||||
Remote.abort('Folders').post('FolderDelete', FolderUserStore.foldersDeleting, {
|
||||
Folder: folderToRemove.fullName
|
||||
}).then(
|
||||
() => {
|
||||
folderToRemove.selectable(false)
|
||||
removeFolderFromCacheList(folderToRemove.fullName);
|
||||
FolderUserStore.folderList(FolderUserStore.folderList.filter(folder => folder !== folderToRemove));
|
||||
// folderToRemove.flags.push('\\nonexistent');
|
||||
folderToRemove.selectable(false);
|
||||
// folderToRemove.subscribed(false);
|
||||
// folderToRemove.checkable(false);
|
||||
if (!folderToRemove.subFolders.length) {
|
||||
removeFolderFromCacheList(folderToRemove.fullName);
|
||||
const folder = getFolderFromCacheList(folderToRemove.parentName);
|
||||
(folder ? folder.subFolders : FolderUserStore.folderList).remove(folderToRemove);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
FolderUserStore.folderListError(
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import { Notification } from 'Common/Enums';
|
|||
import { UNUSED_OPTION_VALUE } from 'Common/Consts';
|
||||
import { defaultOptionsAfterRender } from 'Common/Utils';
|
||||
import { folderListOptionsBuilder } from 'Common/UtilsUser';
|
||||
import { getNotification } from 'Common/Translator';
|
||||
|
||||
import { FolderUserStore } from 'Stores/User/Folder';
|
||||
|
||||
|
|
@ -12,6 +13,9 @@ import Remote from 'Remote/User/Fetch';
|
|||
import { decorateKoCommands } from 'Knoin/Knoin';
|
||||
import { AbstractViewPopup } from 'Knoin/AbstractViews';
|
||||
|
||||
import { setFolder, getFolderFromCacheList } from 'Common/Cache';
|
||||
import { FolderModel } from 'Model/FolderCollection';
|
||||
|
||||
class FolderCreatePopupView extends AbstractViewPopup {
|
||||
constructor() {
|
||||
super('FolderCreate');
|
||||
|
|
@ -49,13 +53,27 @@ class FolderCreatePopupView extends AbstractViewPopup {
|
|||
parentFolderName = FolderUserStore.namespace.substr(0, FolderUserStore.namespace.length - 1);
|
||||
}
|
||||
|
||||
rl.app.foldersPromisesActionHelper(
|
||||
Remote.post('FolderCreate', FolderUserStore.foldersCreating, {
|
||||
Remote.abort('Folders').post('FolderCreate', FolderUserStore.foldersCreating, {
|
||||
Folder: this.folderName(),
|
||||
Parent: parentFolderName
|
||||
}),
|
||||
Notification.CantCreateFolder
|
||||
);
|
||||
})
|
||||
.then(
|
||||
data => {
|
||||
const folder = getFolderFromCacheList(parentFolderName),
|
||||
subFolder = FolderModel.reviveFromJson(data.Result);
|
||||
setFolder(subFolder);
|
||||
(folder ? folder.subFolders : FolderUserStore.folderList).push(subFolder);
|
||||
/*
|
||||
var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'});
|
||||
console.log((folder ? folder.subFolders : FolderUserStore.folderList).sort(collator.compare));
|
||||
*/
|
||||
},
|
||||
error => {
|
||||
FolderUserStore.folderListError(
|
||||
getNotification(error.code, '', Notification.CantCreateFolder)
|
||||
+ '.\n' + error.message);
|
||||
}
|
||||
);
|
||||
|
||||
this.cancelCommand();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue