Fix message in-chat preview in search

Fix top peers not being ready to display when opening search
This commit is contained in:
Ilya Laktyushin 2020-09-28 01:24:36 +04:00
parent f9e2e7a0a1
commit d318b657e8
4 changed files with 55 additions and 12 deletions

View File

@ -122,6 +122,12 @@ public final class ChatListSearchRecentPeersNode: ASDisplayNode {
private var items: [ListViewItem] = [] private var items: [ListViewItem] = []
private var queuedTransitions: [ChatListSearchRecentNodeTransition] = [] private var queuedTransitions: [ChatListSearchRecentNodeTransition] = []
private let ready = Promise<Bool>()
private var didSetReady: Bool = false
public var isReady: Signal<Bool, NoError> {
return self.ready.get()
}
public init(context: AccountContext, theme: PresentationTheme, mode: HorizontalPeerItemMode, strings: PresentationStrings, peerSelected: @escaping (Peer) -> Void, peerContextAction: @escaping (Peer, ASDisplayNode, ContextGesture?) -> Void, isPeerSelected: @escaping (PeerId) -> Bool, share: Bool = false) { public init(context: AccountContext, theme: PresentationTheme, mode: HorizontalPeerItemMode, strings: PresentationStrings, peerSelected: @escaping (Peer) -> Void, peerContextAction: @escaping (Peer, ASDisplayNode, ContextGesture?) -> Void, isPeerSelected: @escaping (PeerId) -> Bool, share: Bool = false) {
self.theme = theme self.theme = theme
self.strings = strings self.strings = strings
@ -207,6 +213,11 @@ public final class ChatListSearchRecentPeersNode: ASDisplayNode {
let transition = preparedRecentPeersTransition(context: context, mode: mode, peerSelected: peerSelected, peerContextAction: peerContextAction, isPeerSelected: isPeerSelected, from: previous.swap(entries), to: entries, firstTime: !animated, animated: animated) let transition = preparedRecentPeersTransition(context: context, mode: mode, peerSelected: peerSelected, peerContextAction: peerContextAction, isPeerSelected: isPeerSelected, from: previous.swap(entries), to: entries, firstTime: !animated, animated: animated)
strongSelf.enqueueTransition(transition) strongSelf.enqueueTransition(transition)
if !strongSelf.didSetReady {
strongSelf.ready.set(.single(true))
strongSelf.didSetReady = true
}
} }
})) }))
if case .actionSheet = mode { if case .actionSheet = mode {

View File

@ -831,7 +831,11 @@ public class ChatListControllerImpl: TelegramBaseController, ChatListController,
return return
} }
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: nil, botStart: nil, mode: .standard(previewing: true)) var subject: ChatControllerSubject?
if case let .search(messageId) = source, let id = messageId {
subject = .message(id: id, highlight: false)
}
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peer.id), subject: subject, botStart: nil, mode: .standard(previewing: true))
chatController.canReadHistory.set(false) chatController.canReadHistory.set(false)
let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node, navigationController: strongSelf.navigationController as? NavigationController)), items: chatContextMenuItems(context: strongSelf.context, peerId: peer.id, promoInfo: nil, source: .search(source), chatListController: strongSelf, joined: false), reactionItems: [], gesture: gesture) let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: node, navigationController: strongSelf.navigationController as? NavigationController)), items: chatContextMenuItems(context: strongSelf.context, peerId: peer.id, promoInfo: nil, source: .search(source), chatListController: strongSelf, joined: false), reactionItems: [], gesture: gesture)
strongSelf.presentInGlobalOverlay(contextController) strongSelf.presentInGlobalOverlay(contextController)

View File

@ -69,6 +69,11 @@ class ChatListRecentPeersListItemNode: ListViewItemNode {
private var item: ChatListRecentPeersListItem? private var item: ChatListRecentPeersListItem?
private let ready = Promise<Bool>()
public var isReady: Signal<Bool, NoError> {
return self.ready.get()
}
required init() { required init() {
self.backgroundNode = ASDisplayNode() self.backgroundNode = ASDisplayNode()
self.backgroundNode.isLayerBacked = true self.backgroundNode.isLayerBacked = true
@ -124,6 +129,7 @@ class ChatListRecentPeersListItemNode: ListViewItemNode {
}, isPeerSelected: { _ in }, isPeerSelected: { _ in
return false return false
}) })
strongSelf.ready.set(peersNode.isReady)
strongSelf.peersNode = peersNode strongSelf.peersNode = peersNode
strongSelf.addSubnode(peersNode) strongSelf.addSubnode(peersNode)
} }

View File

