From 199b56d60b4aa80acedf5ab92f1b3dc75e368865 Mon Sep 17 00:00:00 2001 From: GretaD Date: Fri, 17 Jul 2020 19:06:28 +0200 Subject: [PATCH] Add threading list Signed-off-by: GretaD Signed-off-by: Christoph Wurst --- src/components/Message.vue | 67 ++++++++++++++++++++++++++++-- src/components/MessageHTMLBody.vue | 1 + src/service/MessageService.js | 7 ++++ src/store/actions.js | 8 +++- src/store/getters.js | 3 ++ src/store/mutations.js | 3 ++ 6 files changed, 85 insertions(+), 4 deletions(-) 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 }} +
@@ -90,6 +100,16 @@
+ +
+ {{ 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) },