Skip to content

Commit 4f52cf7

Browse files
committed
Refactor stack implementation
1 parent ff6bff2 commit 4f52cf7

1 file changed

Lines changed: 46 additions & 58 deletions

File tree

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

Lines changed: 46 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,80 +1108,68 @@ 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)
11391124
}
1140-
left = right + 1
1141-
right = left + 1
1142-
} else if messages[left].userId != messages[right].userId {
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+
}
1133+
}
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
1170-
}
1171-
}
1172-
if left == messages.count - 1 {
1173-
result.append(messages[left])
1174-
}
1175-
if !messagesToStack.isEmpty {
1176-
if unableToStack {
1177-
result.append(contentsOf: messagesToStack)
1178-
} else {
1179-
result.append(createStackedPhotoMessage(messagesToStack))
11801168
}
1181-
messagesToStack.removeAll()
11821169
}
11831170
return result
11841171
}
1172+
11851173
}
11861174

11871175
// MARK: - Embedded class

0 commit comments

Comments
 (0)