Recent actions improvements

This commit is contained in:
Ilya Laktyushin
2024-04-23 12:01:28 +04:00
parent 076eb7be4d
commit 914dbc46f6
145 changed files with 295 additions and 215 deletions

View File

@@ -651,6 +651,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
let previousView = Atomic<[ChatRecentActionsEntry]?>(value: nil)
let previousExpandedDeletedMessages = Atomic<Set<EngineMessage.Id>>(value: Set())
let previousDeletedHeaderMessages = Atomic<Set<EngineMessage.Id>>(value: Set())
let chatThemes = self.context.engine.themes.getChatThemes(accountManager: self.context.sharedContext.accountManager)
@@ -661,7 +662,11 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
self.expandedDeletedMessagesPromise.get()
)
|> mapToQueue { [weak self] update, chatPresentationData, chatThemes, expandedDeletedMessages -> Signal<ChatRecentActionsHistoryTransition, NoError> in
let processedView = chatRecentActionsEntries(entries: update.0, presentationData: chatPresentationData, expandedDeletedMessages: expandedDeletedMessages)
var deletedHeaderMessages = previousDeletedHeaderMessages.with { $0 }
let processedView = chatRecentActionsEntries(entries: update.0, presentationData: chatPresentationData, expandedDeletedMessages: expandedDeletedMessages, currentDeletedHeaderMessages: &deletedHeaderMessages)
let _ = previousDeletedHeaderMessages.swap(deletedHeaderMessages)
let previous = previousView.swap(processedView)
let previousExpandedDeletedMessages = previousExpandedDeletedMessages.swap(expandedDeletedMessages)
@@ -670,6 +675,8 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
updateType = .generic
}
let toggledDeletedMessageIds = previousExpandedDeletedMessages.symmetricDifference(expandedDeletedMessages)
var searchResultsState: (String, [MessageIndex])?
if update.3, let query = self?.filter.query {
searchResultsState = (query, processedView.compactMap { entry in
@@ -679,7 +686,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
searchResultsState = nil
}
return .single(chatRecentActionsHistoryPreparedTransition(from: previous ?? [], to: processedView, type: updateType, canLoadEarlier: update.1, displayingResults: update.3, context: context, peer: peer, controllerInteraction: controllerInteraction, chatThemes: chatThemes, searchResultsState: searchResultsState))
return .single(chatRecentActionsHistoryPreparedTransition(from: previous ?? [], to: processedView, type: updateType, canLoadEarlier: update.1, displayingResults: update.3, context: context, peer: peer, controllerInteraction: controllerInteraction, chatThemes: chatThemes, searchResultsState: searchResultsState, toggledDeletedMessageIds: toggledDeletedMessageIds))
}
let appliedTransition = historyViewTransition |> deliverOnMainQueue |> mapToQueue { [weak self] transition -> Signal<Void, NoError> in
@@ -819,6 +826,9 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
break
}
}
if transition.synchronous {
options.insert(.InvertOffsetDirection)
}
let displayingResults = transition.displayingResults
let isEmpty = transition.isEmpty

View File

