Skip to content

Commit e5afcd5

Browse files
committed
Refactor stack implementation
1 parent 4512621 commit e5afcd5

1 file changed

Lines changed: 97 additions & 55 deletions

File tree

Mixin/UserInterface/Controllers/Chat/Model/ConversationDataSource.swift

Lines changed: 97 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)