mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 22:25:57 +00:00
Update reactions
This commit is contained in:
@@ -3,7 +3,6 @@ import Postbox
|
||||
import TelegramApi
|
||||
import SwiftSignalKit
|
||||
|
||||
|
||||
func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManager: AccountStateManager, peerId: PeerId) -> Disposable {
|
||||
return postbox.installStoreMessageAction(peerId: peerId, { messages, transaction in
|
||||
var consumeMessageIds: [MessageId] = []
|
||||
@@ -17,7 +16,7 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
|
||||
var hasUnconsumedContent = false
|
||||
var hasUnseenReactions = false
|
||||
|
||||
if message.tags.contains(.unseenPersonalMessage) {
|
||||
if message.tags.contains(.unseenPersonalMessage) || message.tags.contains(.unseenReaction) {
|
||||
inner: for attribute in message.attributes {
|
||||
if let attribute = attribute as? ConsumablePersonalMentionMessageAttribute, !attribute.consumed, !attribute.pending {
|
||||
hasUnconsumedMention = true
|
||||
@@ -65,7 +64,9 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
|
||||
}
|
||||
}
|
||||
}
|
||||
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
|
||||
var tags = currentMessage.tags
|
||||
tags.remove(.unseenReaction)
|
||||
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
|
||||
})
|
||||
|
||||
if consumeMessageIds.contains(id) {
|
||||
@@ -81,3 +82,82 @@ func _internal_installInteractiveReadMessagesAction(postbox: Postbox, stateManag
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
public struct VisibleMessageRange {
|
||||
public var lowerBound: MessageIndex
|
||||
public var upperBound: MessageIndex?
|
||||
|
||||
public init(lowerBound: MessageIndex, upperBound: MessageIndex?) {
|
||||
self.lowerBound = lowerBound
|
||||
self.upperBound = upperBound
|
||||
}
|
||||
|
||||
fileprivate func contains(index: MessageIndex) -> Bool {
|
||||
if index < lowerBound {
|
||||
return false
|
||||
}
|
||||
if let upperBound = self.upperBound {
|
||||
if index > upperBound {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
private final class StoreOrUpdateMessageActionImpl: StoreOrUpdateMessageAction {
|
||||
private let getVisibleRange: () -> VisibleMessageRange?
|
||||
private let didReadReactionsInMessages: ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void
|
||||
|
||||
init(getVisibleRange: @escaping () -> VisibleMessageRange?, didReadReactionsInMessages: @escaping ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void) {
|
||||
self.getVisibleRange = getVisibleRange
|
||||
self.didReadReactionsInMessages = didReadReactionsInMessages
|
||||
}
|
||||
|
||||
func addOrUpdate(messages: [StoreMessage], transaction: Transaction) {
|
||||
var readReactionIds: [MessageId: [ReactionsMessageAttribute.RecentPeer]] = [:]
|
||||
|
||||
guard let visibleRange = self.getVisibleRange() else {
|
||||
return
|
||||
}
|
||||
|
||||
for message in messages {
|
||||
guard let index = message.index else {
|
||||
continue
|
||||
}
|
||||
if !visibleRange.contains(index: index) {
|
||||
continue
|
||||
}
|
||||
|
||||
if message.tags.contains(.unseenReaction) {
|
||||
inner: for attribute in message.attributes {
|
||||
if let attribute = attribute as? ReactionsMessageAttribute, attribute.hasUnseen {
|
||||
readReactionIds[index.id] = attribute.recentPeers
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for id in readReactionIds.keys {
|
||||
transaction.updateMessage(id, update: { currentMessage in
|
||||
var attributes = currentMessage.attributes
|
||||
reactionsLoop: for j in 0 ..< attributes.count {
|
||||
if let attribute = attributes[j] as? ReactionsMessageAttribute {
|
||||
attributes[j] = attribute.withAllSeen()
|
||||
break reactionsLoop
|
||||
}
|
||||
}
|
||||
var tags = currentMessage.tags
|
||||
tags.remove(.unseenReaction)
|
||||
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: currentMessage.tags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init), authorId: currentMessage.author?.id, text: currentMessage.text, attributes: attributes, media: currentMessage.media))
|
||||
})
|
||||
transaction.setPendingMessageAction(type: .readReaction, id: id, action: ReadReactionAction())
|
||||
}
|
||||
|
||||
self.didReadReactionsInMessages(readReactionIds)
|
||||
}
|
||||
}
|
||||
|
||||
func _internal_installInteractiveReadReactionsAction(postbox: Postbox, stateManager: AccountStateManager, peerId: PeerId, getVisibleRange: @escaping () -> VisibleMessageRange?, didReadReactionsInMessages: @escaping ([MessageId: [ReactionsMessageAttribute.RecentPeer]]) -> Void) -> Disposable {
|
||||
return postbox.installStoreOrUpdateMessageAction(peerId: peerId, action: StoreOrUpdateMessageActionImpl(getVisibleRange: getVisibleRange, didReadReactionsInMessages: didReadReactionsInMessages))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user