Various fixes

This commit is contained in:
Ilya Laktyushin 2020-10-17 20:53:15 +04:00
parent 912a9fa492
commit e190ea3bf9
16 changed files with 164 additions and 270 deletions

View File

@ -873,6 +873,11 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
updatedState.updateMinAvailableMessage(MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: minId))
case let .updateDeleteMessages(messages, _, _):
updatedState.deleteMessagesWithGlobalIds(messages)
case let .updatePinnedMessages(flags, peer, messages, _, _):
let peerId = peer.peerId
updatedState.updateMessagesPinned(ids: messages.map { id in
MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: id)
}, pinned: (flags & (1 << 0)) != 0)
case let .updateEditMessage(apiMessage, _, _):
if let message = StoreMessage(apiMessage: apiMessage), case let .Id(messageId) = message.id {
if let preCachedResources = apiMessage.preCachedResources {
@ -1139,28 +1144,6 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
channelsToPoll.insert(peerId)
}
}
case let .updateUserPinnedMessage(userId, id):
let userPeerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: userId)
updatedState.updateCachedPeerData(userPeerId, { current in
let previous: CachedUserData
if let current = current as? CachedUserData {
previous = current
} else {
previous = CachedUserData()
}
return previous.withUpdatedPinnedMessageId(id == 0 ? nil : MessageId(peerId: userPeerId, namespace: Namespaces.Message.Cloud, id: id))
})
case let .updateChatPinnedMessage(groupId, id, _):
let groupPeerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: groupId)
updatedState.updateCachedPeerData(groupPeerId, { current in
let previous: CachedGroupData
if let current = current as? CachedGroupData {
previous = current
} else {
previous = CachedGroupData()
}
return previous.withUpdatedPinnedMessageId(id == 0 ? nil : MessageId(peerId: groupPeerId, namespace: Namespaces.Message.Cloud, id: id))
})
case let .updatePeerBlocked(peerId, blocked):
let userPeerId = peerId.peerId
updatedState.updateCachedPeerData(userPeerId, { current in
@ -1461,9 +1444,9 @@ private func resolveAssociatedMessages(network: Network, state: AccountMutableSt
switch result {
case let .messages(messages, chats, users):
return (messages, chats, users)
case let .messagesSlice(_, _, _, messages, chats, users):
case let .messagesSlice(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case let .channelMessages(_, _, _, messages, chats, users):
case let .channelMessages(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case .messagesNotModified:
return ([], [], [])

View File

@ -90,11 +90,11 @@ private func fetchWebpage(account: Account, messageId: MessageId) -> Signal<Void
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -988,9 +988,9 @@ public final class AccountViewTracker {
switch result {
case let .messages(messages, chats, users):
return (messages, chats, users)
case let .messagesSlice(_, _, _, messages, chats, users):
case let .messagesSlice(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case let .channelMessages(_, _, _, messages, chats, users):
case let .channelMessages(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case .messagesNotModified:
return ([], [], [])

View File

@ -491,11 +491,11 @@ private func validateChannelMessagesBatch(postbox: Postbox, network: Network, ac
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -546,11 +546,11 @@ private func validateReplyThreadMessagesBatch(postbox: Postbox, network: Network
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -587,11 +587,11 @@ private func validateScheduledMessagesBatch(postbox: Postbox, network: Network,
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -664,11 +664,11 @@ private func validateBatch(postbox: Postbox, network: Network, transaction: Tran
|> map { result -> Set<MessageId> in
let apiMessages: [Api.Message]
switch result {
case let .channelMessages(_, _, _, messages, _, _):
case let .channelMessages(_, _, _, _, messages, _, _):
apiMessages = messages
case let .messages(messages, _, _):
apiMessages = messages
case let .messagesSlice(_, _, _, messages, _, _):
case let .messagesSlice(_, _, _, _, messages, _, _):
apiMessages = messages
case .messagesNotModified:
return Set()
@ -912,11 +912,11 @@ private func validateReplyThreadBatch(postbox: Postbox, network: Network, transa
|> map { result -> Set<MessageId> in
let apiMessages: [Api.Message]
switch result {
case let .channelMessages(_, _, _, messages, _, _):
case let .channelMessages(_, _, _, _, messages, _, _):
apiMessages = messages
case let .messages(messages, _, _):
apiMessages = messages
case let .messagesSlice(_, _, _, messages, _, _):
case let .messagesSlice(_, _, _, _, messages, _, _):
apiMessages = messages
case .messagesNotModified:
return Set()

View File

@ -80,9 +80,9 @@ func withResolvedAssociatedMessages<T>(postbox: Postbox, source: FetchMessageHis
switch result {
case let .messages(messages, chats, users):
return (messages, chats, users)
case let .messagesSlice(_, _, _, messages, chats, users):
case let .messagesSlice(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case let .channelMessages(_, _, _, messages, chats, users):
case let .channelMessages(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case .messagesNotModified:
return ([], [], [])
@ -436,11 +436,11 @@ func fetchMessageHistoryHole(accountPeerId: PeerId, source: FetchMessageHistoryH
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -670,11 +670,11 @@ func fetchCallListHole(network: Network, postbox: Postbox, accountPeerId: PeerId
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers

View File

@ -57,9 +57,9 @@ public func getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Postb
switch result {
case let .messages(messages, chats, users):
return (messages, chats, users)
case let .messagesSlice(_, _, _, messages, chats, users):
case let .messagesSlice(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case let .channelMessages(_, _, _, messages, chats, users):
case let .channelMessages(_, _, _, _, messages, chats, users):
return (messages, chats, users)
case .messagesNotModified:
return ([], [], [])

View File

@ -37,9 +37,9 @@ public func loadedPeerFromMessage(account: Account, peerId: PeerId, messageId: M
switch result {
case let .messages(_, _, users):
apiUsers = users
case let .messagesSlice(_, _, _, _, _, users):
case let .messagesSlice(_, _, _, _, _, _, users):
apiUsers = users
case let .channelMessages(_, _, _, _, _, users):
case let .channelMessages(_, _, _, _, _, _, users):
apiUsers = users
case .messagesNotModified:
apiUsers = []

View File

@ -318,11 +318,7 @@ public func requestProximityNotification(postbox: Postbox, network: Network, mes
return .complete()
}
let flags: Int32 = 1 << 0
var geoFlags: Int32 = 0
if let _ = coordinate.accuracyRadius {
geoFlags |= 1 << 0
}
return network.request(Api.functions.messages.requestProximityNotification(flags: flags, peer: inputPeer, msgId: messageId.id, ownLocation: .inputGeoPoint(flags: geoFlags, lat: coordinate.latitude, long: coordinate.longitude, accuracyRadius: coordinate.accuracyRadius), maxDistance: distance))
return network.request(Api.functions.messages.requestProximityNotification(flags: flags, peer: inputPeer, msgId: messageId.id, maxDistance: distance))
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
return .single(nil)
@ -341,7 +337,7 @@ public func cancelProximityNotification(postbox: Postbox, network: Network, mess
guard let inputPeer = inputPeer else {
return .complete()
}
return network.request(Api.functions.messages.requestProximityNotification(flags: 1 << 1, peer: inputPeer, msgId: messageId.id, ownLocation: nil, maxDistance: nil))
return network.request(Api.functions.messages.requestProximityNotification(flags: 1 << 1, peer: inputPeer, msgId: messageId.id, maxDistance: nil))
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
return .single(nil)

View File

@ -72,7 +72,7 @@ public func requestPeerPhotos(postbox: Postbox, network: Network, peerId: PeerId
let chats: [Api.Chat]
let users: [Api.User]
switch result {
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -80,7 +80,7 @@ public func requestPeerPhotos(postbox: Postbox, network: Network, peerId: PeerId
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers

View File

@ -71,7 +71,7 @@ private func mergedState(transaction: Transaction, state: SearchMessagesPeerStat
let totalCount: Int32
let nextRate: Int32?
switch result {
case let .channelMessages(_, _, count, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, count, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -83,7 +83,7 @@ private func mergedState(transaction: Transaction, state: SearchMessagesPeerStat
users = apiUsers
totalCount = Int32(messages.count)
nextRate = nil
case let .messagesSlice(_, count, apiNextRate, apiMessages, apiChats, apiUsers):
case let .messagesSlice(_, count, apiNextRate, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -412,7 +412,7 @@ public func downloadMessage(postbox: Postbox, network: Network, messageId: Messa
let chats: [Api.Chat]
let users: [Api.User]
switch result {
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -420,7 +420,7 @@ public func downloadMessage(postbox: Postbox, network: Network, messageId: Messa
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -497,7 +497,7 @@ func fetchRemoteMessage(postbox: Postbox, source: FetchMessageHistoryHoleSource,
let chats: [Api.Chat]
let users: [Api.User]
switch result {
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -505,7 +505,7 @@ func fetchRemoteMessage(postbox: Postbox, source: FetchMessageHistoryHoleSource,
messages = apiMessages
chats = apiChats
users = apiUsers
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
messages = apiMessages
chats = apiChats
users = apiUsers
@ -574,9 +574,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
switch result {
case let .messages(apiMessages, _, _):
messages = apiMessages
case let .channelMessages(_, _, _, apiMessages, _, _):
case let .channelMessages(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case let .messagesSlice(_, _, _, apiMessages, _, _):
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case .messagesNotModified:
messages = []
@ -604,9 +604,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
switch result {
case let .messages(apiMessages, _, _):
messages = apiMessages
case let .channelMessages(_, _, _, apiMessages, _, _):
case let .channelMessages(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case let .messagesSlice(_, _, _, apiMessages, _, _):
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case .messagesNotModified:
messages = []
@ -628,9 +628,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
switch result {
case let .messages(apiMessages, _, _):
messages = apiMessages
case let .channelMessages(_, _, _, apiMessages, _, _):
case let .channelMessages(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case let .messagesSlice(_, _, _, apiMessages, _, _):
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
messages = apiMessages
case .messagesNotModified:
messages = []

View File

@ -57,11 +57,11 @@ private func fetchMessage(transaction: Transaction, account: Account, messageId:
apiMessages = messages
apiChats = chats
apiUsers = users
case let .messagesSlice(_, _, _, messages, chats, users):
case let .messagesSlice(_, _, _, _, messages, chats, users):
apiMessages = messages
apiChats = chats
apiUsers = users
case let .channelMessages(_, _, _, messages, chats, users):
case let .channelMessages(_, _, _, _, messages, chats, users):
apiMessages = messages
apiChats = chats
apiUsers = users

View File

@ -48,11 +48,11 @@ private func dialogTopMessage(network: Network, postbox: Postbox, peerId: PeerId
}
let apiMessages: [Api.Message]
switch result {
case let .channelMessages(_, _, _, messages, _, _):
case let .channelMessages(_, _, _, _, messages, _, _):
apiMessages = messages
case let .messages(messages, _, _):
apiMessages = messages
case let .messagesSlice(_, _, _, messages, _, _):
case let .messagesSlice(_, _, _, _, messages, _, _):
apiMessages = messages
case .messagesNotModified:
apiMessages = []

View File

@ -80,6 +80,8 @@ func apiUpdatePtsRange(_ update: Api.Update) -> (Int32, Int32)? {
} else {
return nil
}
case let .updatePinnedMessages(_, _, _, pts, ptsCount):
return (pts, ptsCount)
default:
return nil
}

View File

@ -20,107 +20,34 @@ public func requestUpdatePinnedMessage(account: Account, peerId: PeerId, update:
return (transaction.getPeer(peerId), transaction.getPeerCachedData(peerId: peerId))
}
|> mapError { _ -> UpdatePinnedMessageError in
return .generic
}
|> mapToSignal { peer, cachedPeerData -> Signal<Void, UpdatePinnedMessageError> in
guard let peer = peer, let inputPeer = apiInputPeer(peer) else {
return .fail(.generic)
}
if let channel = peer as? TelegramChannel, let inputPeer = apiInputPeer(channel) {
if let channel = peer as? TelegramChannel {
let canManagePin = channel.hasPermission(.pinMessages)
if canManagePin {
var flags: Int32 = 0
let messageId: Int32
switch update {
case let .pin(id, silent):
messageId = id.id
if silent {
flags |= (1 << 0)
}
case let .clear(id):
messageId = id.id
flags |= 1 << 1
}
let request = Api.functions.messages.updatePinnedMessage(flags: flags, peer: inputPeer, id: messageId)
return account.network.request(request)
|> mapError { _ -> UpdatePinnedMessageError in
return .generic
}
|> mapToSignal { updates -> Signal<Void, UpdatePinnedMessageError> in
account.stateManager.addUpdates(updates)
return account.postbox.transaction { transaction in
switch updates {
case let .updates(updates, _, _, _, _):
if updates.isEmpty {
if peerId.namespace == Namespaces.Peer.CloudChannel {
let messageId: MessageId
switch update {
case let .pin(id, _):
messageId = id
case let .clear(id):
messageId = id
}
transaction.updateMessage(messageId, update: { currentMessage in
let storeForwardInfo = currentMessage.forwardInfo.flatMap(StoreMessageForwardInfo.init)
var updatedTags = currentMessage.tags
switch update {
case .pin:
updatedTags.insert(.pinned)
case .clear:
updatedTags.remove(.pinned)
}
if updatedTags == currentMessage.tags {
return .skip
}
return .update(StoreMessage(id: currentMessage.id, globallyUniqueId: currentMessage.globallyUniqueId, groupingKey: currentMessage.groupingKey, threadId: currentMessage.threadId, timestamp: currentMessage.timestamp, flags: StoreMessageFlags(currentMessage.flags), tags: updatedTags, globalTags: currentMessage.globalTags, localTags: currentMessage.localTags, forwardInfo: storeForwardInfo, authorId: currentMessage.author?.id, text: currentMessage.text, attributes: currentMessage.attributes, media: currentMessage.media))
})
}
}
default:
break
}
/*transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
if let current = current as? CachedChannelData {
let pinnedMessageId: MessageId?
switch update {
case let .pin(id, _):
pinnedMessageId = id
case .clear:
pinnedMessageId = nil
}
return current.withUpdatedPinnedMessageId(pinnedMessageId)
} else {
return current
}
})*/
}
|> mapError { _ -> UpdatePinnedMessageError in
return .generic
}
}
} else {
if !canManagePin {
return .fail(.generic)
}
} else {
var canPin = false
if let group = peer as? TelegramGroup {
} else if let group = peer as? TelegramGroup {
switch group.role {
case .creator, .admin:
canPin = true
break
default:
if let defaultBannedRights = group.defaultBannedRights {
canPin = !defaultBannedRights.flags.contains(.banPinMessages)
} else {
canPin = true
if defaultBannedRights.flags.contains(.banPinMessages) {
return .fail(.generic)
}
}
}
} else if let _ = peer as? TelegramUser, let cachedPeerData = cachedPeerData as? CachedUserData {
canPin = cachedPeerData.canPinMessages
if !cachedPeerData.canPinMessages {
return .fail(.generic)
}
if canPin {
}
var flags: Int32 = 0
let messageId: Int32
switch update {
@ -173,40 +100,8 @@ public func requestUpdatePinnedMessage(account: Account, peerId: PeerId, update:
default:
break
}
transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
if let _ = peer as? TelegramGroup {
let current = current as? CachedGroupData ?? CachedGroupData()
let pinnedMessageId: MessageId?
switch update {
case let .pin(id, _):
pinnedMessageId = id
case .clear:
pinnedMessageId = nil
}
return current.withUpdatedPinnedMessageId(pinnedMessageId)
} else if let _ = peer as? TelegramUser {
let current = current as? CachedUserData ?? CachedUserData()
let pinnedMessageId: MessageId?
switch update {
case let .pin(id, _):
pinnedMessageId = id
case .clear:
pinnedMessageId = nil
}
return current.withUpdatedPinnedMessageId(pinnedMessageId)
} else {
return current
}
})
}
|> mapError { _ -> UpdatePinnedMessageError in
return .generic
}
}
} else {
return .fail(.generic)
}
}
}

View File

@ -320,7 +320,7 @@ final class AuthorizedApplicationContext {
}
}
if false, chatIsVisible {
if chatIsVisible {
return
}

View File

@ -3240,7 +3240,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
switch self.chatLocation {
case let .peer(peerId) where peerId.namespace == Namespaces.Peer.CloudChannel:
case let .peer(peerId):
let replyHistory: Signal<ChatHistoryViewUpdate, NoError> = (chatHistoryViewForLocation(ChatHistoryLocationInput(content: .Initial(count: 100), id: 0), context: self.context, chatLocation: .peer(peerId), chatLocationContextHolder: Atomic<ChatLocationContextHolder?>(value: nil), scheduled: false, fixedCombinedReadStates: nil, tagMask: MessageTags.pinned, additionalData: [])
|> castError(Bool.self)
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
@ -3513,16 +3513,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}
case let .peer(peerId):
if peerId.namespace == Namespaces.Peer.CloudChannel {
pinnedMessageId = topPinnedMessage?.message.id
pinnedMessage = topPinnedMessage
} else {
if let pinnedMessageId = pinnedMessageId {
if let message = messages?[pinnedMessageId] {
pinnedMessage = ChatPinnedMessage(message: message, topMessageId: message.id)
}
}
}
}
var pinnedMessageUpdated = false

View File

@ -261,7 +261,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}
}
func update(size: CGSize, contentOrigin: CGPoint, presentationData: ChatPresentationData, graphics: PrincipalThemeEssentialGraphics, backgroundType: ChatMessageBackgroundType, messageSelection: Bool?) {
func update(size: CGSize, contentOrigin: CGPoint, index: Int, presentationData: ChatPresentationData, graphics: PrincipalThemeEssentialGraphics, backgroundType: ChatMessageBackgroundType, messageSelection: Bool?) {
self.currentParams = (size, contentOrigin, presentationData, graphics, backgroundType, messageSelection)
let bounds = CGRect(origin: CGPoint(), size: size)
@ -280,8 +280,14 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
self.selectionBackgroundNode = selectionBackgroundNode
}
var selectionBackgroundFrame = bounds.offsetBy(dx: contentOrigin.x, dy: contentOrigin.y)
if index == 0 && contentOrigin.y > 0.0 {
selectionBackgroundFrame.origin.y -= contentOrigin.y
selectionBackgroundFrame.size.height += contentOrigin.y
}
self.selectionBackgroundNode?.backgroundColor = messageTheme.accentTextColor.withAlphaComponent(0.08)
self.selectionBackgroundNode?.frame = bounds.offsetBy(dx: contentOrigin.x, dy: contentOrigin.y)
self.selectionBackgroundNode?.frame = selectionBackgroundFrame
} else if let selectionBackgroundNode = self.selectionBackgroundNode {
self.selectionBackgroundNode = nil
selectionBackgroundNode.removeFromSupernode()
@ -314,7 +320,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}
private var replyInfoNode: ChatMessageReplyInfoNode?
private var contentContainersMaskView: UIImageView?
private var contentContainersWrapperNode: ASDisplayNode
private var contentContainers: [ContentContainer] = []
private(set) var contentNodes: [ChatMessageBubbleContentNode] = []
@ -382,7 +387,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
case .action, .optionalAction:
return false
case let .openContextMenu(_, selectAll, _):
return selectAll || strongSelf.contentContainers.isEmpty
return selectAll || strongSelf.contentContainers.count < 2
}
}
return true
@ -1781,6 +1786,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
if mosaicIndex == 0 {
if !headerSize.height.isZero {
contentNodesHeight += 7.0
totalContentNodesHeight += 7.0
}
}
@ -2168,6 +2174,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
break
}
var index = 0
var hasSelection = false
for (stableId, relativeFrame, itemSelection) in contentContainerNodeFrames {
if let itemSelection = itemSelection, itemSelection {
@ -2188,6 +2195,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
return false
}
if strongSelf.contentContainers.count < 2 {
return false
}
let location = location.offsetBy(dx: 0.0, dy: strongContainerNode.frame.minY)
if !strongSelf.backgroundNode.frame.contains(location) {
return false
@ -2273,9 +2284,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
contentContainer = container
}
contentContainer?.sourceNode.frame = CGRect(origin: CGPoint(), size: relativeFrame.size)
contentContainer?.sourceNode.contentNode.frame = CGRect(origin: CGPoint(), size: relativeFrame.size)
contentContainer?.containerNode.frame = relativeFrame
let containerFrame = CGRect(origin: relativeFrame.origin, size: CGSize(width: params.width, height: relativeFrame.size.height))
contentContainer?.sourceNode.frame = CGRect(origin: CGPoint(), size: containerFrame.size)
contentContainer?.sourceNode.contentNode.frame = CGRect(origin: CGPoint(), size: containerFrame.size)
// contentContainer?.sourceNode.backgroundColor = UIColor.blue.withAlphaComponent(0.5)
contentContainer?.containerNode.frame = containerFrame
// contentContainer?.containerNode.backgroundColor = UIColor.red.withAlphaComponent(0.5)
contentContainer?.sourceNode.contentRect = CGRect(origin: CGPoint(x: backgroundFrame.minX + incomingOffset, y: 0.0), size: relativeFrame.size)
contentContainer?.containerNode.targetNodeForActivationProgressContentRect = relativeFrame.offsetBy(dx: backgroundFrame.minX + incomingOffset, dy: 0.0)
@ -2284,7 +2299,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
contentContainer?.sourceNode.layoutUpdated?(relativeFrame.size)
}
contentContainer?.update(size: relativeFrame.size, contentOrigin: contentOrigin, presentationData: item.presentationData, graphics: graphics, backgroundType: backgroundType, messageSelection: itemSelection)
contentContainer?.update(size: relativeFrame.size, contentOrigin: contentOrigin, index: index, presentationData: item.presentationData, graphics: graphics, backgroundType: backgroundType, messageSelection: itemSelection)
print("container \(relativeFrame)")
index += 1
}
if hasSelection {
@ -2296,7 +2315,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
strongSelf.contentContainersWrapperNode.view.mask = currentMaskView
}
currentMaskView?.frame = CGRect(origin: contentOrigin, size: backgroundFrame.size).insetBy(dx: -1.0, dy: -1.0)
currentMaskView?.frame = CGRect(origin: CGPoint(x: backgroundFrame.minX, y: 0.0), size: backgroundFrame.size).insetBy(dx: -1.0, dy: -1.0)
currentMaskView?.image = bubbleMaskForType(backgroundType, graphics: graphics)
} else {
strongSelf.contentContainersWrapperNode.view.mask = nil
@ -2327,6 +2346,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
let contextSourceNode: ContextExtractedContentContainingNode = strongSelf.contentContainers.first(where: { $0.contentMessageStableId == contentNodeMessage.stableId })?.sourceNode ?? strongSelf.mainContextSourceNode
print(contextSourceNode.debugDescription)
contextSourceNode.contentNode.addSubnode(contentNode)
contentNode.visibility = strongSelf.visibility
@ -2373,6 +2393,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
let previousContentNodeFrame = contentNode.frame
contentNode.frame = contentNodeFrame
print("frame \(contentNodeFrame.debugDescription)")
if case let .System(duration) = animation {
var animateFrame = false
var animateAlpha = false
@ -3479,7 +3501,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}
override func getMessageContextSourceNode(stableId: UInt32?) -> ContextExtractedContentContainingNode? {
if self.contentContainers.count > 1 {
return self.contentContainers.first(where: { $0.contentMessageStableId == stableId })?.sourceNode ?? self.mainContextSourceNode
} else {
return self.mainContextSourceNode
}
}
override func addAccessoryItemNode(_ accessoryItemNode: ListViewAccessoryItemNode) {