mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various fixes
This commit is contained in:
parent
912a9fa492
commit
e190ea3bf9
@ -873,6 +873,11 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
|
|||||||
updatedState.updateMinAvailableMessage(MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: minId))
|
updatedState.updateMinAvailableMessage(MessageId(peerId: peerId, namespace: Namespaces.Message.Cloud, id: minId))
|
||||||
case let .updateDeleteMessages(messages, _, _):
|
case let .updateDeleteMessages(messages, _, _):
|
||||||
updatedState.deleteMessagesWithGlobalIds(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, _, _):
|
case let .updateEditMessage(apiMessage, _, _):
|
||||||
if let message = StoreMessage(apiMessage: apiMessage), case let .Id(messageId) = message.id {
|
if let message = StoreMessage(apiMessage: apiMessage), case let .Id(messageId) = message.id {
|
||||||
if let preCachedResources = apiMessage.preCachedResources {
|
if let preCachedResources = apiMessage.preCachedResources {
|
||||||
@ -1139,28 +1144,6 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
|
|||||||
channelsToPoll.insert(peerId)
|
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):
|
case let .updatePeerBlocked(peerId, blocked):
|
||||||
let userPeerId = peerId.peerId
|
let userPeerId = peerId.peerId
|
||||||
updatedState.updateCachedPeerData(userPeerId, { current in
|
updatedState.updateCachedPeerData(userPeerId, { current in
|
||||||
@ -1461,9 +1444,9 @@ private func resolveAssociatedMessages(network: Network, state: AccountMutableSt
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(messages, chats, users):
|
case let .messages(messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .messagesSlice(_, _, _, messages, chats, users):
|
case let .messagesSlice(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .channelMessages(_, _, _, messages, chats, users):
|
case let .channelMessages(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return ([], [], [])
|
return ([], [], [])
|
||||||
|
@ -90,11 +90,11 @@ private func fetchWebpage(account: Account, messageId: MessageId) -> Signal<Void
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -988,9 +988,9 @@ public final class AccountViewTracker {
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(messages, chats, users):
|
case let .messages(messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .messagesSlice(_, _, _, messages, chats, users):
|
case let .messagesSlice(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .channelMessages(_, _, _, messages, chats, users):
|
case let .channelMessages(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return ([], [], [])
|
return ([], [], [])
|
||||||
|
@ -491,11 +491,11 @@ private func validateChannelMessagesBatch(postbox: Postbox, network: Network, ac
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -546,11 +546,11 @@ private func validateReplyThreadMessagesBatch(postbox: Postbox, network: Network
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -587,11 +587,11 @@ private func validateScheduledMessagesBatch(postbox: Postbox, network: Network,
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -664,11 +664,11 @@ private func validateBatch(postbox: Postbox, network: Network, transaction: Tran
|
|||||||
|> map { result -> Set<MessageId> in
|
|> map { result -> Set<MessageId> in
|
||||||
let apiMessages: [Api.Message]
|
let apiMessages: [Api.Message]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, messages, _, _):
|
case let .channelMessages(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messages(messages, _, _):
|
case let .messages(messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messagesSlice(_, _, _, messages, _, _):
|
case let .messagesSlice(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return Set()
|
return Set()
|
||||||
@ -912,11 +912,11 @@ private func validateReplyThreadBatch(postbox: Postbox, network: Network, transa
|
|||||||
|> map { result -> Set<MessageId> in
|
|> map { result -> Set<MessageId> in
|
||||||
let apiMessages: [Api.Message]
|
let apiMessages: [Api.Message]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, messages, _, _):
|
case let .channelMessages(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messages(messages, _, _):
|
case let .messages(messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messagesSlice(_, _, _, messages, _, _):
|
case let .messagesSlice(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return Set()
|
return Set()
|
||||||
|
@ -80,9 +80,9 @@ func withResolvedAssociatedMessages<T>(postbox: Postbox, source: FetchMessageHis
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(messages, chats, users):
|
case let .messages(messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .messagesSlice(_, _, _, messages, chats, users):
|
case let .messagesSlice(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .channelMessages(_, _, _, messages, chats, users):
|
case let .channelMessages(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return ([], [], [])
|
return ([], [], [])
|
||||||
@ -436,11 +436,11 @@ func fetchMessageHistoryHole(accountPeerId: PeerId, source: FetchMessageHistoryH
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, pts, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, pts, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -670,11 +670,11 @@ func fetchCallListHole(network: Network, postbox: Postbox, accountPeerId: PeerId
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
case let .messagesSlice(_, _, _, _, messages: apiMessages, chats: apiChats, users: apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
|
@ -57,9 +57,9 @@ public func getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Postb
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(messages, chats, users):
|
case let .messages(messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .messagesSlice(_, _, _, messages, chats, users):
|
case let .messagesSlice(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case let .channelMessages(_, _, _, messages, chats, users):
|
case let .channelMessages(_, _, _, _, messages, chats, users):
|
||||||
return (messages, chats, users)
|
return (messages, chats, users)
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
return ([], [], [])
|
return ([], [], [])
|
||||||
|
@ -37,9 +37,9 @@ public func loadedPeerFromMessage(account: Account, peerId: PeerId, messageId: M
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(_, _, users):
|
case let .messages(_, _, users):
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
case let .messagesSlice(_, _, _, _, _, users):
|
case let .messagesSlice(_, _, _, _, _, _, users):
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
case let .channelMessages(_, _, _, _, _, users):
|
case let .channelMessages(_, _, _, _, _, _, users):
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
apiUsers = []
|
apiUsers = []
|
||||||
|
@ -318,11 +318,7 @@ public func requestProximityNotification(postbox: Postbox, network: Network, mes
|
|||||||
return .complete()
|
return .complete()
|
||||||
}
|
}
|
||||||
let flags: Int32 = 1 << 0
|
let flags: Int32 = 1 << 0
|
||||||
var geoFlags: Int32 = 0
|
return network.request(Api.functions.messages.requestProximityNotification(flags: flags, peer: inputPeer, msgId: messageId.id, maxDistance: distance))
|
||||||
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))
|
|
||||||
|> map(Optional.init)
|
|> map(Optional.init)
|
||||||
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
@ -341,7 +337,7 @@ public func cancelProximityNotification(postbox: Postbox, network: Network, mess
|
|||||||
guard let inputPeer = inputPeer else {
|
guard let inputPeer = inputPeer else {
|
||||||
return .complete()
|
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)
|
|> map(Optional.init)
|
||||||
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
|> `catch` { _ -> Signal<Api.Bool?, NoError> in
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
|
@ -72,7 +72,7 @@ public func requestPeerPhotos(postbox: Postbox, network: Network, peerId: PeerId
|
|||||||
let chats: [Api.Chat]
|
let chats: [Api.Chat]
|
||||||
let users: [Api.User]
|
let users: [Api.User]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -80,7 +80,7 @@ public func requestPeerPhotos(postbox: Postbox, network: Network, peerId: PeerId
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
|
@ -71,7 +71,7 @@ private func mergedState(transaction: Transaction, state: SearchMessagesPeerStat
|
|||||||
let totalCount: Int32
|
let totalCount: Int32
|
||||||
let nextRate: Int32?
|
let nextRate: Int32?
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, count, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, count, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -83,7 +83,7 @@ private func mergedState(transaction: Transaction, state: SearchMessagesPeerStat
|
|||||||
users = apiUsers
|
users = apiUsers
|
||||||
totalCount = Int32(messages.count)
|
totalCount = Int32(messages.count)
|
||||||
nextRate = nil
|
nextRate = nil
|
||||||
case let .messagesSlice(_, count, apiNextRate, apiMessages, apiChats, apiUsers):
|
case let .messagesSlice(_, count, apiNextRate, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -412,7 +412,7 @@ public func downloadMessage(postbox: Postbox, network: Network, messageId: Messa
|
|||||||
let chats: [Api.Chat]
|
let chats: [Api.Chat]
|
||||||
let users: [Api.User]
|
let users: [Api.User]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -420,7 +420,7 @@ public func downloadMessage(postbox: Postbox, network: Network, messageId: Messa
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -497,7 +497,7 @@ func fetchRemoteMessage(postbox: Postbox, source: FetchMessageHistoryHoleSource,
|
|||||||
let chats: [Api.Chat]
|
let chats: [Api.Chat]
|
||||||
let users: [Api.User]
|
let users: [Api.User]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .channelMessages(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -505,7 +505,7 @@ func fetchRemoteMessage(postbox: Postbox, source: FetchMessageHistoryHoleSource,
|
|||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
case let .messagesSlice(_, _, _, apiMessages, apiChats, apiUsers):
|
case let .messagesSlice(_, _, _, _, apiMessages, apiChats, apiUsers):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
chats = apiChats
|
chats = apiChats
|
||||||
users = apiUsers
|
users = apiUsers
|
||||||
@ -574,9 +574,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(apiMessages, _, _):
|
case let .messages(apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .channelMessages(_, _, _, apiMessages, _, _):
|
case let .channelMessages(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .messagesSlice(_, _, _, apiMessages, _, _):
|
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
messages = []
|
messages = []
|
||||||
@ -604,9 +604,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(apiMessages, _, _):
|
case let .messages(apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .channelMessages(_, _, _, apiMessages, _, _):
|
case let .channelMessages(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .messagesSlice(_, _, _, apiMessages, _, _):
|
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
messages = []
|
messages = []
|
||||||
@ -628,9 +628,9 @@ public func searchMessageIdByTimestamp(account: Account, peerId: PeerId, threadI
|
|||||||
switch result {
|
switch result {
|
||||||
case let .messages(apiMessages, _, _):
|
case let .messages(apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .channelMessages(_, _, _, apiMessages, _, _):
|
case let .channelMessages(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case let .messagesSlice(_, _, _, apiMessages, _, _):
|
case let .messagesSlice(_, _, _, _, apiMessages, _, _):
|
||||||
messages = apiMessages
|
messages = apiMessages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
messages = []
|
messages = []
|
||||||
|
@ -57,11 +57,11 @@ private func fetchMessage(transaction: Transaction, account: Account, messageId:
|
|||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
apiChats = chats
|
apiChats = chats
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
case let .messagesSlice(_, _, _, messages, chats, users):
|
case let .messagesSlice(_, _, _, _, messages, chats, users):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
apiChats = chats
|
apiChats = chats
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
case let .channelMessages(_, _, _, messages, chats, users):
|
case let .channelMessages(_, _, _, _, messages, chats, users):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
apiChats = chats
|
apiChats = chats
|
||||||
apiUsers = users
|
apiUsers = users
|
||||||
|
@ -48,11 +48,11 @@ private func dialogTopMessage(network: Network, postbox: Postbox, peerId: PeerId
|
|||||||
}
|
}
|
||||||
let apiMessages: [Api.Message]
|
let apiMessages: [Api.Message]
|
||||||
switch result {
|
switch result {
|
||||||
case let .channelMessages(_, _, _, messages, _, _):
|
case let .channelMessages(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messages(messages, _, _):
|
case let .messages(messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case let .messagesSlice(_, _, _, messages, _, _):
|
case let .messagesSlice(_, _, _, _, messages, _, _):
|
||||||
apiMessages = messages
|
apiMessages = messages
|
||||||
case .messagesNotModified:
|
case .messagesNotModified:
|
||||||
apiMessages = []
|
apiMessages = []
|
||||||
|
@ -80,6 +80,8 @@ func apiUpdatePtsRange(_ update: Api.Update) -> (Int32, Int32)? {
|
|||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
case let .updatePinnedMessages(_, _, _, pts, ptsCount):
|
||||||
|
return (pts, ptsCount)
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -20,193 +20,88 @@ public func requestUpdatePinnedMessage(account: Account, peerId: PeerId, update:
|
|||||||
return (transaction.getPeer(peerId), transaction.getPeerCachedData(peerId: peerId))
|
return (transaction.getPeer(peerId), transaction.getPeerCachedData(peerId: peerId))
|
||||||
}
|
}
|
||||||
|> mapError { _ -> UpdatePinnedMessageError in
|
|> mapError { _ -> UpdatePinnedMessageError in
|
||||||
return .generic
|
|
||||||
}
|
}
|
||||||
|> mapToSignal { peer, cachedPeerData -> Signal<Void, UpdatePinnedMessageError> in
|
|> mapToSignal { peer, cachedPeerData -> Signal<Void, UpdatePinnedMessageError> in
|
||||||
guard let peer = peer, let inputPeer = apiInputPeer(peer) else {
|
guard let peer = peer, let inputPeer = apiInputPeer(peer) else {
|
||||||
return .fail(.generic)
|
return .fail(.generic)
|
||||||
}
|
}
|
||||||
if let channel = peer as? TelegramChannel, let inputPeer = apiInputPeer(channel) {
|
|
||||||
|
if let channel = peer as? TelegramChannel {
|
||||||
let canManagePin = channel.hasPermission(.pinMessages)
|
let canManagePin = channel.hasPermission(.pinMessages)
|
||||||
|
if !canManagePin {
|
||||||
|
return .fail(.generic)
|
||||||
|
}
|
||||||
|
} else if let group = peer as? TelegramGroup {
|
||||||
|
switch group.role {
|
||||||
|
case .creator, .admin:
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
if let defaultBannedRights = group.defaultBannedRights {
|
||||||
|
if defaultBannedRights.flags.contains(.banPinMessages) {
|
||||||
|
return .fail(.generic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if let _ = peer as? TelegramUser, let cachedPeerData = cachedPeerData as? CachedUserData {
|
||||||
|
if !cachedPeerData.canPinMessages {
|
||||||
|
return .fail(.generic)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if canManagePin {
|
var flags: Int32 = 0
|
||||||
var flags: Int32 = 0
|
let messageId: Int32
|
||||||
let messageId: Int32
|
switch update {
|
||||||
switch update {
|
case let .pin(id, silent):
|
||||||
case let .pin(id, silent):
|
messageId = id.id
|
||||||
messageId = id.id
|
if silent {
|
||||||
if silent {
|
flags |= (1 << 0)
|
||||||
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 {
|
|
||||||
return .fail(.generic)
|
|
||||||
}
|
}
|
||||||
} else {
|
case let .clear(id):
|
||||||
var canPin = false
|
messageId = id.id
|
||||||
if let group = peer as? TelegramGroup {
|
flags |= 1 << 1
|
||||||
switch group.role {
|
}
|
||||||
case .creator, .admin:
|
|
||||||
canPin = true
|
let request = Api.functions.messages.updatePinnedMessage(flags: flags, peer: inputPeer, id: messageId)
|
||||||
default:
|
|
||||||
if let defaultBannedRights = group.defaultBannedRights {
|
return account.network.request(request)
|
||||||
canPin = !defaultBannedRights.flags.contains(.banPinMessages)
|
|> mapError { _ -> UpdatePinnedMessageError in
|
||||||
} else {
|
return .generic
|
||||||
canPin = true
|
}
|
||||||
|
|> 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
|
||||||
}
|
}
|
||||||
} else if let _ = peer as? TelegramUser, let cachedPeerData = cachedPeerData as? CachedUserData {
|
|
||||||
canPin = cachedPeerData.canPinMessages
|
|
||||||
}
|
}
|
||||||
if canPin {
|
|> mapError { _ -> UpdatePinnedMessageError in
|
||||||
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 _ = 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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -320,7 +320,7 @@ final class AuthorizedApplicationContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if false, chatIsVisible {
|
if chatIsVisible {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3240,7 +3240,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
||||||
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
||||||
switch self.chatLocation {
|
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: [])
|
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)
|
|> castError(Bool.self)
|
||||||
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
||||||
@ -3513,16 +3513,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .peer(peerId):
|
case let .peer(peerId):
|
||||||
if peerId.namespace == Namespaces.Peer.CloudChannel {
|
pinnedMessageId = topPinnedMessage?.message.id
|
||||||
pinnedMessageId = topPinnedMessage?.message.id
|
pinnedMessage = topPinnedMessage
|
||||||
pinnedMessage = topPinnedMessage
|
|
||||||
} else {
|
|
||||||
if let pinnedMessageId = pinnedMessageId {
|
|
||||||
if let message = messages?[pinnedMessageId] {
|
|
||||||
pinnedMessage = ChatPinnedMessage(message: message, topMessageId: message.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var pinnedMessageUpdated = false
|
var pinnedMessageUpdated = false
|
||||||
|
@ -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)
|
self.currentParams = (size, contentOrigin, presentationData, graphics, backgroundType, messageSelection)
|
||||||
let bounds = CGRect(origin: CGPoint(), size: size)
|
let bounds = CGRect(origin: CGPoint(), size: size)
|
||||||
|
|
||||||
@ -280,8 +280,14 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
self.selectionBackgroundNode = selectionBackgroundNode
|
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?.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 {
|
} else if let selectionBackgroundNode = self.selectionBackgroundNode {
|
||||||
self.selectionBackgroundNode = nil
|
self.selectionBackgroundNode = nil
|
||||||
selectionBackgroundNode.removeFromSupernode()
|
selectionBackgroundNode.removeFromSupernode()
|
||||||
@ -314,7 +320,6 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
}
|
}
|
||||||
private var replyInfoNode: ChatMessageReplyInfoNode?
|
private var replyInfoNode: ChatMessageReplyInfoNode?
|
||||||
|
|
||||||
private var contentContainersMaskView: UIImageView?
|
|
||||||
private var contentContainersWrapperNode: ASDisplayNode
|
private var contentContainersWrapperNode: ASDisplayNode
|
||||||
private var contentContainers: [ContentContainer] = []
|
private var contentContainers: [ContentContainer] = []
|
||||||
private(set) var contentNodes: [ChatMessageBubbleContentNode] = []
|
private(set) var contentNodes: [ChatMessageBubbleContentNode] = []
|
||||||
@ -382,7 +387,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
case .action, .optionalAction:
|
case .action, .optionalAction:
|
||||||
return false
|
return false
|
||||||
case let .openContextMenu(_, selectAll, _):
|
case let .openContextMenu(_, selectAll, _):
|
||||||
return selectAll || strongSelf.contentContainers.isEmpty
|
return selectAll || strongSelf.contentContainers.count < 2
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
@ -1781,6 +1786,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
if mosaicIndex == 0 {
|
if mosaicIndex == 0 {
|
||||||
if !headerSize.height.isZero {
|
if !headerSize.height.isZero {
|
||||||
contentNodesHeight += 7.0
|
contentNodesHeight += 7.0
|
||||||
|
totalContentNodesHeight += 7.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2168,6 +2174,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var index = 0
|
||||||
var hasSelection = false
|
var hasSelection = false
|
||||||
for (stableId, relativeFrame, itemSelection) in contentContainerNodeFrames {
|
for (stableId, relativeFrame, itemSelection) in contentContainerNodeFrames {
|
||||||
if let itemSelection = itemSelection, itemSelection {
|
if let itemSelection = itemSelection, itemSelection {
|
||||||
@ -2188,6 +2195,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if strongSelf.contentContainers.count < 2 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
let location = location.offsetBy(dx: 0.0, dy: strongContainerNode.frame.minY)
|
let location = location.offsetBy(dx: 0.0, dy: strongContainerNode.frame.minY)
|
||||||
if !strongSelf.backgroundNode.frame.contains(location) {
|
if !strongSelf.backgroundNode.frame.contains(location) {
|
||||||
return false
|
return false
|
||||||
@ -2273,9 +2284,13 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
contentContainer = container
|
contentContainer = container
|
||||||
}
|
}
|
||||||
|
|
||||||
contentContainer?.sourceNode.frame = CGRect(origin: CGPoint(), size: relativeFrame.size)
|
let containerFrame = CGRect(origin: relativeFrame.origin, size: CGSize(width: params.width, height: relativeFrame.size.height))
|
||||||
contentContainer?.sourceNode.contentNode.frame = CGRect(origin: CGPoint(), size: relativeFrame.size)
|
contentContainer?.sourceNode.frame = CGRect(origin: CGPoint(), size: containerFrame.size)
|
||||||
contentContainer?.containerNode.frame = relativeFrame
|
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?.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)
|
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?.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 {
|
if hasSelection {
|
||||||
@ -2296,7 +2315,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
strongSelf.contentContainersWrapperNode.view.mask = currentMaskView
|
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)
|
currentMaskView?.image = bubbleMaskForType(backgroundType, graphics: graphics)
|
||||||
} else {
|
} else {
|
||||||
strongSelf.contentContainersWrapperNode.view.mask = nil
|
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
|
let contextSourceNode: ContextExtractedContentContainingNode = strongSelf.contentContainers.first(where: { $0.contentMessageStableId == contentNodeMessage.stableId })?.sourceNode ?? strongSelf.mainContextSourceNode
|
||||||
|
|
||||||
|
print(contextSourceNode.debugDescription)
|
||||||
contextSourceNode.contentNode.addSubnode(contentNode)
|
contextSourceNode.contentNode.addSubnode(contentNode)
|
||||||
|
|
||||||
contentNode.visibility = strongSelf.visibility
|
contentNode.visibility = strongSelf.visibility
|
||||||
@ -2373,6 +2393,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
let previousContentNodeFrame = contentNode.frame
|
let previousContentNodeFrame = contentNode.frame
|
||||||
contentNode.frame = contentNodeFrame
|
contentNode.frame = contentNodeFrame
|
||||||
|
|
||||||
|
print("frame \(contentNodeFrame.debugDescription)")
|
||||||
|
|
||||||
if case let .System(duration) = animation {
|
if case let .System(duration) = animation {
|
||||||
var animateFrame = false
|
var animateFrame = false
|
||||||
var animateAlpha = false
|
var animateAlpha = false
|
||||||
@ -3479,7 +3501,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
}
|
}
|
||||||
|
|
||||||
override func getMessageContextSourceNode(stableId: UInt32?) -> ContextExtractedContentContainingNode? {
|
override func getMessageContextSourceNode(stableId: UInt32?) -> ContextExtractedContentContainingNode? {
|
||||||
return self.contentContainers.first(where: { $0.contentMessageStableId == stableId })?.sourceNode ?? self.mainContextSourceNode
|
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) {
|
override func addAccessoryItemNode(_ accessoryItemNode: ListViewAccessoryItemNode) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user