|
41 | 41 | <Message v-for="message in messagesCollapsed.messages" |
42 | 42 | :key="message.id" |
43 | 43 | :token="token" |
44 | | - is-collapsed-system-message |
| 44 | + :is-collapsed-system-message="messagesCollapsed.messages?.length > 1" |
45 | 45 | :last-collapsed-message-id="messagesCollapsed.lastId" |
46 | 46 | :next-message-id="getNextMessageId(message)" |
47 | 47 | :previous-message-id="getPrevMessageId(message)" |
@@ -119,8 +119,13 @@ export default { |
119 | 119 | immediate: true, |
120 | 120 | handler(value) { |
121 | 121 | this.messagesGroupedBySystemMessage = this.groupMessages(value) |
| 122 | + this.updateCollapsedState() |
122 | 123 | }, |
123 | 124 | }, |
| 125 | +
|
| 126 | + lastReadMessageId() { |
| 127 | + this.updateCollapsedState() |
| 128 | + }, |
124 | 129 | }, |
125 | 130 |
|
126 | 131 | methods: { |
@@ -198,41 +203,52 @@ export default { |
198 | 203 | return '' |
199 | 204 | }, |
200 | 205 |
|
| 206 | + updateCollapsedState() { |
| 207 | + for (const group of this.messagesGroupedBySystemMessage) { |
| 208 | + const isLastReadInsideGroup = this.lastReadMessageId >= group.id && this.lastReadMessageId < group.lastId |
| 209 | + if (isLastReadInsideGroup) { |
| 210 | + // If the last read message is inside the group, we should show the group expanded |
| 211 | + group.collapsed = false |
| 212 | + } else if (this.groupIsCollapsed[group.id] !== undefined) { |
| 213 | + // If the group was collapsed before, we should keep it collapsed |
| 214 | + group.collapsed = this.groupIsCollapsed[group.id] |
| 215 | + } else { |
| 216 | + // If the group is not collapsed, we should collapse it if it contains more than one message |
| 217 | + group.collapsed = group.messages.length > 1 |
| 218 | + } |
| 219 | + } |
| 220 | + }, |
| 221 | +
|
201 | 222 | groupMessages(messages) { |
202 | 223 | const groups = [] |
203 | 224 | let lastMessage = null |
204 | 225 | let forceNextGroup = false |
205 | 226 | for (const message of messages) { |
206 | 227 | const groupingType = this.messagesShouldBeGrouped(message, lastMessage) |
207 | 228 | if (!groupingType || forceNextGroup) { |
208 | | - groups.push({ id: message.id, lastId: message.id, messages: [message], type: '', collapsed: this.groupIsCollapsed[message.id] ?? true }) |
| 229 | + // Adding a new group |
| 230 | + groups.push({ id: message.id, lastId: message.id, messages: [message], type: '', collapsed: undefined }) |
209 | 231 | forceNextGroup = false |
210 | 232 | } else { |
| 233 | + // Adding a message to the existing group |
| 234 | +
|
211 | 235 | if (groupingType === 'call_reconnected') { |
212 | | - groups.push({ id: message.id, lastId: message.id, messages: [groups.at(-1).messages.pop()], type: '', collapsed: this.groupIsCollapsed[message.id] ?? true }) |
| 236 | + groups.push({ id: message.id, lastId: message.id, messages: [groups.at(-1).messages.pop()], type: '', collapsed: undefined }) |
213 | 237 | groups.at(-1).lastId = groups.at(-1).messages.at(-1).id |
214 | 238 | forceNextGroup = true |
215 | 239 | } |
216 | 240 | groups.at(-1).messages.push(message) |
217 | 241 | groups.at(-1).lastId = message.id |
218 | 242 | groups.at(-1).type = groupingType |
219 | | -
|
220 | | - // Check if last read message is hidden inside the collapsed group, and open it, if so. |
221 | | - // Otherwise, combined system message will show a marker |
222 | | - const isLastReadInsideGroup = this.lastReadMessageId >= groups.at(-1).id && this.lastReadMessageId < groups.at(-1).lastId |
223 | | - if (isLastReadInsideGroup) { |
224 | | - groups.at(-1).collapsed = false |
225 | | - } |
226 | 243 | } |
227 | 244 | lastMessage = message |
228 | 245 | } |
229 | | -
|
230 | 246 | return groups |
231 | 247 | }, |
232 | 248 |
|
233 | | - toggleCollapsed(messages) { |
234 | | - this.$set(messages, 'collapsed', !messages.collapsed) |
235 | | - this.groupIsCollapsed[messages.id] = !this.groupIsCollapsed[messages.id] |
| 249 | + toggleCollapsed(group) { |
| 250 | + this.$set(group, 'collapsed', !group.collapsed) |
| 251 | + this.groupIsCollapsed[group.id] = group.collapsed |
236 | 252 | }, |
237 | 253 |
|
238 | 254 | getNextMessageId(message) { |
|
0 commit comments