mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Attempt to fix pinned message hiding
This commit is contained in:
parent
a82110eb3a
commit
0d0cd32cb4
@ -327,6 +327,7 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
|
|||||||
|
|
||||||
public final var displayedItemRangeChanged: (ListViewDisplayedItemRange, Any?) -> Void = { _, _ in }
|
public final var displayedItemRangeChanged: (ListViewDisplayedItemRange, Any?) -> Void = { _, _ in }
|
||||||
public private(set) final var displayedItemRange: ListViewDisplayedItemRange = ListViewDisplayedItemRange(loadedRange: nil, visibleRange: nil)
|
public private(set) final var displayedItemRange: ListViewDisplayedItemRange = ListViewDisplayedItemRange(loadedRange: nil, visibleRange: nil)
|
||||||
|
public private(set) final var internalDisplayedItemRange: ListViewDisplayedItemRange?
|
||||||
|
|
||||||
public private(set) final var opaqueTransactionState: Any?
|
public private(set) final var opaqueTransactionState: Any?
|
||||||
|
|
||||||
@ -4097,8 +4098,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
|
|||||||
public func updateVisibleItemRange(force: Bool = false) {
|
public func updateVisibleItemRange(force: Bool = false) {
|
||||||
let currentRange = self.immediateDisplayedItemRange()
|
let currentRange = self.immediateDisplayedItemRange()
|
||||||
|
|
||||||
if currentRange != self.displayedItemRange || force {
|
if currentRange != self.internalDisplayedItemRange || force {
|
||||||
self.displayedItemRange = currentRange
|
self.displayedItemRange = currentRange
|
||||||
|
self.internalDisplayedItemRange = currentRange
|
||||||
self.displayedItemRangeChanged(currentRange, self.opaqueTransactionState)
|
self.displayedItemRangeChanged(currentRange, self.opaqueTransactionState)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5705,6 +5705,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
||||||
var pinnedPeerId: EnginePeer.Id?
|
var pinnedPeerId: EnginePeer.Id?
|
||||||
let threadId = self.chatLocation.threadId
|
let threadId = self.chatLocation.threadId
|
||||||
|
let loadState: Signal<Bool, NoError> = self.chatDisplayNode.historyNode.historyState.get()
|
||||||
|
|> map { state -> Bool in
|
||||||
|
switch state {
|
||||||
|
case .loading:
|
||||||
|
return false
|
||||||
|
default:
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|> distinctUntilChanged
|
||||||
|
|
||||||
switch self.chatLocation {
|
switch self.chatLocation {
|
||||||
case let .peer(id):
|
case let .peer(id):
|
||||||
@ -5720,12 +5730,17 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if let peerId = pinnedPeerId {
|
if let peerId = pinnedPeerId {
|
||||||
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
||||||
|
|
||||||
struct ReferenceMessage {
|
enum ReferenceMessage {
|
||||||
|
struct Loaded {
|
||||||
var id: MessageId
|
var id: MessageId
|
||||||
var minId: MessageId
|
var minId: MessageId
|
||||||
var isScrolled: Bool
|
var isScrolled: Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ready(Loaded)
|
||||||
|
case loading
|
||||||
|
}
|
||||||
|
|
||||||
let referenceMessage: Signal<ReferenceMessage?, NoError>
|
let referenceMessage: Signal<ReferenceMessage?, NoError>
|
||||||
if latest {
|
if latest {
|
||||||
referenceMessage = .single(nil)
|
referenceMessage = .single(nil)
|
||||||
@ -5736,18 +5751,22 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
self.chatDisplayNode.historyNode.topVisibleMessageRange.get()
|
self.chatDisplayNode.historyNode.topVisibleMessageRange.get()
|
||||||
)
|
)
|
||||||
|> map { scrolledToMessageId, topVisibleMessageRange -> ReferenceMessage? in
|
|> map { scrolledToMessageId, topVisibleMessageRange -> ReferenceMessage? in
|
||||||
|
if let topVisibleMessageRange = topVisibleMessageRange, topVisibleMessageRange.isLoading {
|
||||||
|
return .loading
|
||||||
|
}
|
||||||
|
|
||||||
let bottomVisibleMessage = topVisibleMessageRange?.lowerBound.id
|
let bottomVisibleMessage = topVisibleMessageRange?.lowerBound.id
|
||||||
let topVisibleMessage = topVisibleMessageRange?.upperBound.id
|
let topVisibleMessage = topVisibleMessageRange?.upperBound.id
|
||||||
|
|
||||||
if let scrolledToMessageId = scrolledToMessageId {
|
if let scrolledToMessageId = scrolledToMessageId {
|
||||||
if let topVisibleMessage, let bottomVisibleMessage {
|
if let topVisibleMessage, let bottomVisibleMessage {
|
||||||
if scrolledToMessageId.allowedReplacementDirection.contains(.up) && topVisibleMessage < scrolledToMessageId.id {
|
if scrolledToMessageId.allowedReplacementDirection.contains(.up) && topVisibleMessage < scrolledToMessageId.id {
|
||||||
return ReferenceMessage(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false)
|
return .ready(ReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ReferenceMessage(id: scrolledToMessageId.id, minId: scrolledToMessageId.id, isScrolled: true)
|
return .ready(ReferenceMessage.Loaded(id: scrolledToMessageId.id, minId: scrolledToMessageId.id, isScrolled: true))
|
||||||
} else if let topVisibleMessage, let bottomVisibleMessage {
|
} else if let topVisibleMessage, let bottomVisibleMessage {
|
||||||
return ReferenceMessage(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false)
|
return .ready(ReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -5881,7 +5900,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
let result = PinnedHistory(messages: messages, totalCount: messages.count)
|
let result = PinnedHistory(messages: messages, totalCount: messages.count)
|
||||||
|
|
||||||
if let referenceId = referenceMessageValue?.id {
|
if case let .ready(loaded) = referenceMessageValue {
|
||||||
|
let referenceId = loaded.id
|
||||||
|
|
||||||
if viewValue.entries.count < loadCount {
|
if viewValue.entries.count < loadCount {
|
||||||
subscriber.putNext(result)
|
subscriber.putNext(result)
|
||||||
} else if referenceId < viewValue.entries[1].message.id {
|
} else if referenceId < viewValue.entries[1].message.id {
|
||||||
@ -5919,7 +5940,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if !initializedView {
|
if !initializedView {
|
||||||
initializedView = true
|
initializedView = true
|
||||||
//print("reload at \(String(describing: referenceMessage?.id)) disposable \(unsafeBitCast(viewDisposable, to: UInt64.self))")
|
//print("reload at \(String(describing: referenceMessage?.id)) disposable \(unsafeBitCast(viewDisposable, to: UInt64.self))")
|
||||||
viewDisposable.set((pinnedHistorySignal(anchorMessageId: referenceMessage?.id, count: loadCount)
|
var referenceId: MessageId?
|
||||||
|
if case let .ready(loaded) = referenceMessage {
|
||||||
|
referenceId = loaded.id
|
||||||
|
}
|
||||||
|
viewDisposable.set((pinnedHistorySignal(anchorMessageId: referenceId, count: loadCount)
|
||||||
|> deliverOnMainQueue).start(next: { next in
|
|> deliverOnMainQueue).start(next: { next in
|
||||||
view = next
|
view = next
|
||||||
updateState()
|
updateState()
|
||||||
@ -5941,9 +5966,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
topPinnedMessage = combineLatest(queue: .mainQueue(),
|
topPinnedMessage = combineLatest(queue: .mainQueue(),
|
||||||
adjustedReplyHistory,
|
adjustedReplyHistory,
|
||||||
topMessage,
|
topMessage,
|
||||||
referenceMessage
|
referenceMessage,
|
||||||
|
loadState
|
||||||
)
|
)
|
||||||
|> map { pinnedMessages, topMessage, referenceMessage -> ChatPinnedMessage? in
|
|> map { pinnedMessages, topMessage, referenceMessage, loadState -> ChatPinnedMessage? in
|
||||||
|
if !loadState {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
var message: ChatPinnedMessage?
|
var message: ChatPinnedMessage?
|
||||||
|
|
||||||
let topMessageId: MessageId
|
let topMessageId: MessageId
|
||||||
@ -5952,7 +5982,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
topMessageId = topMessage?.message.id ?? pinnedMessages.messages[pinnedMessages.messages.count - 1].message.id
|
topMessageId = topMessage?.message.id ?? pinnedMessages.messages[pinnedMessages.messages.count - 1].message.id
|
||||||
|
|
||||||
if let referenceMessage = referenceMessage, referenceMessage.isScrolled, !pinnedMessages.messages.isEmpty, referenceMessage.id == pinnedMessages.messages[0].message.id, let topMessage = topMessage {
|
if case let .ready(referenceMessage) = referenceMessage, referenceMessage.isScrolled, !pinnedMessages.messages.isEmpty, referenceMessage.id == pinnedMessages.messages[0].message.id, let topMessage = topMessage {
|
||||||
var index = topMessage.index
|
var index = topMessage.index
|
||||||
for message in pinnedMessages.messages {
|
for message in pinnedMessages.messages {
|
||||||
if message.message.id == topMessage.message.id {
|
if message.message.id == topMessage.message.id {
|
||||||
@ -5975,7 +6005,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
var matches = false
|
var matches = false
|
||||||
if message == nil {
|
if message == nil {
|
||||||
matches = true
|
matches = true
|
||||||
} else if let referenceMessage = referenceMessage {
|
} else if case let .ready(referenceMessage) = referenceMessage {
|
||||||
if referenceMessage.isScrolled {
|
if referenceMessage.isScrolled {
|
||||||
if entry.message.id < referenceMessage.id {
|
if entry.message.id < referenceMessage.id {
|
||||||
matches = true
|
matches = true
|
||||||
@ -5989,7 +6019,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
matches = true
|
matches = true
|
||||||
}
|
}
|
||||||
if matches {
|
if matches {
|
||||||
if threadId != nil, let referenceMessage {
|
if threadId != nil, case let .ready(referenceMessage) = referenceMessage {
|
||||||
if referenceMessage.minId <= entry.message.id {
|
if referenceMessage.minId <= entry.message.id {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ struct ChatTopVisibleMessageRange: Equatable {
|
|||||||
var lowerBound: MessageIndex
|
var lowerBound: MessageIndex
|
||||||
var upperBound: MessageIndex
|
var upperBound: MessageIndex
|
||||||
var isLast: Bool
|
var isLast: Bool
|
||||||
|
var isLoading: Bool
|
||||||
}
|
}
|
||||||
|
|
||||||
private let historyMessageCount: Int = 44
|
private let historyMessageCount: Int = 44
|
||||||
@ -591,7 +592,17 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
private var loadedMessagesFromCachedDataDisposable: Disposable?
|
private var loadedMessagesFromCachedDataDisposable: Disposable?
|
||||||
|
|
||||||
let isTopReplyThreadMessageShown = ValuePromise<Bool>(false, ignoreRepeated: true)
|
let isTopReplyThreadMessageShown = ValuePromise<Bool>(false, ignoreRepeated: true)
|
||||||
let topVisibleMessageRange = ValuePromise<ChatTopVisibleMessageRange?>(nil, ignoreRepeated: true)
|
|
||||||
|
private var topVisibleMessageRangeValueInitialized: Bool = false
|
||||||
|
private var topVisibleMessageRangeValue: ChatTopVisibleMessageRange?
|
||||||
|
private func updateTopVisibleMessageRange(_ value: ChatTopVisibleMessageRange?) {
|
||||||
|
if value != self.topVisibleMessageRangeValue || !self.topVisibleMessageRangeValueInitialized {
|
||||||
|
self.topVisibleMessageRangeValueInitialized = true
|
||||||
|
self.topVisibleMessageRangeValue = value
|
||||||
|
self.topVisibleMessageRange.set(.single(value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let topVisibleMessageRange = Promise<ChatTopVisibleMessageRange?>(nil)
|
||||||
|
|
||||||
var isSelectionGestureEnabled = true
|
var isSelectionGestureEnabled = true
|
||||||
|
|
||||||
@ -1951,6 +1962,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
let historyView = transactionState.historyView
|
let historyView = transactionState.historyView
|
||||||
var isTopReplyThreadMessageShownValue = false
|
var isTopReplyThreadMessageShownValue = false
|
||||||
var topVisibleMessageRange: ChatTopVisibleMessageRange?
|
var topVisibleMessageRange: ChatTopVisibleMessageRange?
|
||||||
|
let isLoading = historyView.originalView.isLoading
|
||||||
|
|
||||||
if let visible = displayedRange.visibleRange {
|
if let visible = displayedRange.visibleRange {
|
||||||
let indexRange = (historyView.filteredEntries.count - 1 - visible.lastIndex, historyView.filteredEntries.count - 1 - visible.firstIndex)
|
let indexRange = (historyView.filteredEntries.count - 1 - visible.lastIndex, historyView.filteredEntries.count - 1 - visible.firstIndex)
|
||||||
@ -2069,9 +2081,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
isTopReplyThreadMessageShownValue = true
|
isTopReplyThreadMessageShownValue = true
|
||||||
}
|
}
|
||||||
if let topVisibleMessageRangeValue = topVisibleMessageRange {
|
if let topVisibleMessageRangeValue = topVisibleMessageRange {
|
||||||
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: topVisibleMessageRangeValue.lowerBound, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1)
|
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: topVisibleMessageRangeValue.lowerBound, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1, isLoading: isLoading)
|
||||||
} else {
|
} else {
|
||||||
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: message.index, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1)
|
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: message.index, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1, isLoading: isLoading)
|
||||||
}
|
}
|
||||||
if message.id.namespace == Namespaces.Message.Cloud, self.remainingDynamicAdMessageInterval != nil {
|
if message.id.namespace == Namespaces.Message.Cloud, self.remainingDynamicAdMessageInterval != nil {
|
||||||
allVisibleAnchorMessageIds.append((message.id, nodeIndex))
|
allVisibleAnchorMessageIds.append((message.id, nodeIndex))
|
||||||
@ -2122,9 +2134,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
isTopReplyThreadMessageShownValue = true
|
isTopReplyThreadMessageShownValue = true
|
||||||
}
|
}
|
||||||
if let topVisibleMessageRangeValue = topVisibleMessageRange {
|
if let topVisibleMessageRangeValue = topVisibleMessageRange {
|
||||||
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: topVisibleMessageRangeValue.lowerBound, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1)
|
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: topVisibleMessageRangeValue.lowerBound, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1, isLoading: isLoading)
|
||||||
} else {
|
} else {
|
||||||
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: message.index, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1)
|
topVisibleMessageRange = ChatTopVisibleMessageRange(lowerBound: message.index, upperBound: message.index, isLast: i == historyView.filteredEntries.count - 1, isLoading: isLoading)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let message = messages.first {
|
if let message = messages.first {
|
||||||
@ -2334,7 +2346,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.isTopReplyThreadMessageShown.set(isTopReplyThreadMessageShownValue)
|
self.isTopReplyThreadMessageShown.set(isTopReplyThreadMessageShownValue)
|
||||||
self.topVisibleMessageRange.set(topVisibleMessageRange)
|
self.updateTopVisibleMessageRange(topVisibleMessageRange)
|
||||||
let _ = self.visibleMessageRange.swap(topVisibleMessageRange.flatMap { range in
|
let _ = self.visibleMessageRange.swap(topVisibleMessageRange.flatMap { range in
|
||||||
return VisibleMessageRange(lowerBound: range.lowerBound, upperBound: range.upperBound)
|
return VisibleMessageRange(lowerBound: range.lowerBound, upperBound: range.upperBound)
|
||||||
})
|
})
|
||||||
@ -2964,6 +2976,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
strongSelf.hasActiveTransition = false
|
strongSelf.hasActiveTransition = false
|
||||||
|
|
||||||
strongSelf.dequeueHistoryViewTransitions()
|
strongSelf.dequeueHistoryViewTransitions()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user