diff --git a/dev/Model/AbstractCollection.js b/dev/Model/AbstractCollection.js index b68a8b481..86c804c4e 100644 --- a/dev/Model/AbstractCollection.js +++ b/dev/Model/AbstractCollection.js @@ -2,6 +2,11 @@ export class AbstractCollectionModel extends Array { constructor(props) { +/* + if (new.target === Parent) { + throw new Error("Can't instantiate abstract class!"); + } +*/ super(); props && Object.entries(props).forEach(([key, value]) => '@' !== key[0] && (this[key] = value)); // props[@Count] @@ -12,4 +17,21 @@ export class AbstractCollectionModel extends Array ? object['@Collection'] : null; } + + static reviveFromJson(object, itemCallback) { + // FolderCollectionModel => FolderCollection + // AttachmentCollectionModel => AttachmentCollection + // MessageCollectionModel => MessageCollection + const name = this.name.replace('Model', ''), + collection = this.getFromJSON(object, name); + if (collection) { + const result = new this(object); + collection.forEach(item => { + item && itemCallback && (item = itemCallback(item, result)); + item && result.push(item); + }); + return result; + } + } + } diff --git a/dev/Model/FolderCollection.js b/dev/Model/FolderCollection.js index 3f44456e8..35c8b9716 100644 --- a/dev/Model/FolderCollection.js +++ b/dev/Model/FolderCollection.js @@ -43,61 +43,45 @@ export class FolderCollectionModel extends AbstractCollectionModel * @returns {FolderCollectionModel} */ static reviveFromJson(object) { - const collection = this.getFromJSON(object, 'FolderCollection'); - if (collection) { - const result = new FolderCollectionModel(object), - expandedFolders = Local.get(ClientSideKeyName.ExpandedFolders), - bDisplaySpecSetting = FolderStore.displaySpecSetting(); + const expandedFolders = Local.get(ClientSideKeyName.ExpandedFolders), + bDisplaySpecSetting = FolderStore.displaySpecSetting(); + return super.reviveFromJson(object, (oFolder, self) => { + let oCacheFolder = Cache.getFolderFromCacheList(oFolder.FullNameRaw); + if (!oCacheFolder && (oCacheFolder = FolderModel.newInstanceFromJson(oFolder))) { + if (oFolder.FullNameRaw == self.SystemFolders[ServerFolderType.INBOX]) { + oCacheFolder.type(FolderType.Inbox); + Cache.setFolderInboxName(oFolder.FullNameRaw); + } + Cache.setFolder(oCacheFolder.fullNameHash, oFolder.FullNameRaw, oCacheFolder); + } - collection.forEach(oFolder => { - if (oFolder) { - let oCacheFolder = Cache.getFolderFromCacheList(oFolder.FullNameRaw); - if (!oCacheFolder) { - oCacheFolder = FolderModel.newInstanceFromJson(oFolder); - if (oCacheFolder) { - if (oFolder.FullNameRaw == result.SystemFolders[ServerFolderType.INBOX]) { - oCacheFolder.type(FolderType.Inbox); - Cache.setFolderInboxName(oFolder.FullNameRaw); - } - Cache.setFolder(oCacheFolder.fullNameHash, oFolder.FullNameRaw, oCacheFolder); - } + if (oCacheFolder) { + oCacheFolder.checkable(bDisplaySpecSetting ? !!oFolder.Checkable : true); + + oCacheFolder.collapsed(!expandedFolders + || !Array.isArray(expandedFolders) + || !expandedFolders.includes(oCacheFolder.fullNameHash)); + + if (oFolder.Extended) { + if (oFolder.Extended.Hash) { + Cache.setFolderHash(oCacheFolder.fullNameRaw, oFolder.Extended.Hash); } - if (oCacheFolder) { - if (bDisplaySpecSetting) { - oCacheFolder.checkable(!!oFolder.Checkable); - } else { - oCacheFolder.checkable(true); - } + if (null != oFolder.Extended.MessageCount) { + oCacheFolder.messageCountAll(oFolder.Extended.MessageCount); + } - oCacheFolder.collapsed(!expandedFolders - || !Array.isArray(expandedFolders) - || !expandedFolders.includes(oCacheFolder.fullNameHash)); - - if (oFolder.Extended) { - if (oFolder.Extended.Hash) { - Cache.setFolderHash(oCacheFolder.fullNameRaw, oFolder.Extended.Hash); - } - - if (null != oFolder.Extended.MessageCount) { - oCacheFolder.messageCountAll(oFolder.Extended.MessageCount); - } - - if (null != oFolder.Extended.MessageUnseenCount) { - oCacheFolder.messageCountUnread(oFolder.Extended.MessageUnseenCount); - } - } - - oFolder.SubFolders = FolderCollectionModel.reviveFromJson(oFolder.SubFolders); - oFolder.SubFolders && oCacheFolder.subFolders(oFolder.SubFolders); - - result.push(oCacheFolder); + if (null != oFolder.Extended.MessageUnseenCount) { + oCacheFolder.messageCountUnread(oFolder.Extended.MessageUnseenCount); } } - }); - return result; - } + oFolder.SubFolders = FolderCollectionModel.reviveFromJson(oFolder.SubFolders); + oFolder.SubFolders && oCacheFolder.subFolders(oFolder.SubFolders); + + } + return oCacheFolder; + }); } storeIt() { diff --git a/dev/Model/MessageCollection.js b/dev/Model/MessageCollection.js index caa06ffd2..bfd4cf022 100644 --- a/dev/Model/MessageCollection.js +++ b/dev/Model/MessageCollection.js @@ -34,30 +34,22 @@ export class MessageCollectionModel extends AbstractCollectionModel * @returns {MessageCollectionModel} */ static reviveFromJson(object, cached) { - const collection = this.getFromJSON(object, 'MessageCollection'); - if (collection) { - const result = new MessageCollectionModel(object); - - let newCount = 0; - collection.forEach(message => { - if (message && 'Object/Message' === message['@Object']) { - message = MessageModel.newInstanceFromJson(message); - if (message) { - if (hasNewMessageAndRemoveFromCache(message.folderFullNameRaw, message.uid) && 5 >= newCount) { - ++newCount; - message.newForAnimation(true); - } - - message.deleted(false); - - cached ? initMessageFlagsFromCache(message) : storeMessageFlagsToCache(message); - - result.push(message); + let newCount = 0; + return super.reviveFromJson(object, message => { + if (message && 'Object/Message' === message['@Object']) { + message = MessageModel.newInstanceFromJson(message); + if (message) { + if (hasNewMessageAndRemoveFromCache(message.folderFullNameRaw, message.uid) && 5 >= newCount) { + ++newCount; + message.newForAnimation(true); } - } - }); - return result; - } + message.deleted(false); + + cached ? initMessageFlagsFromCache(message) : storeMessageFlagsToCache(message); + return message; + } + } + }); } }