mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
This commit is contained in:
@@ -46,30 +46,191 @@ public enum ChatListNodeEntryPromoInfo: Equatable {
|
||||
}
|
||||
|
||||
enum ChatListNodeEntry: Comparable, Identifiable {
|
||||
struct PeerEntryData: Equatable {
|
||||
var index: EngineChatList.Item.Index
|
||||
var presentationData: ChatListPresentationData
|
||||
var messages: [EngineMessage]
|
||||
var readState: EnginePeerReadCounters?
|
||||
var isRemovedFromTotalUnreadCount: Bool
|
||||
var draftState: ChatListItemContent.DraftState?
|
||||
var peer: EngineRenderedPeer
|
||||
var threadInfo: ChatListItemContent.ThreadInfo?
|
||||
var presence: EnginePeer.Presence?
|
||||
var hasUnseenMentions: Bool
|
||||
var hasUnseenReactions: Bool
|
||||
var editing: Bool
|
||||
var hasActiveRevealControls: Bool
|
||||
var selected: Bool
|
||||
var inputActivities: [(EnginePeer, PeerInputActivity)]?
|
||||
var promoInfo: ChatListNodeEntryPromoInfo?
|
||||
var hasFailedMessages: Bool
|
||||
var isContact: Bool
|
||||
var autoremoveTimeout: Int32?
|
||||
var forumTopicData: EngineChatList.ForumTopicData?
|
||||
var topForumTopicItems: [EngineChatList.ForumTopicData]
|
||||
var revealed: Bool
|
||||
|
||||
init(
|
||||
index: EngineChatList.Item.Index,
|
||||
presentationData: ChatListPresentationData,
|
||||
messages: [EngineMessage],
|
||||
readState: EnginePeerReadCounters?,
|
||||
isRemovedFromTotalUnreadCount: Bool,
|
||||
draftState: ChatListItemContent.DraftState?,
|
||||
peer: EngineRenderedPeer,
|
||||
threadInfo: ChatListItemContent.ThreadInfo?,
|
||||
presence: EnginePeer.Presence?,
|
||||
hasUnseenMentions: Bool,
|
||||
hasUnseenReactions: Bool,
|
||||
editing: Bool,
|
||||
hasActiveRevealControls: Bool,
|
||||
selected: Bool,
|
||||
inputActivities: [(EnginePeer, PeerInputActivity)]?,
|
||||
promoInfo: ChatListNodeEntryPromoInfo?,
|
||||
hasFailedMessages: Bool,
|
||||
isContact: Bool,
|
||||
autoremoveTimeout: Int32?,
|
||||
forumTopicData: EngineChatList.ForumTopicData?,
|
||||
topForumTopicItems: [EngineChatList.ForumTopicData],
|
||||
revealed: Bool
|
||||
) {
|
||||
self.index = index
|
||||
self.presentationData = presentationData
|
||||
self.messages = messages
|
||||
self.readState = readState
|
||||
self.isRemovedFromTotalUnreadCount = isRemovedFromTotalUnreadCount
|
||||
self.draftState = draftState
|
||||
self.peer = peer
|
||||
self.threadInfo = threadInfo
|
||||
self.presence = presence
|
||||
self.hasUnseenMentions = hasUnseenMentions
|
||||
self.hasUnseenReactions = hasUnseenReactions
|
||||
self.editing = editing
|
||||
self.hasActiveRevealControls = hasActiveRevealControls
|
||||
self.selected = selected
|
||||
self.inputActivities = inputActivities
|
||||
self.promoInfo = promoInfo
|
||||
self.hasFailedMessages = hasFailedMessages
|
||||
self.isContact = isContact
|
||||
self.autoremoveTimeout = autoremoveTimeout
|
||||
self.forumTopicData = forumTopicData
|
||||
self.topForumTopicItems = topForumTopicItems
|
||||
self.revealed = revealed
|
||||
}
|
||||
|
||||
static func ==(lhs: PeerEntryData, rhs: PeerEntryData) -> Bool {
|
||||
if lhs.index != rhs.index {
|
||||
return false
|
||||
}
|
||||
if lhs.presentationData !== rhs.presentationData {
|
||||
return false
|
||||
}
|
||||
if lhs.readState != rhs.readState {
|
||||
return false
|
||||
}
|
||||
if lhs.messages.count != rhs.messages.count {
|
||||
return false
|
||||
}
|
||||
for i in 0 ..< lhs.messages.count {
|
||||
if lhs.messages[i].stableVersion != rhs.messages[i].stableVersion {
|
||||
return false
|
||||
}
|
||||
if lhs.messages[i].id != rhs.messages[i].id {
|
||||
return false
|
||||
}
|
||||
if lhs.messages[i].associatedMessages.count != rhs.messages[i].associatedMessages.count {
|
||||
return false
|
||||
}
|
||||
for (id, message) in lhs.messages[i].associatedMessages {
|
||||
if let otherMessage = rhs.messages[i].associatedMessages[id] {
|
||||
if message.stableVersion != otherMessage.stableVersion {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
if lhs.isRemovedFromTotalUnreadCount != rhs.isRemovedFromTotalUnreadCount {
|
||||
return false
|
||||
}
|
||||
if let lhsPeerPresence = lhs.presence, let rhsPeerPresence = rhs.presence {
|
||||
if lhsPeerPresence != rhsPeerPresence {
|
||||
return false
|
||||
}
|
||||
} else if (lhs.presence != nil) != (rhs.presence != nil) {
|
||||
return false
|
||||
}
|
||||
if let lhsEmbeddedState = lhs.draftState, let rhsEmbeddedState = rhs.draftState {
|
||||
if lhsEmbeddedState != rhsEmbeddedState {
|
||||
return false
|
||||
}
|
||||
} else if (lhs.draftState != nil) != (rhs.draftState != nil) {
|
||||
return false
|
||||
}
|
||||
if lhs.editing != rhs.editing {
|
||||
return false
|
||||
}
|
||||
if lhs.hasActiveRevealControls != rhs.hasActiveRevealControls {
|
||||
return false
|
||||
}
|
||||
if lhs.selected != rhs.selected {
|
||||
return false
|
||||
}
|
||||
if lhs.peer != rhs.peer {
|
||||
return false
|
||||
}
|
||||
if lhs.threadInfo != rhs.threadInfo {
|
||||
return false
|
||||
}
|
||||
if lhs.hasUnseenMentions != rhs.hasUnseenMentions {
|
||||
return false
|
||||
}
|
||||
if lhs.hasUnseenReactions != rhs.hasUnseenReactions {
|
||||
return false
|
||||
}
|
||||
if let lhsInputActivities = lhs.inputActivities, let rhsInputActivities = rhs.inputActivities {
|
||||
if lhsInputActivities.count != rhsInputActivities.count {
|
||||
return false
|
||||
}
|
||||
for i in 0 ..< lhsInputActivities.count {
|
||||
if lhsInputActivities[i].0 != rhsInputActivities[i].0 {
|
||||
return false
|
||||
}
|
||||
if lhsInputActivities[i].1 != rhsInputActivities[i].1 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
} else if (lhs.inputActivities != nil) != (rhs.inputActivities != nil) {
|
||||
return false
|
||||
}
|
||||
if lhs.promoInfo != rhs.promoInfo {
|
||||
return false
|
||||
}
|
||||
if lhs.hasFailedMessages != rhs.hasFailedMessages {
|
||||
return false
|
||||
}
|
||||
if lhs.isContact != rhs.isContact {
|
||||
return false
|
||||
}
|
||||
if lhs.autoremoveTimeout != rhs.autoremoveTimeout {
|
||||
return false
|
||||
}
|
||||
if lhs.forumTopicData != rhs.forumTopicData {
|
||||
return false
|
||||
}
|
||||
if lhs.topForumTopicItems != rhs.topForumTopicItems {
|
||||
return false
|
||||
}
|
||||
if lhs.revealed != rhs.revealed {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
case HeaderEntry
|
||||
case PeerEntry(
|
||||
index: EngineChatList.Item.Index,
|
||||
presentationData: ChatListPresentationData,
|
||||
messages: [EngineMessage],
|
||||
readState: EnginePeerReadCounters?,
|
||||
isRemovedFromTotalUnreadCount: Bool,
|
||||
draftState: ChatListItemContent.DraftState?,
|
||||
peer: EngineRenderedPeer,
|
||||
threadInfo: ChatListItemContent.ThreadInfo?,
|
||||
presence: EnginePeer.Presence?,
|
||||
hasUnseenMentions: Bool,
|
||||
hasUnseenReactions: Bool,
|
||||
editing: Bool,
|
||||
hasActiveRevealControls: Bool,
|
||||
selected: Bool,
|
||||
inputActivities: [(EnginePeer, PeerInputActivity)]?,
|
||||
promoInfo: ChatListNodeEntryPromoInfo?,
|
||||
hasFailedMessages: Bool,
|
||||
isContact: Bool,
|
||||
forumTopicData: EngineChatList.ForumTopicData?,
|
||||
topForumTopicItems: [EngineChatList.ForumTopicData],
|
||||
revealed: Bool
|
||||
)
|
||||
case PeerEntry(PeerEntryData)
|
||||
case HoleEntry(EngineMessage.Index, theme: PresentationTheme)
|
||||
case GroupReferenceEntry(index: EngineChatList.Item.Index, presentationData: ChatListPresentationData, groupId: EngineChatList.Group, peers: [EngineChatList.GroupItem.Item], message: EngineMessage?, editing: Bool, unreadCount: Int, revealed: Bool, hiddenByDefault: Bool)
|
||||
case ArchiveIntro(presentationData: ChatListPresentationData)
|
||||
@@ -79,8 +240,8 @@ enum ChatListNodeEntry: Comparable, Identifiable {
|
||||
switch self {
|
||||
case .HeaderEntry:
|
||||
return .index(.chatList(.absoluteUpperBound))
|
||||
case let .PeerEntry(index, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||
return .index(index)
|
||||
case let .PeerEntry(peerEntry):
|
||||
return .index(peerEntry.index)
|
||||
case let .HoleEntry(holeIndex, _):
|
||||
return .index(.chatList(EngineChatList.Item.Index.ChatList(pinningIndex: nil, messageIndex: holeIndex)))
|
||||
case let .GroupReferenceEntry(index, _, _, _, _, _, _, _, _):
|
||||
@@ -96,8 +257,8 @@ enum ChatListNodeEntry: Comparable, Identifiable {
|
||||
switch self {
|
||||
case .HeaderEntry:
|
||||
return .Header
|
||||
case let .PeerEntry(index, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||
switch index {
|
||||
case let .PeerEntry(peerEntry):
|
||||
switch peerEntry.index {
|
||||
case let .chatList(index):
|
||||
return .PeerId(index.messageIndex.id.peerId.toInt64())
|
||||
case let .forum(_, _, threadId, _, _):
|
||||
@@ -126,115 +287,11 @@ enum ChatListNodeEntry: Comparable, Identifiable {
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .PeerEntry(lhsIndex, lhsPresentationData, lhsMessages, lhsUnreadCount, lhsIsRemovedFromTotalUnreadCount, lhsEmbeddedState, lhsPeer, lhsThreadInfo, lhsPresence, lhsHasUnseenMentions, lhsHasUnseenReactions, lhsEditing, lhsHasRevealControls, lhsSelected, lhsInputActivities, lhsAd, lhsHasFailedMessages, lhsIsContact, lhsForumThreadTitle, lhsTopForumTopicItems, lhsRevealed):
|
||||
switch rhs {
|
||||
case let .PeerEntry(rhsIndex, rhsPresentationData, rhsMessages, rhsUnreadCount, rhsIsRemovedFromTotalUnreadCount, rhsEmbeddedState, rhsPeer, rhsThreadInfo, rhsPresence, rhsHasUnseenMentions, rhsHasUnseenReactions, rhsEditing, rhsHasRevealControls, rhsSelected, rhsInputActivities, rhsAd, rhsHasFailedMessages, rhsIsContact, rhsForumThreadTitle, rhsTopForumTopicItems, rhsRevealed):
|
||||
if lhsIndex != rhsIndex {
|
||||
return false
|
||||
}
|
||||
if lhsPresentationData !== rhsPresentationData {
|
||||
return false
|
||||
}
|
||||
if lhsUnreadCount != rhsUnreadCount {
|
||||
return false
|
||||
}
|
||||
if lhsMessages.count != rhsMessages.count {
|
||||
return false
|
||||
}
|
||||
for i in 0 ..< lhsMessages.count {
|
||||
if lhsMessages[i].stableVersion != rhsMessages[i].stableVersion {
|
||||
return false
|
||||
}
|
||||
if lhsMessages[i].id != rhsMessages[i].id {
|
||||
return false
|
||||
}
|
||||
if lhsMessages[i].associatedMessages.count != rhsMessages[i].associatedMessages.count {
|
||||
return false
|
||||
}
|
||||
for (id, message) in lhsMessages[i].associatedMessages {
|
||||
if let otherMessage = rhsMessages[i].associatedMessages[id] {
|
||||
if message.stableVersion != otherMessage.stableVersion {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
if lhsIsRemovedFromTotalUnreadCount != rhsIsRemovedFromTotalUnreadCount {
|
||||
return false
|
||||
}
|
||||
if let lhsPeerPresence = lhsPresence, let rhsPeerPresence = rhsPresence {
|
||||
if lhsPeerPresence != rhsPeerPresence {
|
||||
return false
|
||||
}
|
||||
} else if (lhsPresence != nil) != (rhsPresence != nil) {
|
||||
return false
|
||||
}
|
||||
if let lhsEmbeddedState = lhsEmbeddedState, let rhsEmbeddedState = rhsEmbeddedState {
|
||||
if lhsEmbeddedState != rhsEmbeddedState {
|
||||
return false
|
||||
}
|
||||
} else if (lhsEmbeddedState != nil) != (rhsEmbeddedState != nil) {
|
||||
return false
|
||||
}
|
||||
if lhsEditing != rhsEditing {
|
||||
return false
|
||||
}
|
||||
if lhsHasRevealControls != rhsHasRevealControls {
|
||||
return false
|
||||
}
|
||||
if lhsSelected != rhsSelected {
|
||||
return false
|
||||
}
|
||||
if lhsPeer != rhsPeer {
|
||||
return false
|
||||
}
|
||||
if lhsThreadInfo != rhsThreadInfo {
|
||||
return false
|
||||
}
|
||||
if lhsHasUnseenMentions != rhsHasUnseenMentions {
|
||||
return false
|
||||
}
|
||||
if lhsHasUnseenReactions != rhsHasUnseenReactions {
|
||||
return false
|
||||
}
|
||||
if let lhsInputActivities = lhsInputActivities, let rhsInputActivities = rhsInputActivities {
|
||||
if lhsInputActivities.count != rhsInputActivities.count {
|
||||
return false
|
||||
}
|
||||
for i in 0 ..< lhsInputActivities.count {
|
||||
if lhsInputActivities[i].0 != rhsInputActivities[i].0 {
|
||||
return false
|
||||
}
|
||||
if lhsInputActivities[i].1 != rhsInputActivities[i].1 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
} else if (lhsInputActivities != nil) != (rhsInputActivities != nil) {
|
||||
return false
|
||||
}
|
||||
if lhsAd != rhsAd {
|
||||
return false
|
||||
}
|
||||
if lhsHasFailedMessages != rhsHasFailedMessages {
|
||||
return false
|
||||
}
|
||||
if lhsIsContact != rhsIsContact {
|
||||
return false
|
||||
}
|
||||
if lhsForumThreadTitle != rhsForumThreadTitle {
|
||||
return false
|
||||
}
|
||||
if lhsTopForumTopicItems != rhsTopForumTopicItems {
|
||||
return false
|
||||
}
|
||||
if lhsRevealed != rhsRevealed {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
case let .PeerEntry(peerEntry):
|
||||
if case .PeerEntry(peerEntry) = rhs {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
case let .HoleEntry(lhsHole, lhsTheme):
|
||||
switch rhs {
|
||||
@@ -401,7 +458,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
threadInfo = ChatListItemContent.ThreadInfo(id: threadId, info: threadData.info, isOwnedByMe: threadData.isOwnedByMe, isClosed: threadData.isClosed, isHidden: threadData.isHidden)
|
||||
}
|
||||
|
||||
result.append(.PeerEntry(
|
||||
result.append(.PeerEntry(ChatListNodeEntry.PeerEntryData(
|
||||
index: offsetPinnedIndex(entry.index, offset: pinnedIndexOffset),
|
||||
presentationData: state.presentationData,
|
||||
messages: updatedMessages,
|
||||
@@ -420,10 +477,11 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
promoInfo: nil,
|
||||
hasFailedMessages: entry.hasFailed,
|
||||
isContact: entry.isContact,
|
||||
autoremoveTimeout: entry.autoremoveTimeout,
|
||||
forumTopicData: entry.forumTopicData,
|
||||
topForumTopicItems: entry.topForumTopicItems,
|
||||
revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing)
|
||||
))
|
||||
)))
|
||||
}
|
||||
if !view.hasLater {
|
||||
var pinningIndex: UInt16 = UInt16(pinnedIndexOffset == 0 ? 0 : (pinnedIndexOffset - 1))
|
||||
@@ -438,7 +496,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
}
|
||||
|
||||
let messageIndex = EngineMessage.Index(id: EngineMessage.Id(peerId: peer.0.id, namespace: 0, id: 0), timestamp: 1)
|
||||
result.append(.PeerEntry(
|
||||
result.append(.PeerEntry(ChatListNodeEntry.PeerEntryData(
|
||||
index: .chatList(EngineChatList.Item.Index.ChatList(pinningIndex: foundPinningIndex, messageIndex: messageIndex)),
|
||||
presentationData: state.presentationData,
|
||||
messages: [],
|
||||
@@ -457,17 +515,18 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
promoInfo: nil,
|
||||
hasFailedMessages: false,
|
||||
isContact: false,
|
||||
autoremoveTimeout: nil,
|
||||
forumTopicData: nil,
|
||||
topForumTopicItems: [],
|
||||
revealed: false
|
||||
))
|
||||
)))
|
||||
if foundPinningIndex != 0 {
|
||||
foundPinningIndex -= 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result.append(.PeerEntry(
|
||||
result.append(.PeerEntry(ChatListNodeEntry.PeerEntryData(
|
||||
index: .chatList(EngineChatList.Item.Index.ChatList.absoluteUpperBound.predecessor),
|
||||
presentationData: state.presentationData,
|
||||
messages: [],
|
||||
@@ -486,10 +545,11 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
promoInfo: nil,
|
||||
hasFailedMessages: false,
|
||||
isContact: false,
|
||||
autoremoveTimeout: nil,
|
||||
forumTopicData: nil,
|
||||
topForumTopicItems: [],
|
||||
revealed: false
|
||||
))
|
||||
)))
|
||||
} else {
|
||||
if !filteredAdditionalItemEntries.isEmpty {
|
||||
for item in filteredAdditionalItemEntries.reversed() {
|
||||
@@ -516,8 +576,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
||||
result.append(.PeerEntry(
|
||||
result.append(.PeerEntry(ChatListNodeEntry.PeerEntryData(
|
||||
index: .chatList(EngineChatList.Item.Index.ChatList(pinningIndex: pinningIndex, messageIndex: index.messageIndex)),
|
||||
presentationData: state.presentationData,
|
||||
messages: item.item.messages,
|
||||
@@ -536,10 +595,11 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
promoInfo: promoInfo,
|
||||
hasFailedMessages: item.item.hasFailed,
|
||||
isContact: item.item.isContact,
|
||||
autoremoveTimeout: item.item.autoremoveTimeout,
|
||||
forumTopicData: item.item.forumTopicData,
|
||||
topForumTopicItems: item.item.topForumTopicItems,
|
||||
revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing)
|
||||
))
|
||||
revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing)
|
||||
)))
|
||||
if pinningIndex != 0 {
|
||||
pinningIndex -= 1
|
||||
}
|
||||
@@ -573,7 +633,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState
|
||||
result.append(.HeaderEntry)
|
||||
}
|
||||
|
||||
if !view.hasLater, case let .peers(_, _, additionalCategories, _) = mode {
|
||||
if !view.hasLater, case let .peers(_, _, additionalCategories, _, _) = mode {
|
||||
var index = 0
|
||||
for category in additionalCategories.reversed(){
|
||||
result.append(.AdditionalCategory(index: index, id: category.id, title: category.title, image: category.icon, appearance: category.appearance, selected: state.selectedAdditionalCategoryIds.contains(category.id), presentationData: state.presentationData))
|
||||
|
||||
Reference in New Issue
Block a user