diff --git a/src/components/Message.vue b/src/components/Message.vue
index 0c34639e83..fde417a159 100644
--- a/src/components/Message.vue
+++ b/src/components/Message.vue
@@ -73,6 +73,16 @@
+
+
+ {{ threadMessage.from[0].label }}
+
+
+ {{ threadMessage.subject }}
+
+
+
+ {{ threadMessage.from[0].label }}
+
+
+ {{ threadMessage.subject }}
+
@@ -104,7 +124,10 @@ import Modal from '@nextcloud/vue/dist/Components/Modal'
import { generateUrl } from '@nextcloud/router'
import AddressList from './AddressList'
-import { buildRecipients as buildReplyRecipients, buildReplySubject } from '../ReplyBuilder'
+import {
+ buildRecipients as buildReplyRecipients,
+ buildReplySubject,
+} from '../ReplyBuilder'
import Error from './Error'
import { getRandomMessageErrorMessage } from '../util/ErrorMessageFactory'
import { html, plain } from '../util/text'
@@ -150,7 +173,7 @@ export default {
},
computed: {
from() {
- return this.message.from[0]?.email
+ return this.message.from.length === 0 ? '?' : this.message.from[0].label || this.message.from[0].email
},
isEncrypted() {
return isPgpgMessage(this.message.hasHtmlBody ? html(this.message.body) : plain(this.message.body))
@@ -163,6 +186,16 @@ export default {
hasMultipleRecipients() {
return this.replyRecipient.to.concat(this.replyRecipient.cc).length > 1
},
+ previousThread() {
+ // Only show younger messages, not the current one
+ return this.$store.getters.getMessageThread(this.message.databaseId)
+ .filter(m => m.dateInt > this.message.dateInt)
+ },
+ successiveThread() {
+ // Only show older messages, not the current one
+ return this.$store.getters.getMessageThread(this.message.databaseId)
+ .filter(m => m.dateInt < this.message.dateInt)
+ },
},
watch: {
$route(to, from) {
@@ -241,6 +274,15 @@ export default {
}
}
},
+ threadRoute(threadMessage) {
+ return {
+ name: 'message',
+ params: {
+ mailboxId: threadMessage.mailboxId,
+ threadId: threadMessage.databaseId,
+ },
+ }
+ },
replyMessage() {
this.$router.push({
name: 'message',
@@ -321,7 +363,7 @@ export default {
}
-
diff --git a/src/service/MessageService.js b/src/service/MessageService.js
index d9ee16bac0..ac9b5f403c 100644
--- a/src/service/MessageService.js
+++ b/src/service/MessageService.js
@@ -52,6 +52,13 @@ export function fetchEnvelopes(mailboxId, query, cursor, limit) {
throw convertAxiosError(error)
})
}
+export const fetchThread = async(id) => {
+ const url = generateUrl('apps/mail/api/messages/{id}/thread', {
+ id,
+ })
+ const resp = await axios.get(url)
+ return resp.data
+}
export async function syncEnvelopes(accountId, id, ids, query, init = false) {
const url = generateUrl('/apps/mail/api/mailboxes/{id}/sync', {
diff --git a/src/store/actions.js b/src/store/actions.js
index 69a021f672..629cbca83a 100644
--- a/src/store/actions.js
+++ b/src/store/actions.js
@@ -64,6 +64,7 @@ import {
fetchMessage,
setEnvelopeFlag,
syncEnvelopes,
+ fetchThread,
} from '../service/MessageService'
import { createAlias, deleteAlias } from '../service/AliasService'
import logger from '../logger'
@@ -645,8 +646,13 @@ export default {
commit('addMessage', {
message,
})
- }
+ const thread = await fetchThread(message.databaseId)
+ commit('addMessageThread', {
+ message,
+ thread,
+ })
+ }
return message
},
async deleteMessage({ getters, commit }, { id }) {
diff --git a/src/store/getters.js b/src/store/getters.js
index 6addbff150..fe74c7f34a 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -61,4 +61,7 @@ export const getters = {
getMessage: (state) => (id) => {
return state.messages[id]
},
+ getMessageThread: (state) => (id) => {
+ return state.messages[id]?.thread ?? []
+ },
}
diff --git a/src/store/mutations.js b/src/store/mutations.js
index 3294cde990..abfa075cad 100644
--- a/src/store/mutations.js
+++ b/src/store/mutations.js
@@ -213,6 +213,9 @@ export default {
addMessage(state, { message }) {
Vue.set(state.messages, message.databaseId, message)
},
+ addMessageThread(state, { message, thread }) {
+ Vue.set(message, 'thread', thread)
+ },
removeMessage(state, { id }) {
Vue.delete(state.messages, id)
},