Revamp mailbox management so that reloading of the whole folder tree is not needed

This commit is contained in:
djmaze 2021-12-08 11:06:42 +01:00
parent 5fdc38a40d
commit 2719f08e26
8 changed files with 67 additions and 60 deletions

View file

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

View file

@ -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({

View file

@ -194,10 +194,6 @@ export class AbstractFetchRemote
this.request('GetPublicKey', fCallback);
}
fastResolve(mData) {
return Promise.resolve(mData);
}
setTrigger(trigger, value) {
if (trigger) {
value = !!value;

View file

@ -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));
}
/*

View file

@ -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(

View file

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