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')