@ -25,6 +25,7 @@ import InstantPageUI
import GalleryData import GalleryData
import AppBundle import AppBundle
import ShimmerEffect import ShimmerEffect
import ChatListSearchRecentPeersNode
private enum ChatListRecentEntryStableId: Hashable { private enum ChatListRecentEntryStableId: Hashable {
case topPeers case topPeers
@ -438,7 +439,7 @@ public enum ChatListSearchEntry: Comparable, Identifiable {
}, contextAction: peerContextAction.flatMap { peerContextAction in }, contextAction: peerContextAction.flatMap { peerContextAction in
return { node, gesture in return { node, gesture in
if let chatPeer = chatPeer, chatPeer.id.namespace != Namespaces.Peer.SecretChat { if let chatPeer = chatPeer, chatPeer.id.namespace != Namespaces.Peer.SecretChat {
peerContextAction(chatPeer, .search, node, gesture) peerContextAction(chatPeer, .search(nil), node, gesture)
} else { } else {
gesture?.cancel() gesture?.cancel()
} }
@ -500,7 +501,7 @@ public enum ChatListSearchEntry: Comparable, Identifiable {
interaction.peerSelected(peer.peer, nil) interaction.peerSelected(peer.peer, nil)
}, contextAction: peerContextAction.flatMap { peerContextAction in }, contextAction: peerContextAction.flatMap { peerContextAction in
return { node, gesture in return { node, gesture in
peerContextAction(peer.peer, .search, node, gesture) peerContextAction(peer.peer, .search(nil), node, gesture)
} }
}) })
case let .message(message, peer, readState, presentationData, totalCount, selected, displayCustomHeader): case let .message(message, peer, readState, presentationData, totalCount, selected, displayCustomHeader):
@ -607,7 +608,7 @@ private struct ChatListSearchMessagesContext {
public enum ChatListSearchContextActionSource { public enum ChatListSearchContextActionSource {
case recentPeers case recentPeers
case recentSearch case recentSearch
case search case search(MessageId?)
} }
public struct ChatListSearchOptions { public struct ChatListSearchOptions {
@ -1221,9 +1222,9 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
return return
} }
switch item.content { switch item.content {
case let .peer(_, peer, _, _, _, _, _, _, _, _, _, _): case let .peer(messages, peer, _, _, _, _, _, _, _, _, _, _):
if let peer = peer.peer { if let peer = peer.peer, let message = messages.first {
peerContextAction(peer, .search, node, gesture) peerContextAction(peer, .search(message.id), node, gesture)
} }
case .groupReference: case .groupReference:
gesture?.cancel() gesture?.cancel()
@ -1370,10 +1371,7 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
} }
strongSelf.searchCurrentMessages = messages strongSelf.searchCurrentMessages = messages
if !strongSelf.didSetReady { if strongSelf.didSetReady && tagMask == nil {
strongSelf.ready.set(.single(true))
strongSelf.didSetReady = true
} else if tagMask == nil {
interaction.updateSuggestedPeers(Array(peers.prefix(8)), strongSelf.key) interaction.updateSuggestedPeers(Array(peers.prefix(8)), strongSelf.key)
} }
} }
@ -1915,7 +1913,26 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
options.insert(.AnimateInsertion) options.insert(.AnimateInsertion)
} }
self.recentListNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { _ in self.recentListNode.transaction(deleteIndices: transition.deletions, insertIndicesAndItems: transition.insertions, updateIndicesAndItems: transition.updates, options: options, updateSizeAndInsets: nil, updateOpaqueState: nil, completion: { [weak self] _ in
guard let strongSelf = self else {
return
}
if !strongSelf.didSetReady && !strongSelf.recentListNode.isHidden {
var ready: Signal<Bool, NoError>?
strongSelf.recentListNode.forEachItemNode { node in
if let node = node as? ChatListSearchRecentPeersNode {
ready = node.isReady
}
}
if let ready = ready {
strongSelf.ready.set(ready)
} else {
strongSelf.ready.set(.single(true))
}
strongSelf.didSetReady = true
}
}) })
} }
} }
@ -2002,6 +2019,11 @@ final class ChatListSearchListPaneNode: ASDisplayNode, ChatListSearchPaneNode {
strongSelf.recentListNode.isHidden = displayingResults || strongSelf.peersFilter.contains(.excludeRecent) strongSelf.recentListNode.isHidden = displayingResults || strongSelf.peersFilter.contains(.excludeRecent)
// strongSelf.dimNode.isHidden = displayingResults // strongSelf.dimNode.isHidden = displayingResults
strongSelf.backgroundColor = !displayingResults && strongSelf.peersFilter.contains(.excludeRecent) ? nil : strongSelf.presentationData.theme.chatList.backgroundColor strongSelf.backgroundColor = !displayingResults && strongSelf.peersFilter.contains(.excludeRecent) ? nil : strongSelf.presentationData.theme.chatList.backgroundColor
if !strongSelf.didSetReady && strongSelf.recentListNode.isHidden {
strongSelf.ready.set(.single(true))
strongSelf.didSetReady = true
}
} }
}) })
} }