Skip to content

Commit bf925f5

Browse files
Possibility to customize message grouping
1 parent f70892d commit bf925f5

File tree

2 files changed

+54
-49
lines changed

2 files changed

+54
-49
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
55

66
### ✅ Added
77
- Config to change the scrolling anchor (top/bottom) on messages
8+
- Pass extra data in attachments
9+
- Custom message grouping by overriding `groupMessages` in `ChatChannelViewModel`
10+
11+
### 🔄 Changed
12+
- `AddedAsset`'s `extraData` property is now of type `[String: RawJSON]`
813

914
# [4.25.0](https://github.com/GetStream/stream-chat-swiftui/releases/tag/4.25.0)
1015
_December 16, 2022_

Sources/StreamChatSwiftUI/ChatChannel/ChatChannelViewModel.swift

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
//
2-
// Copyright © 2022 Stream.io Inc. All rights reserved.
2+
// Copyright © 2023 Stream.io Inc. All rights reserved.
33
//
44

55
import Combine
@@ -184,6 +184,54 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource {
184184
}
185185
}
186186

187+
open func groupMessages() {
188+
var temp = [String: [String]]()
189+
for (index, message) in messages.enumerated() {
190+
let date = message.createdAt
191+
temp[message.id] = []
192+
if index == 0 {
193+
temp[message.id] = [firstMessageKey]
194+
continue
195+
} else if index == messages.count - 1 {
196+
temp[message.id] = [lastMessageKey]
197+
}
198+
199+
let previous = index - 1
200+
let previousMessage = messages[previous]
201+
let currentAuthorId = messageCachingUtils.authorId(for: message)
202+
let previousAuthorId = messageCachingUtils.authorId(for: previousMessage)
203+
204+
if currentAuthorId != previousAuthorId {
205+
temp[message.id]?.append(firstMessageKey)
206+
var prevInfo = temp[previousMessage.id] ?? []
207+
prevInfo.append(lastMessageKey)
208+
temp[previousMessage.id] = prevInfo
209+
}
210+
211+
if previousMessage.type == .error
212+
|| previousMessage.type == .ephemeral
213+
|| previousMessage.type == .system {
214+
temp[message.id] = [firstMessageKey]
215+
continue
216+
}
217+
218+
let delay = previousMessage.createdAt.timeIntervalSince(date)
219+
220+
if delay > utils.messageListConfig.maxTimeIntervalBetweenMessagesInGroup {
221+
temp[message.id]?.append(firstMessageKey)
222+
var prevInfo = temp[previousMessage.id] ?? []
223+
prevInfo.append(lastMessageKey)
224+
temp[previousMessage.id] = prevInfo
225+
}
226+
227+
if temp[message.id]?.isEmpty == true {
228+
temp[message.id] = nil
229+
}
230+
}
231+
232+
messagesGroupingInfo = temp
233+
}
234+
187235
func dataSource(
188236
channelDataSource: ChannelDataSource,
189237
didUpdateMessages messages: LazyCachedMapCollection<ChatMessage>,
@@ -369,54 +417,6 @@ open class ChatChannelViewModel: ObservableObject, MessagesDataSource {
369417
}
370418
}
371419

372-
private func groupMessages() {
373-
var temp = [String: [String]]()
374-
for (index, message) in messages.enumerated() {
375-
let date = message.createdAt
376-
temp[message.id] = []
377-
if index == 0 {
378-
temp[message.id] = [firstMessageKey]
379-
continue
380-
} else if index == messages.count - 1 {
381-
temp[message.id] = [lastMessageKey]
382-
}
383-
384-
let previous = index - 1
385-
let previousMessage = messages[previous]
386-
let currentAuthorId = messageCachingUtils.authorId(for: message)
387-
let previousAuthorId = messageCachingUtils.authorId(for: previousMessage)
388-
389-
if currentAuthorId != previousAuthorId {
390-
temp[message.id]?.append(firstMessageKey)
391-
var prevInfo = temp[previousMessage.id] ?? []
392-
prevInfo.append(lastMessageKey)
393-
temp[previousMessage.id] = prevInfo
394-
}
395-
396-
if previousMessage.type == .error
397-
|| previousMessage.type == .ephemeral
398-
|| previousMessage.type == .system {
399-
temp[message.id] = [firstMessageKey]
400-
continue
401-
}
402-
403-
let delay = previousMessage.createdAt.timeIntervalSince(date)
404-
405-
if delay > utils.messageListConfig.maxTimeIntervalBetweenMessagesInGroup {
406-
temp[message.id]?.append(firstMessageKey)
407-
var prevInfo = temp[previousMessage.id] ?? []
408-
prevInfo.append(lastMessageKey)
409-
temp[previousMessage.id] = prevInfo
410-
}
411-
412-
if temp[message.id]?.isEmpty == true {
413-
temp[message.id] = nil
414-
}
415-
}
416-
417-
messagesGroupingInfo = temp
418-
}
419-
420420
private func handleDateChange() {
421421
guard showScrollToLatestButton == true, let currentDate = currentDate else {
422422
currentDateString = nil

0 commit comments

Comments
 (0)