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 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?
|
||||
|
||||
@ -4097,8 +4098,9 @@ open class ListView: ASDisplayNode, UIScrollViewAccessibilityDelegate, UIGesture
|
||||
public func updateVisibleItemRange(force: Bool = false) {
|
||||
let currentRange = self.immediateDisplayedItemRange()
|
||||
|
||||
if currentRange != self.displayedItemRange || force {
|
||||
if currentRange != self.internalDisplayedItemRange || force {
|
||||
self.displayedItemRange = currentRange
|
||||
self.internalDisplayedItemRange = currentRange
|
||||
self.displayedItemRangeChanged(currentRange, self.opaqueTransactionState)
|
||||
}
|
||||
}
|
||||
|
@ -5705,6 +5705,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
private func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
||||
var pinnedPeerId: EnginePeer.Id?
|
||||
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 {
|
||||
case let .peer(id):
|
||||
@ -5720,10 +5730,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
if let peerId = pinnedPeerId {
|
||||
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
||||
|
||||
struct ReferenceMessage {
|
||||
var id: MessageId
|
||||
var minId: MessageId
|
||||
var isScrolled: Bool
|
||||
enum ReferenceMessage {
|
||||
struct Loaded {
|
||||
var id: MessageId
|
||||
var minId: MessageId
|
||||
var isScrolled: Bool
|
||||
}
|
||||
|
||||
case ready(Loaded)
|
||||
case loading
|
||||
}
|
||||
|
||||
let referenceMessage: Signal<ReferenceMessage?, NoError>
|
||||
@ -5736,18 +5751,22 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
self.chatDisplayNode.historyNode.topVisibleMessageRange.get()
|
||||
)
|
||||
|> map { scrolledToMessageId, topVisibleMessageRange -> ReferenceMessage? in
|
||||
if let topVisibleMessageRange = topVisibleMessageRange, topVisibleMessageRange.isLoading {
|
||||
return .loading
|
||||
}
|
||||
|
||||
let bottomVisibleMessage = topVisibleMessageRange?.lowerBound.id
|
||||
let topVisibleMessage = topVisibleMessageRange?.upperBound.id
|
||||
|
||||
if let scrolledToMessageId = scrolledToMessageId {
|
||||
if let topVisibleMessage, let bottomVisibleMessage {
|
||||
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 {
|
||||
return ReferenceMessage(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false)
|
||||
return .ready(ReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
@ -5881,7 +5900,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
}
|
||||
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 {
|
||||
subscriber.putNext(result)
|
||||
} else if referenceId < viewValue.entries[1].message.id {
|
||||
@ -5919,7 +5940,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
if !initializedView {
|
||||
initializedView = true
|
||||
//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
|
||||
view = next
|
||||
updateState()
|
||||
@ -5941,9 +5966,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
topPinnedMessage = combineLatest(queue: .mainQueue(),
|
||||
adjustedReplyHistory,
|
||||
topMessage,
|
||||
referenceMessage
|
||||
referenceMessage,
|
||||
loadState
|
||||
)
|
||||
|> map { pinnedMessages, topMessage, referenceMessage -> ChatPinnedMessage? in
|
||||
|> map { pinnedMessages, topMessage, referenceMessage, loadState -> ChatPinnedMessage? in
|
||||
if !loadState {
|
||||
return nil
|
||||
}
|
||||
|
||||
var message: ChatPinnedMessage?
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
for message in pinnedMessages.messages {
|
||||
if message.message.id == topMessage.message.id {
|
||||
@ -5975,7 +6005,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
var matches = false
|
||||
if message == nil {
|
||||
matches = true
|
||||
} else if let referenceMessage = referenceMessage {
|
||||
} else if case let .ready(referenceMessage) = referenceMessage {
|
||||
if referenceMessage.isScrolled {
|
||||
if entry.message.id < referenceMessage.id {
|
||||
matches = true
|
||||
@ -5989,7 +6019,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
matches = true
|
||||
}
|
||||
if matches {
|
||||
if threadId != nil, let referenceMessage {
|
||||
if threadId != nil, case let .ready(referenceMessage) = referenceMessage {
|
||||
if referenceMessage.minId <= entry.message.id {
|
||||
continue
|
||||
}
|
||||
|
@ -32,6 +32,7 @@ struct ChatTopVisibleMessageRange: Equatable {
|
||||
var lowerBound: MessageIndex
|
||||
var upperBound: MessageIndex
|
||||
var isLast: Bool
|
||||
var isLoading: Bool
|
||||
}
|
||||
|
||||
private let historyMessageCount: Int = 44
|
||||
@ -591,7 +592,17 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||
private var loadedMessagesFromCachedDataDisposable: Disposable?
|
||||
|
||||
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
|
||||
|
||||
@ -1951,6 +1962,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||
let historyView = transactionState.historyView
|
||||
var isTopReplyThreadMessageShownValue = false
|
||||
var topVisibleMessageRange: ChatTopVisibleMessageRange?
|
||||
let isLoading = historyView.originalView.isLoading
|
||||
|
||||
if let visible = displayedRange.visibleRange {
|
||||
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
|
||||
}
|
||||
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 {
|
||||
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 {
|
||||
allVisibleAnchorMessageIds.append((message.id, nodeIndex))
|
||||
@ -2122,9 +2134,9 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||
isTopReplyThreadMessageShownValue = true
|
||||
}
|
||||
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 {
|
||||
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 {
|
||||
@ -2334,7 +2346,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||
}
|
||||
}
|
||||
self.isTopReplyThreadMessageShown.set(isTopReplyThreadMessageShownValue)
|
||||
self.topVisibleMessageRange.set(topVisibleMessageRange)
|
||||
self.updateTopVisibleMessageRange(topVisibleMessageRange)
|
||||
let _ = self.visibleMessageRange.swap(topVisibleMessageRange.flatMap { range in
|
||||
return VisibleMessageRange(lowerBound: range.lowerBound, upperBound: range.upperBound)
|
||||
})
|
||||
@ -2964,6 +2976,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
||||
}
|
||||
|
||||
strongSelf.hasActiveTransition = false
|
||||
|
||||
strongSelf.dequeueHistoryViewTransitions()
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user