mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
Recent actions improvements
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user