User Profile Improvements

This commit is contained in:
Ilya Laktyushin 2022-01-25 06:05:50 +03:00
parent 7e9fea5c48
commit 7ccd563199
21 changed files with 70 additions and 55 deletions

View File

@ -343,7 +343,7 @@ public final class PeerInfoAvatarListItemNode: ASDisplayNode {
self.isReady.set(videoNode.ready |> map { return true }) self.isReady.set(videoNode.ready |> map { return true })
} }
func setup(item: PeerInfoAvatarListItem, progress: Signal<Float?, NoError>? = nil, synchronous: Bool, fullSizeOnly: Bool = false) { func setup(item: PeerInfoAvatarListItem, isMain: Bool, progress: Signal<Float?, NoError>? = nil, synchronous: Bool, fullSizeOnly: Bool = false) {
self.item = item self.item = item
self.progress = progress self.progress = progress
@ -385,7 +385,7 @@ public final class PeerInfoAvatarListItemNode: ASDisplayNode {
id = self.peer.id.id._internalGetInt64Value() id = self.peer.id.id._internalGetInt64Value()
} }
} }
self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations, immediateThumbnailData: immediateThumbnailData, autoFetchFullSize: true, attemptSynchronously: synchronous, skipThumbnail: fullSizeOnly), attemptSynchronously: synchronous, dispatchOnDisplayLink: false) self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations, immediateThumbnailData: immediateThumbnailData, autoFetchFullSize: true, attemptSynchronously: synchronous, skipThumbnail: fullSizeOnly, skipBlurIfLarge: isMain), attemptSynchronously: synchronous, dispatchOnDisplayLink: false)
if let video = videoRepresentations.last, let peerReference = PeerReference(self.peer) { if let video = videoRepresentations.last, let peerReference = PeerReference(self.peer) {
let videoFileReference = FileMediaReference.avatarList(peer: peerReference, media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 0), partialReference: nil, resource: video.representation.resource, previewRepresentations: representations.map { $0.representation }, videoThumbnails: [], immediateThumbnailData: immediateThumbnailData, mimeType: "video/mp4", size: nil, attributes: [.Animated, .Video(duration: 0, size: video.representation.dimensions, flags: [])])) let videoFileReference = FileMediaReference.avatarList(peer: peerReference, media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 0), partialReference: nil, resource: video.representation.resource, previewRepresentations: representations.map { $0.representation }, videoThumbnails: [], immediateThumbnailData: immediateThumbnailData, mimeType: "video/mp4", size: nil, attributes: [.Animated, .Video(duration: 0, size: video.representation.dimensions, flags: [])]))
@ -1157,13 +1157,13 @@ public final class PeerInfoAvatarListContainerNode: ASDisplayNode {
if case .custom = self.items[i], self.updateCustomItemsOnlySynchronously { if case .custom = self.items[i], self.updateCustomItemsOnlySynchronously {
synchronous = true synchronous = true
} }
current.setup(item: self.items[i], synchronous: synchronous && i == self.currentIndex, fullSizeOnly: self.firstFullSizeOnly && i == 0) current.setup(item: self.items[i], isMain: i == 0, synchronous: synchronous && i == self.currentIndex, fullSizeOnly: self.firstFullSizeOnly && i == 0)
} }
} else if let peer = self.peer { } else if let peer = self.peer {
wasAdded = true wasAdded = true
let addedItemNode = PeerInfoAvatarListItemNode(context: self.context, peer: peer) let addedItemNode = PeerInfoAvatarListItemNode(context: self.context, peer: peer)
itemNode = addedItemNode itemNode = addedItemNode
addedItemNode.setup(item: self.items[i], progress: i == 0 ? self.additionalEntryProgress : nil, synchronous: (i == 0 && i == self.currentIndex) || (synchronous && i == self.currentIndex), fullSizeOnly: self.firstFullSizeOnly && i == 0) addedItemNode.setup(item: self.items[i], isMain: i == 0, progress: i == 0 ? self.additionalEntryProgress : nil, synchronous: (i == 0 && i == self.currentIndex) || (synchronous && i == self.currentIndex), fullSizeOnly: self.firstFullSizeOnly && i == 0)
self.itemNodes[self.items[i].id] = addedItemNode self.itemNodes[self.items[i].id] = addedItemNode
self.contentNode.addSubnode(addedItemNode) self.contentNode.addSubnode(addedItemNode)
} }

View File