@@ -2246,7 +2246,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
private let deletedMessagesDisplayedLimit = 4
func chatRecentActionsEntries(entries: [ChannelAdminEventLogEntry], presentationData: ChatPresentationData, expandedDeletedMessages: Set<EngineMessage.Id>) -> [ChatRecentActionsEntry] {
func chatRecentActionsEntries(entries: [ChannelAdminEventLogEntry], presentationData: ChatPresentationData, expandedDeletedMessages: Set<EngineMessage.Id>, currentDeletedHeaderMessages: inout Set<EngineMessage.Id>) -> [ChatRecentActionsEntry] {
var result: [ChatRecentActionsEntry] = []
var deleteMessageEntries: [ChannelAdminEventLogEntry] = []
@@ -2264,6 +2264,7 @@ func chatRecentActionsEntries(entries: [ChannelAdminEventLogEntry], presentation
}
}
currentDeletedHeaderMessages.insert(lastMessageId)
result.append(ChatRecentActionsEntry(id: ChatRecentActionsEntryId(eventId: lastEntry.event.id, contentIndex: .header), presentationData: presentationData, entry: lastEntry, subEntries: isGroup ? deleteMessageEntries : [], isExpanded: isExpandable ? isExpanded : nil))
deleteMessageEntries = []
@@ -2272,16 +2273,23 @@ func chatRecentActionsEntries(entries: [ChannelAdminEventLogEntry], presentation
for entry in entries.reversed() {
let currentDeleteMessageEvent = deleteMessageEntries.first?.event
var skipAppending = false
if case .deleteMessage = entry.event.action {
if currentDeleteMessageEvent == nil || (currentDeleteMessageEvent!.peerId == entry.event.peerId && abs(currentDeleteMessageEvent!.date - entry.event.date) < 5) {
var skipAppendingGeneralEntry = false
if case let .deleteMessage(message) = entry.event.action {
var skipAppendingDeletionEntry = false
if currentDeleteMessageEvent == nil || (currentDeleteMessageEvent!.peerId == entry.event.peerId && abs(currentDeleteMessageEvent!.date - entry.event.date) < 5 && !currentDeletedHeaderMessages.contains(message.id)) {
} else {
if currentDeletedHeaderMessages.contains(message.id) {
deleteMessageEntries.append(entry)
skipAppendingDeletionEntry = true
}
appendCurrentDeleteEntries()
}
deleteMessageEntries.append(entry)
skipAppending = true
if !skipAppendingDeletionEntry {
deleteMessageEntries.append(entry)
}
skipAppendingGeneralEntry = true
}
if !skipAppending {
if !skipAppendingGeneralEntry {
appendCurrentDeleteEntries()
result.append(ChatRecentActionsEntry(id: ChatRecentActionsEntryId(eventId: entry.event.id, contentIndex: .content), presentationData: presentationData, entry: entry, subEntries: [], isExpanded: nil))
@@ -2305,17 +2313,18 @@ struct ChatRecentActionsHistoryTransition {
let canLoadEarlier: Bool
let displayingResults: Bool
let searchResultsState: (String, [MessageIndex])?
var synchronous: Bool
let isEmpty: Bool
}
func chatRecentActionsHistoryPreparedTransition(from fromEntries: [ChatRecentActionsEntry], to toEntries: [ChatRecentActionsEntry], type: ChannelAdminEventLogUpdateType, canLoadEarlier: Bool, displayingResults: Bool, context: AccountContext, peer: Peer, controllerInteraction: ChatControllerInteraction, chatThemes: [TelegramTheme], searchResultsState: (String, [MessageIndex])?) -> ChatRecentActionsHistoryTransition {
func chatRecentActionsHistoryPreparedTransition(from fromEntries: [ChatRecentActionsEntry], to toEntries: [ChatRecentActionsEntry], type: ChannelAdminEventLogUpdateType, canLoadEarlier: Bool, displayingResults: Bool, context: AccountContext, peer: Peer, controllerInteraction: ChatControllerInteraction, chatThemes: [TelegramTheme], searchResultsState: (String, [MessageIndex])?, toggledDeletedMessageIds: Set<EngineMessage.Id>) -> ChatRecentActionsHistoryTransition {
let (deleteIndices, indicesAndItems, updateIndices) = mergeListsStableWithUpdatesReversed(leftList: fromEntries, rightList: toEntries)
let deletions = deleteIndices.map { ListViewDeleteItem(index: $0, directionHint: nil) }
let insertions = indicesAndItems.map { ListViewInsertItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, peer: peer, controllerInteraction: controllerInteraction, chatThemes: chatThemes), directionHint: nil) }
let updates = updateIndices.map { ListViewUpdateItem(index: $0.0, previousIndex: $0.2, item: $0.1.item(context: context, peer: peer, controllerInteraction: controllerInteraction, chatThemes: chatThemes), directionHint: nil) }
return ChatRecentActionsHistoryTransition(filteredEntries: toEntries, type: type, deletions: deletions, insertions: insertions, updates: updates, canLoadEarlier: canLoadEarlier, displayingResults: displayingResults, searchResultsState: searchResultsState, isEmpty: toEntries.isEmpty)
return ChatRecentActionsHistoryTransition(filteredEntries: toEntries, type: type, deletions: deletions, insertions: insertions, updates: updates, canLoadEarlier: canLoadEarlier, displayingResults: displayingResults, searchResultsState: searchResultsState, synchronous: !toggledDeletedMessageIds.isEmpty, isEmpty: toEntries.isEmpty)
}
private extension ExportedInvitation {