mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Stories
This commit is contained in:
@@ -533,8 +533,8 @@ private final class ChatListViewSpaceState {
|
||||
let entryPeer: Peer
|
||||
let entryNotificationsPeerId: PeerId
|
||||
switch entry {
|
||||
case let .MessageEntry(_, _, _, _, _, _, renderedPeer, _, _, _, _, _, _, _):
|
||||
if let peer = renderedPeer.peer {
|
||||
case let .MessageEntry(entryData):
|
||||
if let peer = entryData.renderedPeer.peer {
|
||||
entryPeer = peer
|
||||
entryNotificationsPeerId = peer.notificationSettingsPeerId ?? peer.id
|
||||
} else {
|
||||
@@ -648,13 +648,17 @@ private final class ChatListViewSpaceState {
|
||||
|
||||
if self.orderedEntries.mutableScan({ entry in
|
||||
switch entry {
|
||||
case let .MessageEntry(index, messages, readState, _, _, embeddedInterfaceState, renderedPeer, presence, tagSummaryInfo, forumTopicData, topForumTopics, hasFailedMessages, isContact, autoremoveTimeout):
|
||||
if let peer = renderedPeer.peer {
|
||||
case let .MessageEntry(entryData):
|
||||
if let peer = entryData.renderedPeer.peer {
|
||||
let notificationsPeerId = peer.notificationSettingsPeerId ?? peer.id
|
||||
if let (_, updated) = transaction.currentUpdatedPeerNotificationSettings[notificationsPeerId] {
|
||||
let isRemovedFromTotalUnreadCount = resolvedIsRemovedFromTotalUnreadCount(globalSettings: globalNotificationSettings, peer: peer, peerSettings: updated)
|
||||
|
||||
return .MessageEntry(index: index, messages: messages, readState: readState, notificationSettings: updated, isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount, embeddedInterfaceState: embeddedInterfaceState, renderedPeer: renderedPeer, presence: presence, tagSummaryInfo: tagSummaryInfo, forumTopicData: forumTopicData, topForumTopics: topForumTopics, hasFailedMessages: hasFailedMessages, isContact: isContact, autoremoveTimeout: autoremoveTimeout)
|
||||
var entryData = entryData
|
||||
entryData.notificationSettings = updated
|
||||
entryData.isRemovedFromTotalUnreadCount = isRemovedFromTotalUnreadCount
|
||||
|
||||
return .MessageEntry(entryData)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@@ -672,24 +676,11 @@ private final class ChatListViewSpaceState {
|
||||
if !transaction.updatedFailedMessagePeerIds.isEmpty {
|
||||
if self.orderedEntries.mutableScan({ entry in
|
||||
switch entry {
|
||||
case let .MessageEntry(index, messages, readState, notificationSettings, isRemovedFromTotalUnreadCount, embeddedInterfaceState, renderedPeer, presence, tagSummaryInfo, forumTopicData, topForumTopics, _, isContact, autoremoveTimeout):
|
||||
if transaction.updatedFailedMessagePeerIds.contains(index.messageIndex.id.peerId) {
|
||||
return .MessageEntry(
|
||||
index: index,
|
||||
messages: messages,
|
||||
readState: readState,
|
||||
notificationSettings: notificationSettings,
|
||||
isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount,
|
||||
embeddedInterfaceState: embeddedInterfaceState,
|
||||
renderedPeer: renderedPeer,
|
||||
presence: presence,
|
||||
tagSummaryInfo: tagSummaryInfo,
|
||||
forumTopicData: forumTopicData,
|
||||
topForumTopics: topForumTopics,
|
||||
hasFailedMessages: postbox.messageHistoryFailedTable.contains(peerId: index.messageIndex.id.peerId),
|
||||
isContact: isContact,
|
||||
autoremoveTimeout: autoremoveTimeout
|
||||
)
|
||||
case let .MessageEntry(entryData):
|
||||
if transaction.updatedFailedMessagePeerIds.contains(entryData.index.messageIndex.id.peerId) {
|
||||
var entryData = entryData
|
||||
entryData.hasFailedMessages = postbox.messageHistoryFailedTable.contains(peerId: entryData.index.messageIndex.id.peerId)
|
||||
return .MessageEntry(entryData)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@@ -704,8 +695,8 @@ private final class ChatListViewSpaceState {
|
||||
if !transaction.currentUpdatedPeers.isEmpty {
|
||||
if self.orderedEntries.mutableScan({ entry in
|
||||
switch entry {
|
||||
case let .MessageEntry(index, messages, readState, notificationSettings, isRemovedFromTotalUnreadCount, embeddedInterfaceState, entryRenderedPeer, presence, tagSummaryInfo, forumTopicData, topForumTopics, hasFailedMessages, isContact, autoremoveTimeout):
|
||||
var updatedMessages: [Message] = messages
|
||||
case let .MessageEntry(entryData):
|
||||
var updatedMessages: [Message] = entryData.messages
|
||||
var hasUpdatedMessages = false
|
||||
for i in 0 ..< updatedMessages.count {
|
||||
if let updatedMessage = updateMessagePeers(updatedMessages[i], updatedPeers: transaction.currentUpdatedPeers) {
|
||||
@@ -713,25 +704,14 @@ private final class ChatListViewSpaceState {
|
||||
hasUpdatedMessages = true
|
||||
}
|
||||
}
|
||||
let renderedPeer = updatedRenderedPeer(postbox: postbox, renderedPeer: entryRenderedPeer, updatedPeers: transaction.currentUpdatedPeers)
|
||||
let renderedPeer = updatedRenderedPeer(postbox: postbox, renderedPeer: entryData.renderedPeer, updatedPeers: transaction.currentUpdatedPeers)
|
||||
|
||||
var entryData = entryData
|
||||
entryData.messages = updatedMessages
|
||||
entryData.renderedPeer = renderedPeer ?? entryData.renderedPeer
|
||||
|
||||
if hasUpdatedMessages || renderedPeer != nil {
|
||||
return .MessageEntry(
|
||||
index: index,
|
||||
messages: updatedMessages,
|
||||
readState: readState,
|
||||
notificationSettings: notificationSettings,
|
||||
isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount,
|
||||
embeddedInterfaceState: embeddedInterfaceState,
|
||||
renderedPeer: renderedPeer ?? entryRenderedPeer,
|
||||
presence: presence,
|
||||
tagSummaryInfo: tagSummaryInfo,
|
||||
forumTopicData: forumTopicData,
|
||||
topForumTopics: topForumTopics,
|
||||
hasFailedMessages: hasFailedMessages,
|
||||
isContact: isContact,
|
||||
autoremoveTimeout: autoremoveTimeout
|
||||
)
|
||||
return .MessageEntry(entryData)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@@ -746,28 +726,15 @@ private final class ChatListViewSpaceState {
|
||||
if !transaction.currentUpdatedPeerPresences.isEmpty {
|
||||
if self.orderedEntries.mutableScan({ entry in
|
||||
switch entry {
|
||||
case let .MessageEntry(index, messages, readState, notificationSettings, isRemovedFromTotalUnreadCount, embeddedInterfaceState, entryRenderedPeer, _, tagSummaryInfo, forumTopicData, topForumTopics, hasFailedMessages, isContact, autoremoveTimeout):
|
||||
var presencePeerId = entryRenderedPeer.peerId
|
||||
if let peer = entryRenderedPeer.peers[entryRenderedPeer.peerId], let associatedPeerId = peer.associatedPeerId {
|
||||
case let .MessageEntry(entryData):
|
||||
var presencePeerId = entryData.renderedPeer.peerId
|
||||
if let peer = entryData.renderedPeer.peers[entryData.renderedPeer.peerId], let associatedPeerId = peer.associatedPeerId {
|
||||
presencePeerId = associatedPeerId
|
||||
}
|
||||
if let presence = transaction.currentUpdatedPeerPresences[presencePeerId] {
|
||||
return .MessageEntry(
|
||||
index: index,
|
||||
messages: messages,
|
||||
readState: readState,
|
||||
notificationSettings: notificationSettings,
|
||||
isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount,
|
||||
embeddedInterfaceState: embeddedInterfaceState,
|
||||
renderedPeer: entryRenderedPeer,
|
||||
presence: presence,
|
||||
tagSummaryInfo: tagSummaryInfo,
|
||||
forumTopicData: forumTopicData,
|
||||
topForumTopics: topForumTopics,
|
||||
hasFailedMessages: hasFailedMessages,
|
||||
isContact: isContact,
|
||||
autoremoveTimeout: autoremoveTimeout
|
||||
)
|
||||
var entryData = entryData
|
||||
entryData.presence = presence
|
||||
return .MessageEntry(entryData)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@@ -785,8 +752,8 @@ private final class ChatListViewSpaceState {
|
||||
let entryPeer: Peer
|
||||
let entryNotificationsPeerId: PeerId
|
||||
switch entry {
|
||||
case let .MessageEntry(_, _, _, _, _, _, entryRenderedPeer, _, _, _, _, _, _, _):
|
||||
if let peer = entryRenderedPeer.peer {
|
||||
case let .MessageEntry(entryData):
|
||||
if let peer = entryData.renderedPeer.peer {
|
||||
entryPeer = peer
|
||||
entryNotificationsPeerId = peer.notificationSettingsPeerId ?? peer.id
|
||||
} else {
|
||||
@@ -913,17 +880,17 @@ private final class ChatListViewSpaceState {
|
||||
}
|
||||
}
|
||||
|
||||
if !transaction.currentUpdatedMessageTagSummaries.isEmpty || !transaction.currentUpdatedMessageActionsSummaries.isEmpty || !transaction.updatedPeerThreadsSummaries.isEmpty || cachedPeerDataUpdated {
|
||||
if !transaction.currentUpdatedMessageTagSummaries.isEmpty || !transaction.currentUpdatedMessageActionsSummaries.isEmpty || !transaction.updatedPeerThreadsSummaries.isEmpty || cachedPeerDataUpdated || !transaction.currentStoryTopItemEvents.isEmpty || !transaction.storyPeerStatesEvents.isEmpty {
|
||||
if self.orderedEntries.mutableScan({ entry in
|
||||
switch entry {
|
||||
case let .MessageEntry(index, messages, readState, notificationSettings, isRemovedFromTotalUnreadCount, embeddedInterfaceState, entryRenderedPeer, presence, tagSummaryInfo, forumTopicData, topForumTopics, hasFailedMessages, isContact, autoremoveTimeout):
|
||||
var updatedChatListMessageTagSummaryInfo: [ChatListEntryMessageTagSummaryKey: ChatListMessageTagSummaryInfo] = tagSummaryInfo
|
||||
case let .MessageEntry(entryData):
|
||||
var updatedChatListMessageTagSummaryInfo: [ChatListEntryMessageTagSummaryKey: ChatListMessageTagSummaryInfo] = entryData.tagSummaryInfo
|
||||
var didUpdateSummaryInfo = false
|
||||
|
||||
for (key, component) in self.summaryComponents.components {
|
||||
var updatedTagSummaryCount: Int32?
|
||||
if let tagSummary = component.tagSummary {
|
||||
let key = MessageHistoryTagsSummaryKey(tag: key.tag, peerId: index.messageIndex.id.peerId, threadId: nil, namespace: tagSummary.namespace)
|
||||
let key = MessageHistoryTagsSummaryKey(tag: key.tag, peerId: entryData.index.messageIndex.id.peerId, threadId: nil, namespace: tagSummary.namespace)
|
||||
if let summary = transaction.currentUpdatedMessageTagSummaries[key] {
|
||||
updatedTagSummaryCount = summary.count
|
||||
}
|
||||
@@ -931,7 +898,7 @@ private final class ChatListViewSpaceState {
|
||||
|
||||
var updatedActionsSummaryCount: Int32?
|
||||
if let actionsSummary = component.actionsSummary {
|
||||
let key = PendingMessageActionsSummaryKey(type: key.actionType, peerId: index.messageIndex.id.peerId, namespace: actionsSummary.namespace)
|
||||
let key = PendingMessageActionsSummaryKey(type: key.actionType, peerId: entryData.index.messageIndex.id.peerId, namespace: actionsSummary.namespace)
|
||||
if let count = transaction.currentUpdatedMessageActionsSummaries[key] {
|
||||
updatedActionsSummaryCount = count
|
||||
}
|
||||
@@ -946,8 +913,8 @@ private final class ChatListViewSpaceState {
|
||||
}
|
||||
}
|
||||
|
||||
var updatedReadState = readState
|
||||
if let peer = postbox.peerTable.get(index.messageIndex.id.peerId), postbox.seedConfiguration.peerSummaryIsThreadBased(peer) {
|
||||
var updatedReadState = entryData.readState
|
||||
if let peer = postbox.peerTable.get(entryData.index.messageIndex.id.peerId), postbox.seedConfiguration.peerSummaryIsThreadBased(peer) {
|
||||
let summary = postbox.peerThreadsSummaryTable.get(peerId: peer.id)
|
||||
|
||||
var count: Int32 = 0
|
||||
@@ -961,40 +928,35 @@ private final class ChatListViewSpaceState {
|
||||
|
||||
updatedReadState = ChatListViewReadState(state: CombinedPeerReadState(states: [(0, .idBased(maxIncomingReadId: 1, maxOutgoingReadId: 0, maxKnownId: 0, count: count, markedUnread: false))]), isMuted: isMuted)
|
||||
} else {
|
||||
updatedReadState = postbox.readStateTable.getCombinedState(index.messageIndex.id.peerId).flatMap { state in
|
||||
updatedReadState = postbox.readStateTable.getCombinedState(entryData.index.messageIndex.id.peerId).flatMap { state in
|
||||
return ChatListViewReadState(state: state, isMuted: false)
|
||||
}
|
||||
}
|
||||
|
||||
if updatedReadState != readState {
|
||||
if updatedReadState != entryData.readState {
|
||||
didUpdateSummaryInfo = true
|
||||
}
|
||||
|
||||
var updatedAutoremoveTimeout: Int32?
|
||||
if let cachedData = postbox.cachedPeerDataTable.get(index.messageIndex.id.peerId) {
|
||||
if let cachedData = postbox.cachedPeerDataTable.get(entryData.index.messageIndex.id.peerId) {
|
||||
updatedAutoremoveTimeout = postbox.seedConfiguration.decodeAutoremoveTimeout(cachedData)
|
||||
if updatedAutoremoveTimeout != autoremoveTimeout {
|
||||
if updatedAutoremoveTimeout != entryData.autoremoveTimeout {
|
||||
didUpdateSummaryInfo = true
|
||||
}
|
||||
}
|
||||
|
||||
let storyStats = fetchPeerStoryStats(postbox: postbox, peerId: entryData.index.messageIndex.id.peerId)
|
||||
if entryData.storyStats != storyStats {
|
||||
didUpdateSummaryInfo = true
|
||||
}
|
||||
|
||||
if didUpdateSummaryInfo {
|
||||
return .MessageEntry(
|
||||
index: index,
|
||||
messages: messages,
|
||||
readState: updatedReadState,
|
||||
notificationSettings: notificationSettings,
|
||||
isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount,
|
||||
embeddedInterfaceState: embeddedInterfaceState,
|
||||
renderedPeer: entryRenderedPeer,
|
||||
presence: presence,
|
||||
tagSummaryInfo: updatedChatListMessageTagSummaryInfo,
|
||||
forumTopicData: forumTopicData,
|
||||
topForumTopics: topForumTopics,
|
||||
hasFailedMessages: hasFailedMessages,
|
||||
isContact: isContact,
|
||||
autoremoveTimeout: updatedAutoremoveTimeout
|
||||
)
|
||||
var entryData = entryData
|
||||
entryData.readState = updatedReadState
|
||||
entryData.tagSummaryInfo = updatedChatListMessageTagSummaryInfo
|
||||
entryData.autoremoveTimeout = updatedAutoremoveTimeout
|
||||
entryData.storyStats = storyStats
|
||||
return .MessageEntry(entryData)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@@ -1127,8 +1089,8 @@ private extension MutableChatListEntry {
|
||||
switch self {
|
||||
case let .IntermediateMessageEntry(index, _):
|
||||
return index.messageIndex.id.peerId
|
||||
case let .MessageEntry(index, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||
return index.messageIndex.id.peerId
|
||||
case let .MessageEntry(entryData):
|
||||
return entryData.index.messageIndex.id.peerId
|
||||
case .HoleEntry:
|
||||
return nil
|
||||
}
|
||||
@@ -1138,8 +1100,8 @@ private extension MutableChatListEntry {
|
||||
switch self {
|
||||
case let .IntermediateMessageEntry(index, _):
|
||||
return MutableChatListEntryIndex(index: index, isMessage: true)
|
||||
case let .MessageEntry(index, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||
return MutableChatListEntryIndex(index: index, isMessage: true)
|
||||
case let .MessageEntry(entryData):
|
||||
return MutableChatListEntryIndex(index: entryData.index, isMessage: true)
|
||||
case let .HoleEntry(hole):
|
||||
return MutableChatListEntryIndex(index: ChatListIndex(pinningIndex: nil, messageIndex: hole.index), isMessage: false)
|
||||
}
|
||||
@@ -1149,8 +1111,8 @@ private extension MutableChatListEntry {
|
||||
switch self {
|
||||
case let .IntermediateMessageEntry(index, _):
|
||||
return .peer(index.messageIndex.id.peerId)
|
||||
case let .MessageEntry(index, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||
return .peer(index.messageIndex.id.peerId)
|
||||
case let .MessageEntry(entryData):
|
||||
return .peer(entryData.index.messageIndex.id.peerId)
|
||||
case let .HoleEntry(hole):
|
||||
return .hole(hole.index)
|
||||
}
|
||||
@@ -1635,7 +1597,25 @@ struct ChatListViewState {
|
||||
autoremoveTimeout = postbox.seedConfiguration.decodeAutoremoveTimeout(cachedData)
|
||||
}
|
||||
|
||||
let updatedEntry: MutableChatListEntry = .MessageEntry(index: index, messages: renderedMessages, readState: readState, notificationSettings: notificationSettings, isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount, embeddedInterfaceState: postbox.peerChatInterfaceStateTable.get(index.messageIndex.id.peerId), renderedPeer: renderedPeer, presence: presence, tagSummaryInfo: tagSummaryInfo, forumTopicData: forumTopicData, topForumTopics: topForumTopics, hasFailedMessages: false, isContact: postbox.contactsTable.isContact(peerId: index.messageIndex.id.peerId), autoremoveTimeout: autoremoveTimeout)
|
||||
let storyStats = fetchPeerStoryStats(postbox: postbox, peerId: index.messageIndex.id.peerId)
|
||||
|
||||
let updatedEntry: MutableChatListEntry = .MessageEntry(MutableChatListEntry.MessageEntryData(
|
||||
index: index,
|
||||
messages: renderedMessages,
|
||||
readState: readState,
|
||||
notificationSettings: notificationSettings,
|
||||
isRemovedFromTotalUnreadCount: isRemovedFromTotalUnreadCount,
|
||||
embeddedInterfaceState: postbox.peerChatInterfaceStateTable.get(index.messageIndex.id.peerId),
|
||||
renderedPeer: renderedPeer,
|
||||
presence: presence,
|
||||
tagSummaryInfo: tagSummaryInfo,
|
||||
forumTopicData: forumTopicData,
|
||||
topForumTopics: topForumTopics,
|
||||
hasFailedMessages: false,
|
||||
isContact: postbox.contactsTable.isContact(peerId: index.messageIndex.id.peerId),
|
||||
autoremoveTimeout: autoremoveTimeout,
|
||||
storyStats: storyStats
|
||||
))
|
||||
if directionIndex == 0 {
|
||||
self.stateBySpace[space]!.orderedEntries.setLowerOrAtAnchorAtArrayIndex(listIndex, to: updatedEntry)
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user