@ -2335,7 +2335,7 @@ private func avatarGalleryPhotoDatas(account: Account, fileReference: FileMediaR
} }
} }
public func chatAvatarGalleryPhoto(account: Account, representations: [ImageRepresentationWithReference], immediateThumbnailData: Data?, autoFetchFullSize: Bool = false, attemptSynchronously: Bool = false, skipThumbnail: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> { public func chatAvatarGalleryPhoto(account: Account, representations: [ImageRepresentationWithReference], immediateThumbnailData: Data?, autoFetchFullSize: Bool = false, attemptSynchronously: Bool = false, skipThumbnail: Bool = false, skipBlurIfLarge: Bool = false) -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> {
let signal = avatarGalleryPhotoDatas(account: account, representations: representations, immediateThumbnailData: immediateThumbnailData, autoFetchFullSize: autoFetchFullSize, attemptSynchronously: attemptSynchronously) let signal = avatarGalleryPhotoDatas(account: account, representations: representations, immediateThumbnailData: immediateThumbnailData, autoFetchFullSize: autoFetchFullSize, attemptSynchronously: attemptSynchronously)
return signal return signal
@ -2385,7 +2385,8 @@ public func chatAvatarGalleryPhoto(account: Account, representations: [ImageRepr
var blurredThumbnailImage: UIImage? var blurredThumbnailImage: UIImage?
if let thumbnailImage = thumbnailImage, !skipThumbnail { if let thumbnailImage = thumbnailImage, !skipThumbnail {
if max(thumbnailImage.width, thumbnailImage.height) > 200 { let maxThumbnailSide = max(thumbnailImage.width, thumbnailImage.height)
if maxThumbnailSide > 200 || (maxThumbnailSide > 120 && maxThumbnailSide < 200 && skipBlurIfLarge) {
blurredThumbnailImage = UIImage(cgImage: thumbnailImage) blurredThumbnailImage = UIImage(cgImage: thumbnailImage)
} else { } else {
let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height) let thumbnailSize = CGSize(width: thumbnailImage.width, height: thumbnailImage.height)

View File

@ -18,6 +18,7 @@ private final class GroupsInCommonContextImpl {
private let queue: Queue private let queue: Queue
private let account: Account private let account: Account
private let peerId: PeerId private let peerId: PeerId
private let hintGroupInCommon: PeerId?
private let disposable = MetaDisposable() private let disposable = MetaDisposable()
@ -30,10 +31,21 @@ private final class GroupsInCommonContextImpl {
return self.stateValue.get() return self.stateValue.get()
} }
init(queue: Queue, account: Account, peerId: PeerId) { init(queue: Queue, account: Account, peerId: PeerId, hintGroupInCommon: PeerId?) {
self.queue = queue self.queue = queue
self.account = account self.account = account
self.peerId = peerId self.peerId = peerId
self.hintGroupInCommon = hintGroupInCommon
if let hintGroupInCommon = hintGroupInCommon {
let _ = (self.account.postbox.loadedPeerWithId(hintGroupInCommon)
|> deliverOn(self.queue)).start(next: { [weak self] peer in
if let strongSelf = self {
strongSelf.peers.append(RenderedPeer(peer: peer))
strongSelf.pushState()
}
})
}
self.loadMore(limit: 32) self.loadMore(limit: 32)
} }
@ -141,10 +153,10 @@ public final class GroupsInCommonContext {
} }
} }
public init(account: Account, peerId: PeerId) { public init(account: Account, peerId: PeerId, hintGroupInCommon: PeerId? = nil) {
let queue = self.queue let queue = self.queue
self.impl = QueueLocalObject(queue: queue, generate: { self.impl = QueueLocalObject(queue: queue, generate: {
return GroupsInCommonContextImpl(queue: queue, account: account, peerId: peerId) return GroupsInCommonContextImpl(queue: queue, account: account, peerId: peerId, hintGroupInCommon: hintGroupInCommon)
}) })
} }

View File

@ -303,7 +303,7 @@ final class ChatBotInfoItemNode: ListViewItemNode {
case let .url(url, concealed): case let .url(url, concealed):
self.item?.controllerInteraction.openUrl(url, concealed, nil, nil) self.item?.controllerInteraction.openUrl(url, concealed, nil, nil)
case let .peerMention(peerId, _): case let .peerMention(peerId, _):
self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil, peekData: nil), nil) self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil, peekData: nil), nil, nil)
case let .textMention(name): case let .textMention(name):
self.item?.controllerInteraction.openPeerMention(name) self.item?.controllerInteraction.openPeerMention(name)
case let .botCommand(command): case let .botCommand(command):

View File

@ -201,7 +201,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
peerId = message.id.peerId peerId = message.id.peerId
} }
if let botPeer = botPeer, let addressName = botPeer.addressName { if let botPeer = botPeer, let addressName = botPeer.addressName {
self.controllerInteraction.openPeer(peerId, .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: "@\(addressName) \(query)")), subject: nil, peekData: nil), nil) self.controllerInteraction.openPeer(peerId, .chat(textInputState: ChatTextInputState(inputText: NSAttributedString(string: "@\(addressName) \(query)")), subject: nil, peekData: nil), nil, nil)
} }
} }
case .payment: case .payment:
@ -213,7 +213,7 @@ final class ChatButtonKeyboardInputNode: ChatInputNode {
case let .setupPoll(isQuiz): case let .setupPoll(isQuiz):
self.controllerInteraction.openPollCreation(isQuiz) self.controllerInteraction.openPollCreation(isQuiz)
case let .openUserProfile(peerId): case let .openUserProfile(peerId):
self.controllerInteraction.openPeer(peerId, .info, nil) self.controllerInteraction.openPeer(peerId, .info, nil, nil)
} }
if dismissIfOnce { if dismissIfOnce {
if let message = self.message { if let message = self.message {

View File

@ -852,7 +852,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
}, openPeer: { [weak self] peerId in }, openPeer: { [weak self] peerId in
if let strongSelf = self { if let strongSelf = self {
strongSelf.controllerInteraction?.openPeer(peerId, .default, nil) strongSelf.controllerInteraction?.openPeer(peerId, .default, nil, nil)
} }
}, openHashtag: { [weak self] peerName, hashtag in }, openHashtag: { [weak self] peerName, hashtag in
if let strongSelf = self { if let strongSelf = self {
@ -920,7 +920,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
}) })
}))) })))
}, openPeer: { [weak self] id, navigation, fromMessage in }, openPeer: { [weak self] id, navigation, fromMessage, _ in
self?.openPeer(peerId: id, navigation: navigation, fromMessage: fromMessage) self?.openPeer(peerId: id, navigation: navigation, fromMessage: fromMessage)
}, openPeerMention: { [weak self] name in }, openPeerMention: { [weak self] name in
self?.openPeerMention(name) self?.openPeerMention(name)
@ -1141,7 +1141,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return return
} }
strongSelf.openPeer(peerId: id, navigation: .default, fromMessage: message) strongSelf.openPeer(peerId: id, navigation: .default, fromMessage: MessageReference(message))
}) })
}))) })))
@ -10804,7 +10804,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
case let .mention(peerId, mention): case let .mention(peerId, mention):
switch action { switch action {
case .tap: case .tap:
strongSelf.controllerInteraction?.openPeer(peerId, .default, nil) strongSelf.controllerInteraction?.openPeer(peerId, .default, nil, nil)
case .longTap: case .longTap:
strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil) strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil)
} }
@ -10892,7 +10892,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
case let .mention(peerId, mention): case let .mention(peerId, mention):
switch action { switch action {
case .tap: case .tap:
strongSelf.controllerInteraction?.openPeer(peerId, .default, nil) strongSelf.controllerInteraction?.openPeer(peerId, .default, nil, nil)
case .longTap: case .longTap:
strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil) strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil)
} }
@ -11001,7 +11001,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
case let .mention(peerId, mention): case let .mention(peerId, mention):
switch action { switch action {
case .tap: case .tap:
strongSelf.controllerInteraction?.openPeer(peerId, .default, nil) strongSelf.controllerInteraction?.openPeer(peerId, .default, nil, nil)
case .longTap: case .longTap:
strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil) strongSelf.controllerInteraction?.longTap(.peerMention(peerId, mention), nil)
} }
@ -12804,7 +12804,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}) })
} }
private func openPeer(peerId: PeerId?, navigation: ChatControllerInteractionNavigateToPeer, fromMessage: Message?, expandAvatar: Bool = false) { private func openPeer(peerId: PeerId?, navigation: ChatControllerInteractionNavigateToPeer, fromMessage: MessageReference?, expandAvatar: Bool = false) {
let _ = self.presentVoiceMessageDiscardAlert(action: { let _ = self.presentVoiceMessageDiscardAlert(action: {
if case let .peer(currentPeerId) = self.chatLocation, peerId == currentPeerId { if case let .peer(currentPeerId) = self.chatLocation, peerId == currentPeerId {
switch navigation { switch navigation {
@ -12834,8 +12834,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
switch navigation { switch navigation {
case .info, .default: case .info, .default:
let peerSignal: Signal<Peer?, NoError> let peerSignal: Signal<Peer?, NoError>
if let fromMessage = fromMessage { if let messageId = fromMessage?.id {
peerSignal = loadedPeerFromMessage(account: self.context.account, peerId: peerId, messageId: fromMessage.id) peerSignal = loadedPeerFromMessage(account: self.context.account, peerId: peerId, messageId: messageId)
} else { } else {
peerSignal = self.context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init) peerSignal = self.context.account.postbox.loadedPeerWithId(peerId) |> map(Optional.init)
} }

View File

@ -53,7 +53,7 @@ public enum ChatControllerInteractionReaction {
public final class ChatControllerInteraction { public final class ChatControllerInteraction {
let openMessage: (Message, ChatControllerInteractionOpenMessageMode) -> Bool let openMessage: (Message, ChatControllerInteractionOpenMessageMode) -> Bool
let openPeer: (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void let openPeer: (PeerId?, ChatControllerInteractionNavigateToPeer, MessageReference?, Peer?) -> Void
let openPeerMention: (String) -> Void let openPeerMention: (String) -> Void
let openMessageContextMenu: (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void let openMessageContextMenu: (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void
let updateMessageReaction: (Message, ChatControllerInteractionReaction) -> Void let updateMessageReaction: (Message, ChatControllerInteractionReaction) -> Void
@ -152,7 +152,7 @@ public final class ChatControllerInteraction {
init( init(
openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool, openMessage: @escaping (Message, ChatControllerInteractionOpenMessageMode) -> Bool,
openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, Message?) -> Void, openPeer: @escaping (PeerId?, ChatControllerInteractionNavigateToPeer, MessageReference?, Peer?) -> Void,
openPeerMention: @escaping (String) -> Void, openPeerMention: @escaping (String) -> Void,
openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void, openMessageContextMenu: @escaping (Message, Bool, ASDisplayNode, CGRect, UIGestureRecognizer?) -> Void,
openMessageReactionContextMenu: @escaping (Message, ContextExtractedContentContainingNode, ContextGesture?, String) -> Void, openMessageReactionContextMenu: @escaping (Message, ContextExtractedContentContainingNode, ContextGesture?, String) -> Void,
@ -327,7 +327,7 @@ public final class ChatControllerInteraction {
static var `default`: ChatControllerInteraction { static var `default`: ChatControllerInteraction {
return ChatControllerInteraction(openMessage: { _, _ in return ChatControllerInteraction(openMessage: { _, _ in
return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in return false }, openPeer: { _, _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in
}, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { _, _, _, _, _, _, _ in return false }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in
}, presentController: { _, _ in }, presentControllerInCurrent: { _, _ in }, navigationController: { }, presentController: { _, _ in }, presentControllerInCurrent: { _, _ in }, navigationController: {
return nil return nil

View File

@ -1282,14 +1282,14 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
actions.insert(.custom(ChatReadReportContextItem(context: context, message: message, stats: readStats, action: { c, f, stats in actions.insert(.custom(ChatReadReportContextItem(context: context, message: message, stats: readStats, action: { c, f, stats in
if reactionCount == 0, let stats = stats, stats.peers.count == 1 { if reactionCount == 0, let stats = stats, stats.peers.count == 1 {
c.dismiss(completion: { c.dismiss(completion: {
controllerInteraction.openPeer(stats.peers[0].id, .default, nil) controllerInteraction.openPeer(stats.peers[0].id, .default, nil, nil)
}) })
} else if (stats != nil && !stats!.peers.isEmpty) || reactionCount != 0 { } else if (stats != nil && !stats!.peers.isEmpty) || reactionCount != 0 {
c.pushItems(items: .single(ContextController.Items(content: .custom(ReactionListContextMenuContent(context: context, availableReactions: availableReactions, message: EngineMessage(message), reaction: nil, readStats: stats, back: { [weak c] in c.pushItems(items: .single(ContextController.Items(content: .custom(ReactionListContextMenuContent(context: context, availableReactions: availableReactions, message: EngineMessage(message), reaction: nil, readStats: stats, back: { [weak c] in
c?.popItems() c?.popItems()
}, openPeer: { [weak c] id in }, openPeer: { [weak c] id in
c?.dismiss(completion: { c?.dismiss(completion: {
controllerInteraction.openPeer(id, .default, nil) controllerInteraction.openPeer(id, .default, nil, nil)
}) })
})), tip: nil))) })), tip: nil)))
} else { } else {

View File

@ -3127,7 +3127,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
return return
} }
} }
item.controllerInteraction.openPeer(openPeerId, navigate, item.message) item.controllerInteraction.openPeer(openPeerId, navigate, MessageReference(item.message), item.message.peers[openPeerId])
} }
} }
}) })
@ -3182,7 +3182,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
} }
item.controllerInteraction.navigateToMessage(item.message.id, sourceMessageId) item.controllerInteraction.navigateToMessage(item.message.id, sourceMessageId)
} else if let peer = forwardInfo.source ?? forwardInfo.author { } else if let peer = forwardInfo.source ?? forwardInfo.author {
item.controllerInteraction.openPeer(peer.id, peer is TelegramUser ? .info : .chat(textInputState: nil, subject: nil, peekData: nil), nil) item.controllerInteraction.openPeer(peer.id, peer is TelegramUser ? .info : .chat(textInputState: nil, subject: nil, peekData: nil), nil, nil)
} else if let _ = forwardInfo.authorSignature { } else if let _ = forwardInfo.authorSignature {
item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, forwardInfoNode, nil) item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, forwardInfoNode, nil)
} }
@ -3221,7 +3221,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}) })
case let .peerMention(peerId, _): case let .peerMention(peerId, _):
return .action({ return .action({
self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil, peekData: nil), nil) self.item?.controllerInteraction.openPeer(peerId, .chat(textInputState: nil, subject: nil, peekData: nil), nil, nil)
}) })
case let .textMention(name): case let .textMention(name):
return .action({ return .action({

View File

@ -502,9 +502,9 @@ final class ChatMessageAvatarHeaderNode: ListViewItemHeaderNode {
self.controllerInteraction.displayMessageTooltip(id, self.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, self, self.avatarNode.frame) self.controllerInteraction.displayMessageTooltip(id, self.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, self, self.avatarNode.frame)
} else { } else {
if let channel = self.peer as? TelegramChannel, case .broadcast = channel.info { if let channel = self.peer as? TelegramChannel, case .broadcast = channel.info {
self.controllerInteraction.openPeer(self.peerId, .chat(textInputState: nil, subject: nil, peekData: nil), nil) self.controllerInteraction.openPeer(self.peerId, .chat(textInputState: nil, subject: nil, peekData: nil), self.messageReference, nil)
} else { } else {
self.controllerInteraction.openPeer(self.peerId, .info, nil) self.controllerInteraction.openPeer(self.peerId, .info, self.messageReference, nil)
} }
} }
} }

View File

@ -935,7 +935,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
return return
} }
} }
item.controllerInteraction.openPeer(openPeerId, navigate, item.message) item.controllerInteraction.openPeer(openPeerId, navigate, MessageReference(item.message), item.message.peers[openPeerId])
} }
}) })
} }
@ -967,7 +967,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
} }
item.controllerInteraction.navigateToMessage(item.message.id, sourceMessageId) item.controllerInteraction.navigateToMessage(item.message.id, sourceMessageId)
} else if let peer = forwardInfo.source ?? forwardInfo.author { } else if let peer = forwardInfo.source ?? forwardInfo.author {
item.controllerInteraction.openPeer(peer.id, peer is TelegramUser ? .info : .chat(textInputState: nil, subject: nil, peekData: nil), nil) item.controllerInteraction.openPeer(peer.id, peer is TelegramUser ? .info : .chat(textInputState: nil, subject: nil, peekData: nil), nil, nil)
} else if let _ = forwardInfo.authorSignature { } else if let _ = forwardInfo.authorSignature {
item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, forwardInfoNode, nil) item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_ForwardAuthorHiddenTooltip, forwardInfoNode, nil)
} }

