From e592b3b40fc891c0bdc26aa22a4c31e674b58cc8 Mon Sep 17 00:00:00 2001 From: greta Date: Mon, 29 Jun 2026 15:50:35 +0200 Subject: [PATCH] feat(perf): remove window event listeners on component unmount. cache getEnvelopeTags result in computed properties. avoid unnecessary array copy in sortedEnvelops computed Signed-off-by: greta --- src/components/AppSettingsMenu.vue | 6 +++++- src/components/Envelope.vue | 14 ++++++++++---- src/components/EnvelopeList.vue | 18 +++++++----------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/components/AppSettingsMenu.vue b/src/components/AppSettingsMenu.vue index 162fb86414..0383d31802 100755 --- a/src/components/AppSettingsMenu.vue +++ b/src/components/AppSettingsMenu.vue @@ -553,13 +553,17 @@ export default { mounted() { this.sortOrder = this.mainStore.getPreference('sort-order', 'newest') - document.addEventListener.call(window, 'mailvelope', () => this.checkMailvelope()) + window.addEventListener('mailvelope', this.checkMailvelope) if (!this.mainStore.areTextBlocksFetched()) { this.mainStore.fetchMyTextBlocks() this.mainStore.fetchSharedTextBlocks() } }, + beforeUnmount() { + window.removeEventListener('mailvelope', this.checkMailvelope) + }, + updated() { this.checkMailvelope() }, diff --git a/src/components/Envelope.vue b/src/components/Envelope.vue index a61d100d6b..a0252d2e08 100644 --- a/src/components/Envelope.vue +++ b/src/components/Envelope.vue @@ -803,14 +803,16 @@ export default { || (this.data.previewText && isPgpText(this.data.previewText)) // PGP/Mailvelope }, + envelopeAllTags() { + return this.mainStore.getEnvelopeTags(this.data.databaseId) + }, + isImportant() { - return this.mainStore - .getEnvelopeTags(this.data.databaseId) - .some((tag) => tag.imapLabel === '$label1') + return this.envelopeAllTags.some((tag) => tag.imapLabel === '$label1') }, tags() { - let tags = this.mainStore.getEnvelopeTags(this.data.databaseId).filter((tag) => tag.imapLabel && tag.imapLabel !== '$label1' && !(tag.displayName.toLowerCase() in hiddenTags)) + let tags = this.envelopeAllTags.filter((tag) => tag.imapLabel && tag.imapLabel !== '$label1' && !(tag.displayName.toLowerCase() in hiddenTags)) // Don't show follow-up tag in unified mailbox as it has its own section at the top if (this.mailbox.isUnified) { @@ -993,6 +995,10 @@ export default { window.addEventListener('resize', this.onWindowResize) }, + beforeUnmount() { + window.removeEventListener('resize', this.onWindowResize) + }, + methods: { translateTagDisplayName, setSelected(value) { diff --git a/src/components/EnvelopeList.vue b/src/components/EnvelopeList.vue index 45aebf4271..674aaf9544 100644 --- a/src/components/EnvelopeList.vue +++ b/src/components/EnvelopeList.vue @@ -291,7 +291,7 @@ export default { return a.dateInt < b.dateInt ? -1 : 1 }) } - return [...this.envelopes] + return this.envelopes }, selectMode() { @@ -307,22 +307,18 @@ export default { return this.selectedEnvelopes.some((env) => env.flags.seen === false) }, + selectedEnvelopeTags() { + return this.selectedEnvelopes.map((env) => this.mainStore.getEnvelopeTags(env.databaseId)) + }, + isAtLeastOneSelectedImportant() { // returns true if at least one selected message is marked as important - return this.selectedEnvelopes.some((env) => { - return this.mainStore - .getEnvelopeTags(env.databaseId) - .some((tag) => tag.imapLabel === '$label1') - }) + return this.selectedEnvelopeTags.some((tags) => tags.some((tag) => tag.imapLabel === '$label1')) }, isAtLeastOneSelectedUnimportant() { // returns true if at least one selected message is not marked as important - return this.selectedEnvelopes.some((env) => { - return !this.mainStore - .getEnvelopeTags(env.databaseId) - .some((tag) => tag.imapLabel === '$label1') - }) + return this.selectedEnvelopeTags.some((tags) => !tags.some((tag) => tag.imapLabel === '$label1')) }, isAtLeastOneSelectedJunk() {