@@ -1108,80 +1108,122 @@ extension ConversationDataSource {
11081108 stackedPhotoMessages. append ( item)
11091109 return item
11101110 }
1111+ func canStack( _ message: MessageItem ) -> Bool {
1112+ message. category. hasSuffix ( " _IMAGE " ) && message. quoteMessageId. isNilOrEmpty && message. mediaStatus == MediaStatus . DONE. rawValue
1113+ }
11111114 var result = [ MessageItem] ( )
11121115 var messagesToStack = [ MessageItem] ( )
1113- var left = 0
1114- var right = 1
1115- var unableToStack : Bool {
1116- messagesToStack. count < numberOfConsecutiveImagesToStack ||
1117- messagesToStack. contains ( where: { $0. mediaStatus != MediaStatus . DONE. rawValue } )
1118- }
1119- while right < messages. count {
1120- if !messages[ left] . category. hasSuffix ( " _IMAGE " ) {
1121- result. append ( messages [ left] )
1122- left += 1
1123- right += 1
1124- } else if !messages[ left] . quoteMessageId. isNilOrEmpty {
1125- result. append ( messages [ left] )
1126- left += 1
1127- right += 1
1128- } else if !messages[ right] . category. hasSuffix ( " _IMAGE " ) {
1129- if messagesToStack. isEmpty {
1130- result. append ( contentsOf: messages [ left... right] )
1131- } else if unableToStack {
1132- result. append ( contentsOf: messagesToStack)
1133- result. append ( messages [ right] )
1134- messagesToStack. removeAll ( )
1135- } else {
1136- result. append ( createStackedPhotoMessage ( messagesToStack) )
1137- result. append ( messages [ right] )
1138- messagesToStack. removeAll ( )
1116+ var startIndex = 0
1117+ var endIndex = 1
1118+ while endIndex < messages. count {
1119+ let startMessage = messages [ startIndex]
1120+ let endMessage = messages [ endIndex]
1121+ if canStack ( startMessage) , canStack ( endMessage) , startMessage. userId == endMessage. userId {
1122+ if startIndex == 0 , messagesToStack. isEmpty {
1123+ messagesToStack. append ( startMessage)
1124+ }
1125+ messagesToStack. append ( endMessage)
1126+ endIndex += 1
1127+ if endIndex >= messages. count {
1128+ if messagesToStack. count < numberOfConsecutiveImagesToStack {
1129+ result. append ( contentsOf: messagesToStack)
1130+ } else {
1131+ result. append ( createStackedPhotoMessage ( messagesToStack) )
1132+ }
11391133 }
1140- left = right + 1
1141- right = left + 1
1142- } else if messages [ left] . userId != messages [ right] . userId {
1134+ } else {
11431135 if messagesToStack. isEmpty {
1144- result. append ( messages [ left ] )
1145- } else if unableToStack {
1136+ result. append ( contentsOf : messages [ startIndex ..< endIndex ] )
1137+ } else if messagesToStack . count < numberOfConsecutiveImagesToStack {
11461138 result. append ( contentsOf: messagesToStack)
11471139 messagesToStack. removeAll ( )
11481140 } else {
11491141 result. append ( createStackedPhotoMessage ( messagesToStack) )
11501142 messagesToStack. removeAll ( )
11511143 }
1152- left = right
1153- right += 1
1154- } else if !messages[ right] . quoteMessageId. isNilOrEmpty {
1155- if messagesToStack. isEmpty {
1156- result. append ( messages [ left] )
1157- } else if unableToStack {
1158- result. append ( contentsOf: messagesToStack)
1159- messagesToStack. removeAll ( )
1144+ if canStack ( endMessage) {
1145+ messagesToStack. append ( endMessage)
1146+ startIndex = endIndex
1147+ endIndex += 1
1148+ if endIndex >= messages. count {
1149+ if messagesToStack. count < numberOfConsecutiveImagesToStack {
1150+ result. append ( contentsOf: messagesToStack)
1151+ } else {
1152+ result. append ( createStackedPhotoMessage ( messagesToStack) )
1153+ }
1154+ }
11601155 } else {
1161- result. append ( createStackedPhotoMessage ( messagesToStack) )
1162- messagesToStack. removeAll ( )
1156+ result. append ( endMessage)
1157+ startIndex = endIndex + 1
1158+ endIndex = startIndex + 1
1159+ if startIndex < messages. count {
1160+ let message = messages [ startIndex]
1161+ if startIndex == messages. count - 1 {
1162+ result. append ( message)
1163+ } else if canStack ( message) {
1164+ messagesToStack. append ( message)
1165+ }
1166+ }
11631167 }
1164- result. append ( messages [ right] )
1165- left = right + 1
1166- right += 1
1167- } else {
1168- messagesToStack = Array ( messages [ left... right] )
1169- right += 1
11701168 }
11711169 }
1172- if left == messages. count - 1 {
1173- result. append ( messages [ left] )
1170+ return result
1171+ }
1172+
1173+ private func stackConsecutiveImageMessagesIfneededs( _ messages: [ MessageItem ] ) -> [ MessageItem ] {
1174+ guard messages. count >= numberOfConsecutiveImagesToStack else {
1175+ return messages
1176+ }
1177+
1178+ var result = [ MessageItem] ( )
1179+ var messagesToStack = [ MessageItem] ( )
1180+
1181+ func createStackedPhotoMessage( _ messages: [ MessageItem ] ) -> MessageItem {
1182+ let message = messages [ 0 ]
1183+ let stackedMessage = MessageItem (
1184+ messageId: message. messageId,
1185+ conversationId: message. conversationId,
1186+ userId: message. userId,
1187+ category: MessageCategory . STACKED_PHOTO. rawValue,
1188+ thumbImage: message. thumbImage,
1189+ status: message. status,
1190+ createdAt: message. createdAt,
1191+ userFullName: message. userFullName,
1192+ userIdentityNumber: message. userIdentityNumber,
1193+ userAvatarUrl: message. userAvatarUrl,
1194+ messageItems: messages
1195+ )
1196+ stackedPhotoMessages. append ( stackedMessage)
1197+ return stackedMessage
11741198 }
1175- if !messagesToStack. isEmpty {
1176- if unableToStack {
1177- result. append ( contentsOf: messagesToStack)
1178- } else {
1179- result. append ( createStackedPhotoMessage ( messagesToStack) )
1199+
1200+ for (index, message) in messages. enumerated ( ) {
1201+ let isLastMessage = index == messages. count - 1
1202+ let canStack = message. category. hasSuffix ( " _IMAGE " ) &&
1203+ message. quoteMessageId. isNilOrEmpty &&
1204+ message. mediaStatus == MediaStatus . DONE. rawValue
1205+
1206+ if canStack {
1207+ messagesToStack. append ( message)
1208+ }
1209+
1210+ if messagesToStack. count == numberOfConsecutiveImagesToStack || ( !canStack && !messagesToStack. isEmpty) || isLastMessage {
1211+ if messagesToStack. count == numberOfConsecutiveImagesToStack {
1212+ result. append ( createStackedPhotoMessage ( messagesToStack) )
1213+ } else {
1214+ result. append ( contentsOf: messagesToStack)
1215+ }
1216+ messagesToStack. removeAll ( )
1217+ }
1218+
1219+ if !canStack {
1220+ result. append ( message)
11801221 }
1181- messagesToStack. removeAll ( )
11821222 }
1223+
11831224 return result
11841225 }
1226+
11851227}
11861228
11871229// MARK: - Embedded class
0 commit comments