View File

@ -853,7 +853,7 @@ public class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol
case .setupPoll: case .setupPoll:
break break
case let .openUserProfile(peerId): case let .openUserProfile(peerId):
item.controllerInteraction.openPeer(peerId, .info, nil) item.controllerInteraction.openPeer(peerId, .info, nil, nil)
} }
} }
} }

View File

@ -1136,7 +1136,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame) item.controllerInteraction.displayMessageTooltip(item.message.id, item.presentationData.strings.Conversation_PrivateChannelTooltip, self, avatarNode.frame)
} }
} }
item.controllerInteraction.openPeer(openPeerId, navigate, item.message) item.controllerInteraction.openPeer(openPeerId, navigate, MessageReference(item.message), item.message.peers[openPeerId])
} }
}) })
} }

View File

@ -76,7 +76,7 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode {
} }
navigationData = .chat(textInputState: nil, subject: subject, peekData: nil) navigationData = .chat(textInputState: nil, subject: subject, peekData: nil)
} }
item.controllerInteraction.openPeer(id, navigationData, nil) item.controllerInteraction.openPeer(id, navigationData, nil, nil)
case let .join(_, joinHash): case let .join(_, joinHash):
item.controllerInteraction.openJoinLink(joinHash) item.controllerInteraction.openJoinLink(joinHash)
} }

