Skip to content

Commit 8255759

Browse files
committed
Rework conversationStore to trigger UNREAD_COUNT_UPDATED
Signed-off-by: Markus Stoll <[email protected]>
1 parent d55574c commit 8255759

File tree

3 files changed

+118
-1
lines changed

3 files changed

+118
-1
lines changed

src/App.vue

+56-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
<script>
2222
import debounce from 'debounce'
2323
import { provide } from 'vue'
24+
import { mapGetters } from 'vuex'
2425

2526
import { getCurrentUser } from '@nextcloud/auth'
2627
import { emit, subscribe, unsubscribe } from '@nextcloud/event-bus'
@@ -44,7 +45,7 @@ import { useDocumentTitle } from './composables/useDocumentTitle.ts'
4445
import { useHashCheck } from './composables/useHashCheck.js'
4546
import { useIsInCall } from './composables/useIsInCall.js'
4647
import { useSessionIssueHandler } from './composables/useSessionIssueHandler.js'
47-
import { CONVERSATION, PARTICIPANT } from './constants.ts'
48+
import { CONVERSATION, EVENTS, PARTICIPANT } from './constants.ts'
4849
import Router from './router/router.ts'
4950
import BrowserStorage from './services/BrowserStorage.js'
5051
import { EventBus } from './services/EventBus.ts'
@@ -95,6 +96,30 @@ export default {
9596
},
9697

9798
computed: {
99+
// Computed properties for unread counts
100+
getTotalUnreadMessages() {
101+
if (!this.$store.state.conversationsStore?.conversations) {
102+
return 0;
103+
}
104+
return Object.values(this.$store.state.conversationsStore.conversations).reduce((total, conv) => {
105+
return total + (conv.unreadMessages || 0);
106+
}, 0);
107+
},
108+
109+
getTotalUnreadMentions() {
110+
if (!this.$store.state.conversationsStore?.conversations) {
111+
return 0;
112+
}
113+
return Object.values(this.$store.state.conversationsStore.conversations).filter(conv => conv.unreadMention).length;
114+
},
115+
116+
getTotalUnreadMentionsDirect() {
117+
if (!this.$store.state.conversationsStore?.conversations) {
118+
return 0;
119+
}
120+
return Object.values(this.$store.state.conversationsStore.conversations).filter(conv => conv.unreadMentionDirect).length;
121+
},
122+
98123
getUserId() {
99124
return this.$store.getters.getUserId()
100125
},
@@ -163,6 +188,17 @@ export default {
163188
}
164189
}
165190
},
191+
192+
// Watch for changes in unread counters and emit events
193+
getTotalUnreadMessages() {
194+
this.emitUnreadCountUpdated()
195+
},
196+
getTotalUnreadMentions() {
197+
this.emitUnreadCountUpdated()
198+
},
199+
getTotalUnreadMentionsDirect() {
200+
this.emitUnreadCountUpdated()
201+
},
166202
},
167203

168204
beforeCreate() {
@@ -314,6 +350,9 @@ export default {
314350
this.$store.dispatch('updateToken', '')
315351
}
316352
}
353+
354+
// Update unread counts after receiving conversations
355+
this.emitUnreadCountUpdated()
317356
})
318357

319358
EventBus.on('forbidden-route', (params) => {
@@ -409,6 +448,9 @@ export default {
409448
})
410449
}
411450

451+
// Initialize unread counts emission
452+
this.emitUnreadCountUpdated()
453+
412454
subscribe('notifications:action:execute', this.interceptNotificationActions)
413455
subscribe('notifications:notification:received', this.interceptNotificationReceived)
414456
},
@@ -619,6 +661,19 @@ export default {
619661
this.$router.push({ name: 'root' })
620662
}
621663
},
664+
665+
/**
666+
* Emits the UNREAD_COUNT_UPDATED event with the current counter values
667+
*/
668+
emitUnreadCountUpdated() {
669+
const eventData = {
670+
totalUnreadMessages: this.getTotalUnreadMessages,
671+
totalUnreadMentions: this.getTotalUnreadMentions,
672+
totalUnreadMentionsDirect: this.getTotalUnreadMentionsDirect
673+
}
674+
675+
emit(EVENTS.UNREAD_COUNT_UPDATED, eventData)
676+
},
622677
},
623678
}
624679
</script>

src/constants.ts

+4
Original file line numberDiff line numberDiff line change
@@ -358,3 +358,7 @@ export const TASK_PROCESSING = {
358358
UNKNOWN: 'STATUS_UNKNOWN',
359359
},
360360
}
361+
362+
export const EVENTS = {
363+
UNREAD_COUNT_UPDATED: 'talk:unread:updated',
364+
} as const

src/store/conversationsStore.js

+58
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,64 @@ const getters = {
177177
return (userId) => getters.conversationsList
178178
.find((conversation) => conversation.type === CONVERSATION.TYPE.ONE_TO_ONE && conversation.name === userId)
179179
},
180+
/**
181+
* Gibt eine Map aller ungelesenen Nachrichten pro Konversation zurück
182+
* @param {object} state Der aktuelle Store-State
183+
* @return {object} Map mit Token als Schlüssel und Unread-Informationen als Werte
184+
*/
185+
getUnreadMessagesMap: (state) => {
186+
const unreadMap = {}
187+
188+
// Nur nicht-archivierte Konversationen berücksichtigen
189+
Object.keys(state.conversations).forEach(token => {
190+
const conversation = state.conversations[token]
191+
if (conversation.status !== CONVERSATION.STATUS.ARCHIVED) {
192+
unreadMap[token] = {
193+
unreadMessages: conversation.unreadMessages || 0,
194+
unreadMention: conversation.unreadMention || false,
195+
unreadMentionDirect: conversation.unreadMentionDirect || false
196+
}
197+
}
198+
})
199+
200+
return unreadMap
201+
},
202+
203+
/**
204+
* Berechnet die Gesamtzahl ungelesener Nachrichten
205+
* @param {object} state Der aktuelle Store-State
206+
* @param {object} getters Die Store-Getter
207+
* @return {number} Gesamtzahl ungelesener Nachrichten
208+
*/
209+
getTotalUnreadMessages: (state, getters) => {
210+
const unreadMap = getters.getUnreadMessagesMap
211+
212+
return Object.values(unreadMap).reduce((total, entry) => {
213+
return total + entry.unreadMessages
214+
}, 0)
215+
},
216+
217+
/**
218+
* Berechnet die Gesamtzahl ungelesener Erwähnungen
219+
* @param {object} state Der aktuelle Store-State
220+
* @param {object} getters Die Store-Getter
221+
* @return {number} Gesamtzahl ungelesener Erwähnungen
222+
*/
223+
getTotalUnreadMentions: (state, getters) => {
224+
const unreadMap = getters.getUnreadMessagesMap
225+
return Object.values(unreadMap).filter(entry => entry.unreadMention).length
226+
},
227+
228+
/**
229+
* Berechnet die Gesamtzahl ungelesener direkter Erwähnungen
230+
* @param {object} state Der aktuelle Store-State
231+
* @param {object} getters Die Store-Getter
232+
* @return {number} Gesamtzahl ungelesener direkter Erwähnungen
233+
*/
234+
getTotalUnreadMentionsDirect: (state, getters) => {
235+
const unreadMap = getters.getUnreadMessagesMap
236+
return Object.values(unreadMap).filter(entry => entry.unreadMentionDirect).length
237+
}
180238
}
181239

182240
const mutations = {

0 commit comments

Comments
 (0)