diff --git a/webext/background.js b/webext/background.js index 1d6152c..45157aa 100644 --- a/webext/background.js +++ b/webext/background.js @@ -55,40 +55,77 @@ SysTrayX.Messaging = { // Send preferences to app SysTrayX.Messaging.sendPreferences(); - // Set TB versionn - const version = SysTrayX.browserInfo.version.split(".")[0]; - browser.folderChange.setVersion(Number(version)); + if (SysTrayX.browserInfo.majorVersion < 91) { + // Set TB versionn + const version = SysTrayX.browserInfo.version.split(".")[0]; + browser.folderChange.setVersion(Number(version)); - // Catch the unread / new mails - browser.folderChange.onUnreadMailChange.addListener(function (unread) { - SysTrayX.Messaging.unreadCb(unread); - }); + // Catch the unread / new mails + browser.folderChange.onUnreadMailChange.addListener(function (unread) { + SysTrayX.Messaging.unreadCb(unread); + }); - browser.folderChange.onFolderChange.addListener(function ( - rootFolder, - parentFolder, - folder, - added - ) { - SysTrayX.Messaging.updateFilters(rootFolder, parentFolder, folder, added); - }); + browser.folderChange.onFolderChange.addListener(function ( + rootFolder, + parentFolder, + folder, + added + ) { + SysTrayX.Messaging.updateFilters( + rootFolder, + parentFolder, + folder, + added + ); + }); - // Set the count type in the folderChange listener - browser.folderChange.setCountType(Number(SysTrayX.Messaging.countType)); + // Set the count type in the folderChange listener + browser.folderChange.setCountType(Number(SysTrayX.Messaging.countType)); - // Set the filters in the folderChange listener - browser.folderChange.setFilters(SysTrayX.Messaging.filters); + // Set the filters in the folderChange listener + browser.folderChange.setFilters(SysTrayX.Messaging.filters); + } else { + browser.folders.onCreated.addListener( + SysTrayX.Messaging.listenerFolderCreated + ); + browser.folders.onRenamed.addListener( + SysTrayX.Messaging.listenerFolderRenamed + ); + browser.folders.onDeleted.addListener( + SysTrayX.Messaging.listenerFolderDeleted + ); + + // Test new API from TB91 + browser.folders.onFolderInfoChanged.addListener( + SysTrayX.Messaging.listenerFolderInfoChanged + ); + } // Try to catch the window state browser.windows.onFocusChanged.addListener(SysTrayX.Window.focusChanged); - - // Test new API from TB91 - browser.folders.onFolderInfoChanged.addListener( - SysTrayX.Messaging.listenerTest - ); }, - listenerTest: function (folder, folderInfo) { + listenerFolderCreated: function (createdFolder) { + console.debug("Folder created: " + JSON.stringify(createdFolder)); + + const found = isParentFilteredFolder(createdFolder); + if (found) { + addFolderToFilters(createdFolder); + } + }, + + listenerFolderRenamed: function (originalFolder, renameFolder) { + console.debug("Folder renamed from: " + JSON.stringify(originalFolder)); + console.debug("Folder renamed to: " + JSON.stringify(renameFolder)); + }, + + listenerFolderDeleted: function (deletedFolder) { + console.debug("Folder deleted: " + JSON.stringify(deletedFolder)); + + deleteFilteredFolder(deletedFolder); + }, + + listenerFolderInfoChanged: function (folder, folderInfo) { console.debug("Folder: " + JSON.stringify(folder)); console.debug("FolderInfo: " + JSON.stringify(folderInfo)); @@ -155,7 +192,11 @@ SysTrayX.Messaging = { if ("filters" in changes && changes["filters"].newValue) { SysTrayX.Messaging.filters = changes["filters"].newValue; - browser.folderChange.setFilters(SysTrayX.Messaging.filters); + if (SysTrayX.browserInfo.majorVersion < 91) { + browser.folderChange.setFilters(SysTrayX.Messaging.filters); + } else { + console.debug("StorageChanged filters not available"); + } } if ("closeType" in changes && changes["closeType"].newValue) { @@ -177,7 +218,11 @@ SysTrayX.Messaging = { if ("countType" in changes && changes["countType"].newValue) { SysTrayX.Messaging.countType = changes["countType"].newValue; - browser.folderChange.setCountType(Number(SysTrayX.Messaging.countType)); + if (SysTrayX.browserInfo.majorVersion < 91) { + browser.folderChange.setCountType(Number(SysTrayX.Messaging.countType)); + } else { + console.debug("StorageChanged counttype not available"); + } } if ("addonprefchanged" in changes && changes["addonprefchanged"].newValue) { diff --git a/webext/js/defaults.js b/webext/js/defaults.js index 7939f2d..212a4ef 100644 --- a/webext/js/defaults.js +++ b/webext/js/defaults.js @@ -460,9 +460,9 @@ async function getFilters() { console.debug("Checked filters: " + JSON.stringify(newFilters)); -// return newFilters; + // return newFilters; return filters; -} + } function onFiltersError() { return undefined; @@ -503,3 +503,79 @@ async function getCloseType() { const getCloseType = browser.storage.sync.get("closeType"); return await getCloseType.then(getCloseTypeCb, onCloseTypeError); } + +// Helper funcs for TB91 and later folder handling + +// Check if a folder is in the filter list +function isFilteredFolder(folder) { + return ( + SysTrayX.Messaging.filters.filter( + (filter) => + filter.folder.accountId === folder.accountId && + (filter.folder.path === folder.path || + filter.folder.path.toUpperCase() === folder.path) + ).length !== 0 + ); +} + +// Check if the parent folder of a folder is in the filter list +function isParentFilteredFolder(folder) { + const parentPath = folder.path.substring(0, folder.path.lastIndexOf("/")); + + return ( + SysTrayX.Messaging.filters.filter( + (filter) => + filter.folder.accountId === folder.accountId && + (filter.folder.path === parentPath || + filter.folder.path.toUpperCase() === parentPath) + ).length !== 0 + ); +} + +// Delete a folder from the filter list +function deleteFilteredFolder(deleteFolder) { + const newFilters = SysTrayX.Messaging.filters.filter( + (filter) => + !( + filter.folder.accountId === deleteFolder.accountId && + (filter.folder.path === deleteFolder.path || + filter.folder.path.toUpperCase() === deleteFolder.path) + ) + ); + + // Store the new filters + browser.storage.sync.set({ + filters: newFilters, + }); +} + +// Get the account name from an id +function getAccountName(id) { + const account = SysTrayX.Messaging.accounts.filter( + (account) => account.id === id + )[0]; + + return account.name; +} + +// Add a folder to the filter list +function addFolderToFilters(newFolder) { + const folder = { + ...newFolder, + accountName: getAccountName(newFolder.accountId), + version: SysTrayX.version, + }; + + const filter = { + unread: true, + folder: folder, + }; + + const newFilters = SysTrayX.Messaging.filters; + newFilters.push(filter); + + // Store the new filters + browser.storage.sync.set({ + filters: newFilters, + }); +}