View File

@ -247,9 +247,9 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
}, gallerySource: gallerySource)) }, gallerySource: gallerySource))
} }
return false return false
}, openPeer: { [weak self] peerId, _, message in }, openPeer: { [weak self] peerId, _, message, peer in
if let peerId = peerId, peerId != context.account.peerId { if let peerId = peerId, peerId != context.account.peerId {
self?.openPeer(peerId: peerId, peer: message?.peers[peerId]) self?.openPeer(peerId: peerId, peer: peer)
} }
}, openPeerMention: { [weak self] name in }, openPeerMention: { [weak self] name in
self?.openPeerMention(name) self?.openPeerMention(name)

View File

@ -108,7 +108,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode {
var selectStickerImpl: ((FileMediaReference, ASDisplayNode, CGRect) -> Bool)? var selectStickerImpl: ((FileMediaReference, ASDisplayNode, CGRect) -> Bool)?
self.controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in self.controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in
return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in return false }, openPeer: { _, _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in
}, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in }, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in
}, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in
}, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, _, _, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in }, tapMessage: nil, clickThroughMessage: { }, toggleMessagesSelection: { _, _ in }, sendCurrentMessage: { _ in }, sendMessage: { _ in }, sendSticker: { fileReference, _, _, _, _, node, rect in return selectStickerImpl?(fileReference, node, rect) ?? false }, sendGif: { _, _, _, _, _ in return false }, sendBotContextResultAsGif: { _, _, _, _, _ in return false }, requestMessageActionCallback: { _, _, _, _ in }, requestMessageActionUrlAuth: { _, _ in }, activateSwitchInline: { _, _ in }, openUrl: { _, _, _, _ in }, shareCurrentLocation: {}, shareAccountContact: {}, sendBotCommand: { _, _ in }, openInstantPage: { _, _ in }, openWallpaper: { _ in }, openTheme: { _ in }, openHashtag: { _, _ in }, updateInputState: { _ in }, updateInputMode: { _ in }, openMessageShareMenu: { _ in

View File

@ -66,7 +66,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu
} else { } else {
return false return false
} }
}, openPeer: { _, _, _ in }, openPeer: { _, _, _, _ in
}, openPeerMention: { _ in }, openPeerMention: { _ in
}, openMessageContextMenu: { _, _, _, _, _ in }, openMessageContextMenu: { _, _, _, _, _ in
}, openMessageReactionContextMenu: { _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in

View File

@ -178,7 +178,7 @@ final class PeerInfoGroupsInCommonPaneNode: ASDisplayNode, PeerInfoPaneNode {
} }
} }
let transaction = preparedTransition(from: self.currentEntries, to: entries, context: self.context, presentationData: presentationData, openPeer: { [weak self] peer in let transaction = preparedTransition(from: self.currentEntries, to: entries, context: self.context, presentationData: presentationData, openPeer: { [weak self] peer in
self?.chatControllerInteraction.openPeer(peer.id, .default, nil) self?.chatControllerInteraction.openPeer(peer.id, .default, nil, nil)
}, openPeerContextAction: { [weak self] peer, node, gesture in }, openPeerContextAction: { [weak self] peer, node, gesture in
self?.openPeerContextAction(peer, node, gesture) self?.openPeerContextAction(peer, node, gesture)
}) })

