From 4d1335d8c6528999606ae12291fae04822ec2eba Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 25 Oct 2022 01:49:10 +0300 Subject: [PATCH 1/2] Add additional usernames indexing --- .../Sources/AccountContext.swift | 2 +- .../Sources/ChannelVisibilityController.swift | 3 +- .../Sources/PeerNameIndexRepresentation.swift | 20 ++++++------- .../SyncCore/SyncCore_TelegramChannel.swift | 6 +++- .../SyncCore/SyncCore_TelegramGroup.swift | 2 +- .../SyncCore_TelegramSecretChat.swift | 2 +- .../SyncCore/SyncCore_TelegramUser.swift | 6 +++- .../TelegramEngine/Peers/AddressNames.swift | 16 ++++++++--- .../Sources/TelegramEngine/Peers/Peer.swift | 28 +++++++++---------- 9 files changed, 51 insertions(+), 34 deletions(-) diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 81fb8a1a4b..ec886c3833 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -599,7 +599,7 @@ public enum ContactListPeer: Equatable { case let .peer(peer, _, _): return peer.indexName case let .deviceContact(_, contact): - return .personName(first: contact.firstName, last: contact.lastName, addressName: "", phoneNumber: "") + return .personName(first: contact.firstName, last: contact.lastName, addressNames: [], phoneNumber: "") } } diff --git a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift index de7c0813d3..6a67d2c401 100644 --- a/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelVisibilityController.swift @@ -1679,7 +1679,8 @@ public func channelVisibilityController(context: AccountContext, updatedPresenta action = presentationData.strings.Channel_Setup_ActivateAlertShow } presentControllerImpl?(textAlertController(context: context, title: title, text: text, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: action, action: { - let _ = context.engine.peers.toggleAddressNameActive(domain: .peer(peerId), name: name, active: true).start(error: { error in + let _ = (context.engine.peers.toggleAddressNameActive(domain: .peer(peerId), name: name, active: true) + |> deliverOnMainQueue).start(error: { error in let errorText: String switch error { case .activeLimitReached: diff --git a/submodules/Postbox/Sources/PeerNameIndexRepresentation.swift b/submodules/Postbox/Sources/PeerNameIndexRepresentation.swift index 942c0498e7..9ea1563628 100644 --- a/submodules/Postbox/Sources/PeerNameIndexRepresentation.swift +++ b/submodules/Postbox/Sources/PeerNameIndexRepresentation.swift @@ -1,27 +1,27 @@ import Foundation public enum PeerIndexNameRepresentation: Equatable { - case title(title: String, addressName: String?) - case personName(first: String, last: String, addressName: String?, phoneNumber: String?) + case title(title: String, addressNames: [String]) + case personName(first: String, last: String, addressNames: [String], phoneNumber: String?) public var isEmpty: Bool { switch self { - case let .title(title, addressName): + case let .title(title, addressNames): if !title.isEmpty { return false } - if let addressName = addressName, !addressName.isEmpty { + if !addressNames.isEmpty { return false } return true - case let .personName(first, last, addressName, phoneNumber): + case let .personName(first, last, addressNames, phoneNumber): if !first.isEmpty { return false } if !last.isEmpty { return false } - if let addressName = addressName, !addressName.isEmpty { + if !addressNames.isEmpty { return false } if let phoneNumber = phoneNumber, !phoneNumber.isEmpty { @@ -72,16 +72,16 @@ extension PeerIndexNameRepresentation { public var indexTokens: [ValueBoxKey] { switch self { - case let .title(title, addressName): + case let .title(title, addressNames): var tokens: [ValueBoxKey] = stringIndexTokens(title, transliteration: .combined) - if let addressName = addressName { + for addressName in addressNames { tokens.append(contentsOf: stringIndexTokens(addressName, transliteration: .none)) } return tokens - case let .personName(first, last, addressName, phoneNumber): + case let .personName(first, last, addressNames, phoneNumber): var tokens: [ValueBoxKey] = stringIndexTokens(first, transliteration: .combined) tokens.append(contentsOf: stringIndexTokens(last, transliteration: .combined)) - if let addressName = addressName { + for addressName in addressNames { tokens.append(contentsOf: stringIndexTokens(addressName, transliteration: .none)) } if let phoneNumber = phoneNumber { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramChannel.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramChannel.swift index a6f9a3f9ea..34452e744a 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramChannel.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramChannel.swift @@ -168,7 +168,11 @@ public final class TelegramChannel: Peer, Equatable { public let usernames: [TelegramPeerUsername] public var indexName: PeerIndexNameRepresentation { - return .title(title: self.title, addressName: self.username) + var addressNames = self.usernames.map { $0.username } + if addressNames.isEmpty, let username = self.username, !username.isEmpty { + addressNames = [username] + } + return .title(title: self.title, addressNames: addressNames) } public var associatedMediaIds: [MediaId]? { return nil } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramGroup.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramGroup.swift index dc5e790fc2..380684adca 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramGroup.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramGroup.swift @@ -89,7 +89,7 @@ public final class TelegramGroup: Peer, Equatable { public let version: Int public var indexName: PeerIndexNameRepresentation { - return .title(title: self.title, addressName: nil) + return .title(title: self.title, addressNames: []) } public var associatedMediaIds: [MediaId]? { return nil } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramSecretChat.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramSecretChat.swift index 5ceb400fed..78150dc1d7 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramSecretChat.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramSecretChat.swift @@ -11,7 +11,7 @@ public final class TelegramSecretChat: Peer, Equatable { public let messageAutoremoveTimeout: Int32? public var indexName: PeerIndexNameRepresentation { - return .title(title: "", addressName: nil) + return .title(title: "", addressNames: []) } public var associatedMediaIds: [MediaId]? { return nil } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift index 3ec0a6f8d5..bc0c3e31cf 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramUser.swift @@ -137,7 +137,11 @@ public final class TelegramUser: Peer, Equatable { } public var indexName: PeerIndexNameRepresentation { - return .personName(first: self.firstName ?? "", last: self.lastName ?? "", addressName: self.username, phoneNumber: self.phone) + var addressNames = self.usernames.map { $0.username } + if addressNames.isEmpty, let username = self.username, !username.isEmpty { + addressNames = [username] + } + return .personName(first: self.firstName ?? "", last: self.lastName ?? "", addressNames: addressNames, phoneNumber: self.phone) } public var associatedMediaIds: [MediaId]? { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/AddressNames.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/AddressNames.swift index 0bb6585333..e68255f7ae 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/AddressNames.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/AddressNames.swift @@ -222,8 +222,12 @@ func _internal_toggleAddressNameActive(account: Account, domain: AddressNameDoma switch domain { case .account: return account.network.request(Api.functions.account.toggleUsername(username: name, active: active ? .boolTrue : .boolFalse), automaticFloodWait: false) - |> mapError { _ -> ToggleAddressNameActiveError in - return .generic + |> mapError { error -> ToggleAddressNameActiveError in + if error.errorDescription == "USERNAMES_ACTIVE_TOO_MUCH" { + return .activeLimitReached + } else { + return .generic + } } |> mapToSignal { result -> Signal in return account.postbox.transaction { transaction -> Void in @@ -276,8 +280,12 @@ func _internal_toggleAddressNameActive(account: Account, domain: AddressNameDoma case let .peer(peerId): if let peer = transaction.getPeer(peerId), let inputChannel = apiInputChannel(peer) { return account.network.request(Api.functions.channels.toggleUsername(channel: inputChannel, username: name, active: active ? .boolTrue : .boolFalse), automaticFloodWait: false) - |> mapError { _ -> ToggleAddressNameActiveError in - return .generic + |> mapError { error -> ToggleAddressNameActiveError in + if error.errorDescription == "USERNAMES_ACTIVE_TOO_MUCH" { + return .activeLimitReached + } else { + return .generic + } } |> mapToSignal { result -> Signal in return account.postbox.transaction { transaction -> Void in diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/Peer.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/Peer.swift index 973605f3e4..f1bf3d4eef 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/Peer.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/Peer.swift @@ -145,27 +145,27 @@ public enum EnginePeer: Equatable { } public enum IndexName: Equatable { - case title(title: String, addressName: String?) - case personName(first: String, last: String, addressName: String?, phoneNumber: String?) + case title(title: String, addressNames: [String]) + case personName(first: String, last: String, addressNames: [String], phoneNumber: String?) public var isEmpty: Bool { switch self { - case let .title(title, addressName): + case let .title(title, addressNames): if !title.isEmpty { return false } - if let addressName = addressName, !addressName.isEmpty { + if !addressNames.isEmpty { return false } return true - case let .personName(first, last, addressName, phoneNumber): + case let .personName(first, last, addressNames, phoneNumber): if !first.isEmpty { return false } if !last.isEmpty { return false } - if let addressName = addressName, !addressName.isEmpty { + if !addressNames.isEmpty { return false } if let phoneNumber = phoneNumber, !phoneNumber.isEmpty { @@ -396,19 +396,19 @@ public extension EnginePeer.Presence { public extension EnginePeer.IndexName { init(_ indexName: PeerIndexNameRepresentation) { switch indexName { - case let .title(title, addressName): - self = .title(title: title, addressName: addressName) - case let .personName(first, last, addressName, phoneNumber): - self = .personName(first: first, last: last, addressName: addressName, phoneNumber: phoneNumber) + case let .title(title, addressNames): + self = .title(title: title, addressNames: addressNames) + case let .personName(first, last, addressNames, phoneNumber): + self = .personName(first: first, last: last, addressNames: addressNames, phoneNumber: phoneNumber) } } func _asIndexName() -> PeerIndexNameRepresentation { switch self { - case let .title(title, addressName): - return .title(title: title, addressName: addressName) - case let .personName(first, last, addressName, phoneNumber): - return .personName(first: first, last: last, addressName: addressName, phoneNumber: phoneNumber) + case let .title(title, addressNames): + return .title(title: title, addressNames: addressNames) + case let .personName(first, last, addressNames, phoneNumber): + return .personName(first: first, last: last, addressNames: addressNames, phoneNumber: phoneNumber) } } From 0ffcbf0b061fb71912f74e4b5575524a1d0de362 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 25 Oct 2022 09:19:53 +0300 Subject: [PATCH 2/2] Fix reactions positioning on outgoing instant videos --- .../TelegramUI/Sources/ChatMessageBubbleItemNode.swift | 6 +++++- .../Sources/ChatMessageInteractiveInstantVideoNode.swift | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift index dbbbca6ba8..67720ac3e7 100644 --- a/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageBubbleItemNode.swift @@ -3097,7 +3097,11 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode if let reactionButtonsSizeAndApply = reactionButtonsSizeAndApply { let reactionButtonsNode = reactionButtonsSizeAndApply.1(animation) - let reactionButtonsFrame = CGRect(origin: CGPoint(x: backgroundFrame.minX + (incoming ? layoutConstants.bubble.contentInsets.left : layoutConstants.bubble.contentInsets.right), y: backgroundFrame.maxY + reactionButtonsOffset + 4.0), size: reactionButtonsSizeAndApply.0) + var reactionButtonsFrame = CGRect(origin: CGPoint(x: backgroundFrame.minX + (incoming ? layoutConstants.bubble.contentInsets.left : layoutConstants.bubble.contentInsets.right), y: backgroundFrame.maxY + reactionButtonsOffset + 4.0), size: reactionButtonsSizeAndApply.0) + if !disablesComments && !incoming { + reactionButtonsFrame.origin.x = backgroundFrame.maxX - reactionButtonsSizeAndApply.0.width - layoutConstants.bubble.contentInsets.left + } + if reactionButtonsNode !== strongSelf.reactionButtonsNode { strongSelf.reactionButtonsNode = reactionButtonsNode reactionButtonsNode.reactionSelected = { [weak strongSelf] value in diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift index fc93674fee..fd0b3e6d64 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -1316,7 +1316,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { return self.view } - if let videoNode = self.videoNode, videoNode.frame.contains(point) { + if let videoNode = self.videoNode, videoNode.view.frame.contains(point) { return self.view } if !self.bounds.contains(point) {