@@ -51,6 +51,10 @@ public struct MessageListView<Factory: ViewFactory>: View, KeyboardReadable {
5151 && channel. config. typingEventsEnabled
5252 }
5353
54+ private var lastInGroupHeaderSize : CGFloat {
55+ messageListConfig. messageDisplayOptions. lastInGroupHeaderSize
56+ }
57+
5458 private let scrollAreaId = " scrollArea "
5559
5660 public init (
@@ -112,6 +116,7 @@ public struct MessageListView<Factory: ViewFactory>: View, KeyboardReadable {
112116 ForEach ( messages, id: \. messageId) { message in
113117 var index : Int ? = messageListDateUtils. indexForMessageDate ( message: message, in: messages)
114118 let messageDate : Date ? = messageListDateUtils. showMessageDate ( for: index, in: messages)
119+ let showsLastInGroupInfo = showsLastInGroupInfo ( for: message, channel: channel)
115120 factory. makeMessageContainerView (
116121 channel: channel,
117122 message: message,
@@ -121,7 +126,7 @@ public struct MessageListView<Factory: ViewFactory>: View, KeyboardReadable {
121126 scrolledId: $scrolledId,
122127 quotedMessage: $quotedMessage,
123128 onLongPress: handleLongPress ( messageDisplayInfo: ) ,
124- isLast: message == messages. last
129+ isLast: !showsLastInGroupInfo && message == messages. last
125130 )
126131 . onAppear {
127132 if index == nil {
@@ -131,16 +136,29 @@ public struct MessageListView<Factory: ViewFactory>: View, KeyboardReadable {
131136 onMessageAppear ( index)
132137 }
133138 }
134- . overlay (
139+ . padding (
140+ . top,
135141 messageDate != nil ?
136- VStack {
137- factory. makeMessageListDateIndicator ( date: messageDate!)
138- . offset ( y: - messageListConfig. messageDisplayOptions. dateLabelSize)
142+ offsetForDateIndicator ( showsLastInGroupInfo: showsLastInGroupInfo) :
143+ additionalTopPadding ( showsLastInGroupInfo: showsLastInGroupInfo)
144+ )
145+ . overlay (
146+ ( messageDate != nil || showsLastInGroupInfo) ?
147+ VStack ( spacing: 0 ) {
148+ messageDate != nil ?
149+ factory. makeMessageListDateIndicator ( date: messageDate!)
150+ . frame ( maxHeight: messageListConfig. messageDisplayOptions. dateLabelSize)
151+ : nil
152+
153+ showsLastInGroupInfo ?
154+ factory. makeLastInGroupHeaderView ( for: message)
155+ . frame ( maxHeight: lastInGroupHeaderSize)
156+ : nil
157+
139158 Spacer ( )
140159 }
141160 : nil
142161 )
143- . padding ( . top, messageDate != nil ? messageListConfig. messageDisplayOptions. dateLabelSize : 0 )
144162 . flippedUpsideDown ( )
145163 }
146164 . id ( listId)
@@ -227,11 +245,35 @@ public struct MessageListView<Factory: ViewFactory>: View, KeyboardReadable {
227245 }
228246 }
229247
248+ private func additionalTopPadding( showsLastInGroupInfo: Bool ) -> CGFloat {
249+ showsLastInGroupInfo ? lastInGroupHeaderSize : 0
250+ }
251+
252+ private func offsetForDateIndicator( showsLastInGroupInfo: Bool ) -> CGFloat {
253+ var offset = messageListConfig. messageDisplayOptions. dateLabelSize
254+ offset += additionalTopPadding ( showsLastInGroupInfo: showsLastInGroupInfo)
255+ return offset
256+ }
257+
230258 private func showsAllData( for message: ChatMessage ) -> Bool {
231259 if !messageListConfig. groupMessages {
232260 return true
233261 }
234- return messagesGroupingInfo [ message. id] != nil
262+ let groupInfo = messagesGroupingInfo [ message. id] ?? [ ]
263+ return groupInfo. contains ( firstMessageKey) == true
264+ }
265+
266+ private func showsLastInGroupInfo(
267+ for message: ChatMessage ,
268+ channel: ChatChannel
269+ ) -> Bool {
270+ guard channel. memberCount > 2
271+ && !message. isSentByCurrentUser
272+ && ( lastInGroupHeaderSize > 0 ) else {
273+ return false
274+ }
275+ let groupInfo = messagesGroupingInfo [ message. id] ?? [ ]
276+ return groupInfo. contains ( lastMessageKey) == true
235277 }
236278
237279 private func handleLongPress( messageDisplayInfo: MessageDisplayInfo ) {
0 commit comments