View File

@ -446,7 +446,7 @@ func peerInfoScreenSettingsData(context: AccountContext, peerId: EnginePeer.Id,
} }
} }
func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, isSettings: Bool, ignoreGroupInCommon: PeerId?, existingRequestsContext: PeerInvitationImportersContext?) -> Signal<PeerInfoScreenData, NoError> { func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, isSettings: Bool, hintGroupInCommon: PeerId?, existingRequestsContext: PeerInvitationImportersContext?) -> Signal<PeerInfoScreenData, NoError> {
return peerInfoScreenInputData(context: context, peerId: peerId, isSettings: isSettings) return peerInfoScreenInputData(context: context, peerId: peerId, isSettings: isSettings)
|> mapToSignal { inputData -> Signal<PeerInfoScreenData, NoError> in |> mapToSignal { inputData -> Signal<PeerInfoScreenData, NoError> in
switch inputData { switch inputData {
@ -471,7 +471,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
case let .user(userPeerId, secretChatId, kind): case let .user(userPeerId, secretChatId, kind):
let groupsInCommon: GroupsInCommonContext? let groupsInCommon: GroupsInCommonContext?
if [.user, .bot].contains(kind) { if [.user, .bot].contains(kind) {
groupsInCommon = GroupsInCommonContext(account: context.account, peerId: userPeerId) groupsInCommon = GroupsInCommonContext(account: context.account, peerId: userPeerId, hintGroupInCommon: hintGroupInCommon)
} else { } else {
groupsInCommon = nil groupsInCommon = nil
} }
@ -591,6 +591,8 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
if cachedData.commonGroupCount != 0 { if cachedData.commonGroupCount != 0 {
availablePanes?.append(.groupsInCommon) availablePanes?.append(.groupsInCommon)
} }
} else if hintGroupInCommon != nil {
availablePanes = [.groupsInCommon]
} }
return PeerInfoScreenData( return PeerInfoScreenData(

View File

@ -1607,7 +1607,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
} }
private var didSetReady = false private var didSetReady = false
init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool, ignoreGroupInCommon: PeerId?, requestsContext: PeerInvitationImportersContext?) { init(controller: PeerInfoScreenImpl, context: AccountContext, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool, hintGroupInCommon: PeerId?, requestsContext: PeerInvitationImportersContext?) {
self.controller = controller self.controller = controller
self.context = context self.context = context
self.peerId = peerId self.peerId = peerId
@ -1758,7 +1758,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
return false return false
} }
return strongSelf.openMessage(id: message.id) return strongSelf.openMessage(id: message.id)
}, openPeer: { [weak self] id, navigation, _ in }, openPeer: { [weak self] id, navigation, _, _ in
if let id = id { if let id = id {
self?.openPeer(peerId: id, navigation: navigation) self?.openPeer(peerId: id, navigation: navigation)
} }
@ -2285,7 +2285,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
let items: [ContextMenuItem] = [ let items: [ContextMenuItem] = [
.action(ContextMenuActionItem(text: presentationData.strings.Conversation_LinkDialogOpen, icon: { _ in nil }, action: { _, f in .action(ContextMenuActionItem(text: presentationData.strings.Conversation_LinkDialogOpen, icon: { _ in nil }, action: { _, f in
f(.dismissWithoutContent) f(.dismissWithoutContent)
self?.chatInterfaceInteraction.openPeer(peer.id, .default, nil) self?.chatInterfaceInteraction.openPeer(peer.id, .default, nil, nil)
})) }))
] ]
let contextController = ContextController(account: strongSelf.context.account, presentationData: presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture) let contextController = ContextController(account: strongSelf.context.account, presentationData: presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture)
@ -2893,7 +2893,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
})) }))
} }
} else { } else {
screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, ignoreGroupInCommon: ignoreGroupInCommon, existingRequestsContext: requestsContext) screenData = peerInfoScreenData(context: context, peerId: peerId, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, isSettings: self.isSettings, hintGroupInCommon: hintGroupInCommon, existingRequestsContext: requestsContext)
self.headerNode.displayAvatarContextMenu = { [weak self] node, gesture in self.headerNode.displayAvatarContextMenu = { [weak self] node, gesture in
guard let strongSelf = self, let peer = strongSelf.data?.peer else { guard let strongSelf = self, let peer = strongSelf.data?.peer else {
@ -7001,7 +7001,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
private let nearbyPeerDistance: Int32? private let nearbyPeerDistance: Int32?
private let callMessages: [Message] private let callMessages: [Message]
private let isSettings: Bool private let isSettings: Bool
private let ignoreGroupInCommon: PeerId? private let hintGroupInCommon: PeerId?
private weak var requestsContext: PeerInvitationImportersContext? private weak var requestsContext: PeerInvitationImportersContext?
fileprivate var presentationData: PresentationData fileprivate var presentationData: PresentationData
@ -7027,7 +7027,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)? private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)?
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool = false, ignoreGroupInCommon: PeerId? = nil, requestsContext: PeerInvitationImportersContext? = nil) { public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peerId: PeerId, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, nearbyPeerDistance: Int32?, callMessages: [Message], isSettings: Bool = false, hintGroupInCommon: PeerId? = nil, requestsContext: PeerInvitationImportersContext? = nil) {
self.context = context self.context = context
self.updatedPresentationData = updatedPresentationData self.updatedPresentationData = updatedPresentationData
self.peerId = peerId self.peerId = peerId
@ -7036,7 +7036,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
self.nearbyPeerDistance = nearbyPeerDistance self.nearbyPeerDistance = nearbyPeerDistance
self.callMessages = callMessages self.callMessages = callMessages
self.isSettings = isSettings self.isSettings = isSettings
self.ignoreGroupInCommon = ignoreGroupInCommon self.hintGroupInCommon = hintGroupInCommon
self.requestsContext = requestsContext self.requestsContext = requestsContext
self.presentationData = updatedPresentationData?.0 ?? context.sharedContext.currentPresentationData.with { $0 } self.presentationData = updatedPresentationData?.0 ?? context.sharedContext.currentPresentationData.with { $0 }
@ -7324,7 +7324,7 @@ public final class PeerInfoScreenImpl: ViewController, PeerInfoScreen {
} }
override public func loadDisplayNode() { override public func loadDisplayNode() {
self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, callMessages: self.callMessages, isSettings: self.isSettings, ignoreGroupInCommon: self.ignoreGroupInCommon, requestsContext: requestsContext) self.displayNode = PeerInfoScreenNode(controller: self, context: self.context, peerId: self.peerId, avatarInitiallyExpanded: self.avatarInitiallyExpanded, isOpenedFromChat: self.isOpenedFromChat, nearbyPeerDistance: self.nearbyPeerDistance, callMessages: self.callMessages, isSettings: self.isSettings, hintGroupInCommon: self.hintGroupInCommon, requestsContext: requestsContext)
self.controllerNode.accountsAndPeers.set(self.accountsAndPeers.get() |> map { $0.1 }) self.controllerNode.accountsAndPeers.set(self.accountsAndPeers.get() |> map { $0.1 })
self.controllerNode.activeSessionsContextAndCount.set(self.activeSessionsContextAndCount.get()) self.controllerNode.activeSessionsContextAndCount.set(self.activeSessionsContextAndCount.get())
self.cachedDataPromise.set(self.controllerNode.cachedDataPromise.get()) self.cachedDataPromise.set(self.controllerNode.cachedDataPromise.get())

View File

@ -1239,7 +1239,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
let controllerInteraction: ChatControllerInteraction let controllerInteraction: ChatControllerInteraction
controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in controllerInteraction = ChatControllerInteraction(openMessage: { _, _ in
return false }, openPeer: { _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in return false }, openPeer: { _, _, _, _ in }, openPeerMention: { _ in }, openMessageContextMenu: { _, _, _, _, _ in }, openMessageReactionContextMenu: { _, _, _, _ in
}, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in }, updateMessageReaction: { _, _ in }, activateMessagePinch: { _ in
}, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in }, openMessageContextActions: { _, _, _, _ in }, navigateToMessage: { _, _ in }, navigateToMessageStandalone: { _ in
}, tapMessage: { message in }, tapMessage: { message in
@ -1437,7 +1437,7 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation
} else if peer is TelegramUser { } else if peer is TelegramUser {
var nearbyPeerDistance: Int32? var nearbyPeerDistance: Int32?
var callMessages: [Message] = [] var callMessages: [Message] = []
var ignoreGroupInCommon: PeerId? var hintGroupInCommon: PeerId?
switch mode { switch mode {
case let .nearbyPeer(distance): case let .nearbyPeer(distance):
nearbyPeerDistance = distance nearbyPeerDistance = distance
@ -1446,9 +1446,9 @@ private func peerInfoControllerImpl(context: AccountContext, updatedPresentation
case .generic: case .generic:
break break
case let .group(id): case let .group(id):
ignoreGroupInCommon = id hintGroupInCommon = id
} }
return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nearbyPeerDistance, callMessages: callMessages, ignoreGroupInCommon: ignoreGroupInCommon) return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nearbyPeerDistance, callMessages: callMessages, hintGroupInCommon: hintGroupInCommon)
} else if peer is TelegramSecretChat { } else if peer is TelegramSecretChat {
return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, callMessages: []) return PeerInfoScreenImpl(context: context, updatedPresentationData: updatedPresentationData, peerId: peer.id, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, nearbyPeerDistance: nil, callMessages: [])
} }