diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 241955ec04..f5e0e05708 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -237,6 +237,7 @@ public function index(): TemplateResponse { 'sort-favorites' => $this->preferences->getPreference($this->userId, 'sort-favorites', 'false'), 'index-context-chat' => $this->contextChatSettingsService->isIndexingEnabled($this->userId) ? 'true' : 'false', 'compact-mode' => $this->preferences->getPreference($this->userId, 'compact-mode', 'false'), + 'auto-mark-as-read' => $this->preferences->getPreference($this->userId, 'auto-mark-as-read', 'true'), ]); $this->initialStateService->provideInitialState( 'prefill_displayName', diff --git a/src/components/AppSettingsMenu.vue b/src/components/AppSettingsMenu.vue index 162fb86414..f88fdde858 100755 --- a/src/components/AppSettingsMenu.vue +++ b/src/components/AppSettingsMenu.vue @@ -113,6 +113,12 @@ :disabled="loadingPrioritySettings"> {{ prioritySettingsText }} + + + {{ t('mail', 'Automatically mark messages as read when opened') }} + @@ -372,6 +378,7 @@ export default { loadingAvatarSettings: false, prioritySettingsText: t('mail', 'Search the body of messages in priority Inbox'), loadingPrioritySettings: false, + loadingAutoMarkAsRead: false, optOutSettingsText: t('mail', 'Activate'), loadingOptOutSettings: false, @@ -451,6 +458,16 @@ export default { }, }, + autoMarkAsRead: { + get() { + return this.mainStore.getPreference('auto-mark-as-read', 'true') === 'true' + }, + + set(value) { + this.onToggleAutoMarkAsRead(value) + }, + }, + useExternalAvatars: { get() { return this.mainStore.getPreference('external-avatars', 'true') === 'true' @@ -652,6 +669,22 @@ export default { } }, + async onToggleAutoMarkAsRead(enabled) { + this.loadingAutoMarkAsRead = true + + try { + await this.mainStore.savePreference({ + key: 'auto-mark-as-read', + value: enabled ? 'true' : 'false', + }) + } catch (error) { + Logger.error('could not save preferences', { error }) + showError(t('mail', 'Could not update preference')) + } finally { + this.loadingAutoMarkAsRead = false + } + }, + async onToggleSortFavorites(enabled) { this.loadingSortFavorites = true diff --git a/src/components/ThreadEnvelope.vue b/src/components/ThreadEnvelope.vue index 4f3602823e..da928a1eb8 100644 --- a/src/components/ThreadEnvelope.vue +++ b/src/components/ThreadEnvelope.vue @@ -845,7 +845,8 @@ export default { clearTimeout(loadingTimeout) } - if (!this.envelope.flags.seen && this.hasSeenAcl) { + const autoMarkAsRead = this.mainStore.getPreference('auto-mark-as-read', 'true') === 'true' + if (autoMarkAsRead && !this.envelope.flags.seen && this.hasSeenAcl) { logger.info('Starting timer to mark message as seen/read') this.seenTimer = setTimeout(() => { this.mainStore.toggleEnvelopeSeen({ envelope: this.envelope }) diff --git a/src/init.js b/src/init.js index d23a556aa5..8b11da9de1 100644 --- a/src/init.js +++ b/src/init.js @@ -98,6 +98,10 @@ export default function initAfterAppCreation() { key: 'compact-mode', value: preferences['compact-mode'], }) + mainStore.savePreferenceMutation({ + key: 'auto-mark-as-read', + value: preferences['auto-mark-as-read'], + }) mainStore.setQuickActions(loadState('mail', 'quick-actions', [])) diff --git a/tests/Unit/Controller/PageControllerTest.php b/tests/Unit/Controller/PageControllerTest.php index 9b84226810..37873b9025 100644 --- a/tests/Unit/Controller/PageControllerTest.php +++ b/tests/Unit/Controller/PageControllerTest.php @@ -180,7 +180,7 @@ public function testIndex(): void { $account1 = $this->createMock(Account::class); $account2 = $this->createMock(Account::class); $mailbox = $this->createStub(Mailbox::class); - $this->preferences->expects($this->exactly(14)) + $this->preferences->expects($this->exactly(15)) ->method('getPreference') ->willReturnMap([ [$this->userId, 'account-settings', '[]', json_encode([])], @@ -197,6 +197,7 @@ public function testIndex(): void { [$this->userId, 'smime-sign-aliases', '[]', '[]'], [$this->userId, 'sort-favorites', 'false', 'false'], [$this->userId, 'compact-mode', 'false', 'false'], + [$this->userId, 'auto-mark-as-read', 'true', 'true'], ]); $this->accountService->expects($this->once()) ->method('findByUserId')