mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Cleanup for the next update
This commit is contained in:
parent
75fd530f00
commit
7cc2e15e09
@ -102,7 +102,7 @@ dispatch_block_t fetchImage(BuildConfig *buildConfig, AccountProxyConnection * _
|
|||||||
apiEnvironment.langPack = @"ios";
|
apiEnvironment.langPack = @"ios";
|
||||||
apiEnvironment.layer = @([serialization currentLayer]);
|
apiEnvironment.layer = @([serialization currentLayer]);
|
||||||
apiEnvironment.disableUpdates = true;
|
apiEnvironment.disableUpdates = true;
|
||||||
apiEnvironment = [apiEnvironment withUpdatedLangPackCode:@"en"];
|
apiEnvironment = [apiEnvironment withUpdatedLangPackCode:@""];
|
||||||
|
|
||||||
if (proxyConnection != nil) {
|
if (proxyConnection != nil) {
|
||||||
apiEnvironment = [apiEnvironment withUpdatedSocksProxySettings:[[MTSocksProxySettings alloc] initWithIp:proxyConnection.host port:(uint16_t)proxyConnection.port username:proxyConnection.username password:proxyConnection.password secret:proxyConnection.secret]];
|
apiEnvironment = [apiEnvironment withUpdatedSocksProxySettings:[[MTSocksProxySettings alloc] initWithIp:proxyConnection.host port:(uint16_t)proxyConnection.port username:proxyConnection.username password:proxyConnection.password secret:proxyConnection.secret]];
|
||||||
|
@ -56,7 +56,7 @@ func unreadMessages(account: Account) -> Signal<[INMessage], NoError> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !isMuted && hasUnread {
|
if !isMuted && hasUnread {
|
||||||
signals.append(account.postbox.aroundMessageHistoryViewForLocation(.peer(index.messageIndex.id.peerId), anchor: .upperBound, count: 10, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: Set(), tagMask: nil, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: .combinedLocation)
|
signals.append(account.postbox.aroundMessageHistoryViewForLocation(.peer(index.messageIndex.id.peerId), anchor: .upperBound, count: 10, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: Set(), tagMask: nil, appendMessagesFromTheSameGroup: false, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: .combinedLocation)
|
||||||
|> take(1)
|
|> take(1)
|
||||||
|> map { view -> [INMessage] in
|
|> map { view -> [INMessage] in
|
||||||
var messages: [INMessage] = []
|
var messages: [INMessage] = []
|
||||||
|
@ -1974,6 +1974,7 @@
|
|||||||
|
|
||||||
"Conversation.PinMessageAlertGroup" = "Pin this message and notify all members of the group?";
|
"Conversation.PinMessageAlertGroup" = "Pin this message and notify all members of the group?";
|
||||||
"Conversation.PinMessageAlert.OnlyPin" = "Only Pin";
|
"Conversation.PinMessageAlert.OnlyPin" = "Only Pin";
|
||||||
|
"Conversation.PinMessageAlert.PinAndNotifyMembers" = "Pin and notify all members";
|
||||||
|
|
||||||
"Conversation.UnpinMessageAlert" = "Would you like to unpin this message?";
|
"Conversation.UnpinMessageAlert" = "Would you like to unpin this message?";
|
||||||
|
|
||||||
|
@ -1175,4 +1175,8 @@ public final class AnimatedStickerNode: ASDisplayNode {
|
|||||||
public func updateLayout(size: CGSize) {
|
public func updateLayout(size: CGSize) {
|
||||||
self.renderer?.frame = CGRect(origin: CGPoint(), size: size)
|
self.renderer?.frame = CGRect(origin: CGPoint(), size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
|
self.renderer?.setOverlayColor(color, animated: animated)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,4 +9,6 @@ public enum AnimationRendererFrameType {
|
|||||||
|
|
||||||
protocol AnimationRenderer {
|
protocol AnimationRenderer {
|
||||||
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, completion: @escaping () -> Void)
|
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, completion: @escaping () -> Void)
|
||||||
|
|
||||||
|
func setOverlayColor(_ color: UIColor?, animated: Bool)
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,9 @@ import SwiftSignalKit
|
|||||||
import YuvConversion
|
import YuvConversion
|
||||||
|
|
||||||
final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
||||||
|
private var highlightedContentNode: ASDisplayNode?
|
||||||
|
private var highlightedColor: UIColor?
|
||||||
|
|
||||||
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, completion: @escaping () -> Void) {
|
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, completion: @escaping () -> Void) {
|
||||||
queue.async { [weak self] in
|
queue.async { [weak self] in
|
||||||
switch type {
|
switch type {
|
||||||
@ -31,8 +34,57 @@ final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||||||
|
|
||||||
Queue.mainQueue().async {
|
Queue.mainQueue().async {
|
||||||
self?.contents = image?.cgImage
|
self?.contents = image?.cgImage
|
||||||
|
self?.updateHighlightedContentNode()
|
||||||
completion()
|
completion()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func updateHighlightedContentNode() {
|
||||||
|
guard let highlightedContentNode = self.highlightedContentNode, let highlightedColor = self.highlightedColor, let contents = self.contents, CFGetTypeID(contents as CFTypeRef) == CGImage.typeID else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
(highlightedContentNode.view as! UIImageView).image = UIImage(cgImage: contents as! CGImage).withRenderingMode(.alwaysTemplate)
|
||||||
|
highlightedContentNode.tintColor = highlightedColor
|
||||||
|
}
|
||||||
|
|
||||||
|
func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
|
var updated = false
|
||||||
|
if let current = self.highlightedColor, let color = color {
|
||||||
|
updated = !current.isEqual(color)
|
||||||
|
} else if (self.highlightedColor != nil) != (color != nil) {
|
||||||
|
updated = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if !updated {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
self.highlightedColor = color
|
||||||
|
|
||||||
|
if let _ = color {
|
||||||
|
if let highlightedContentNode = self.highlightedContentNode {
|
||||||
|
highlightedContentNode.alpha = 1.0
|
||||||
|
} else {
|
||||||
|
let highlightedContentNode = ASDisplayNode(viewBlock: {
|
||||||
|
return UIImageView()
|
||||||
|
}, didLoad: nil)
|
||||||
|
highlightedContentNode.displaysAsynchronously = false
|
||||||
|
|
||||||
|
self.highlightedContentNode = highlightedContentNode
|
||||||
|
highlightedContentNode.frame = self.bounds
|
||||||
|
self.addSubnode(highlightedContentNode)
|
||||||
|
}
|
||||||
|
self.updateHighlightedContentNode()
|
||||||
|
} else if let highlightedContentNode = self.highlightedContentNode {
|
||||||
|
highlightedContentNode.alpha = 0.0
|
||||||
|
highlightedContentNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, completion: { [weak self] completed in
|
||||||
|
guard let strongSelf = self, completed else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
strongSelf.highlightedContentNode?.removeFromSupernode()
|
||||||
|
strongSelf.highlightedContentNode = nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,7 +440,7 @@ public class GalleryController: ViewController, StandalonePresentableController
|
|||||||
} else {
|
} else {
|
||||||
namespaces = .not(Namespaces.Message.allScheduled)
|
namespaces = .not(Namespaces.Message.allScheduled)
|
||||||
}
|
}
|
||||||
return context.account.postbox.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), anchor: .index(message!.index), count: 50, clipHoles: false, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tags, namespaces: namespaces, orderStatistics: [.combinedLocation])
|
return context.account.postbox.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), anchor: .index(message!.index), count: 50, clipHoles: false, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tags, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: [.combinedLocation])
|
||||||
|> mapToSignal { (view, _, _) -> Signal<GalleryMessageHistoryView?, NoError> in
|
|> mapToSignal { (view, _, _) -> Signal<GalleryMessageHistoryView?, NoError> in
|
||||||
let mapped = GalleryMessageHistoryView.view(view)
|
let mapped = GalleryMessageHistoryView.view(view)
|
||||||
return .single(mapped)
|
return .single(mapped)
|
||||||
@ -1029,7 +1029,7 @@ public class GalleryController: ViewController, StandalonePresentableController
|
|||||||
} else {
|
} else {
|
||||||
namespaces = .not(Namespaces.Message.allScheduled)
|
namespaces = .not(Namespaces.Message.allScheduled)
|
||||||
}
|
}
|
||||||
let signal = strongSelf.context.account.postbox.aroundMessageHistoryViewForLocation(strongSelf.context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), anchor: .index(reloadAroundIndex), count: 50, clipHoles: false, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, namespaces: namespaces, orderStatistics: [.combinedLocation])
|
let signal = strongSelf.context.account.postbox.aroundMessageHistoryViewForLocation(strongSelf.context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), anchor: .index(reloadAroundIndex), count: 50, clipHoles: false, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: [.combinedLocation])
|
||||||
|> mapToSignal { (view, _, _) -> Signal<GalleryMessageHistoryView?, NoError> in
|
|> mapToSignal { (view, _, _) -> Signal<GalleryMessageHistoryView?, NoError> in
|
||||||
let mapped = GalleryMessageHistoryView.view(view)
|
let mapped = GalleryMessageHistoryView.view(view)
|
||||||
return .single(mapped)
|
return .single(mapped)
|
||||||
|
@ -629,7 +629,9 @@ static int32_t fixedTimeDifferenceValue = 0;
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (MTLogEnabled()) {
|
if (MTLogEnabled()) {
|
||||||
MTLog(@"[MTContext#%x: auth info updated for %d selector %d to %@]", (int)self, datacenterId, selector, authInfo);
|
MTDatacenterAuthInfo *persistentInfo = _datacenterAuthInfoById[authInfoMapIntegerKey((int32_t)datacenterId, MTDatacenterAuthInfoSelectorPersistent)];
|
||||||
|
|
||||||
|
MTLog(@"[MTContext#%x: auth info updated for %d selector %d to %@ (persistent key id is %llu)]", (int)self, datacenterId, selector, authInfo, persistentInfo.authKeyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
[_keychain setObject:_datacenterAuthInfoById forKey:@"datacenterAuthInfoById" group:@"persistent"];
|
[_keychain setObject:_datacenterAuthInfoById forKey:@"datacenterAuthInfoById" group:@"persistent"];
|
||||||
|
@ -292,7 +292,7 @@
|
|||||||
if (initializeApi && _apiEnvironment != nil)
|
if (initializeApi && _apiEnvironment != nil)
|
||||||
{
|
{
|
||||||
if (MTLogEnabled()) {
|
if (MTLogEnabled()) {
|
||||||
MTLog(@"apiEnvironment: %d", (int)_apiEnvironment.systemCode.length);
|
MTLog(@"apiEnvironment: %@", [_apiEnvironment apiInitializationHash]);
|
||||||
}
|
}
|
||||||
MTBuffer *buffer = [[MTBuffer alloc] init];
|
MTBuffer *buffer = [[MTBuffer alloc] init];
|
||||||
|
|
||||||
|
@ -313,6 +313,7 @@ public enum HistoryViewInputAnchor: Equatable {
|
|||||||
final class MutableMessageHistoryView {
|
final class MutableMessageHistoryView {
|
||||||
private(set) var peerIds: MessageHistoryViewInput
|
private(set) var peerIds: MessageHistoryViewInput
|
||||||
let tag: MessageTags?
|
let tag: MessageTags?
|
||||||
|
private let appendMessagesFromTheSameGroup: Bool
|
||||||
let namespaces: MessageIdNamespaces
|
let namespaces: MessageIdNamespaces
|
||||||
private let orderStatistics: MessageHistoryViewOrderStatistics
|
private let orderStatistics: MessageHistoryViewOrderStatistics
|
||||||
private let clipHoles: Bool
|
private let clipHoles: Bool
|
||||||
@ -331,7 +332,7 @@ final class MutableMessageHistoryView {
|
|||||||
|
|
||||||
fileprivate var isAddedToChatList: Bool
|
fileprivate var isAddedToChatList: Bool
|
||||||
|
|
||||||
init(postbox: Postbox, orderStatistics: MessageHistoryViewOrderStatistics, clipHoles: Bool, peerIds: MessageHistoryViewInput, anchor inputAnchor: HistoryViewInputAnchor, combinedReadStates: MessageHistoryViewReadState?, transientReadStates: MessageHistoryViewReadState?, tag: MessageTags?, namespaces: MessageIdNamespaces, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry], getMessageCountInRange: (MessageIndex, MessageIndex) -> Int32) {
|
init(postbox: Postbox, orderStatistics: MessageHistoryViewOrderStatistics, clipHoles: Bool, peerIds: MessageHistoryViewInput, anchor inputAnchor: HistoryViewInputAnchor, combinedReadStates: MessageHistoryViewReadState?, transientReadStates: MessageHistoryViewReadState?, tag: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, count: Int, topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?], additionalDatas: [AdditionalMessageHistoryViewDataEntry], getMessageCountInRange: (MessageIndex, MessageIndex) -> Int32) {
|
||||||
self.anchor = inputAnchor
|
self.anchor = inputAnchor
|
||||||
|
|
||||||
self.orderStatistics = orderStatistics
|
self.orderStatistics = orderStatistics
|
||||||
@ -340,6 +341,7 @@ final class MutableMessageHistoryView {
|
|||||||
self.combinedReadStates = combinedReadStates
|
self.combinedReadStates = combinedReadStates
|
||||||
self.transientReadStates = transientReadStates
|
self.transientReadStates = transientReadStates
|
||||||
self.tag = tag
|
self.tag = tag
|
||||||
|
self.appendMessagesFromTheSameGroup = appendMessagesFromTheSameGroup
|
||||||
self.namespaces = namespaces
|
self.namespaces = namespaces
|
||||||
self.fillCount = count
|
self.fillCount = count
|
||||||
self.topTaggedMessages = topTaggedMessages
|
self.topTaggedMessages = topTaggedMessages
|
||||||
@ -354,12 +356,12 @@ final class MutableMessageHistoryView {
|
|||||||
self.isAddedToChatList = postbox.chatListTable.getPeerChatListIndex(peerId: input.peerId) != nil
|
self.isAddedToChatList = postbox.chatListTable.getPeerChatListIndex(peerId: input.peerId) != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
self.state = HistoryViewState(postbox: postbox, inputAnchor: inputAnchor, tag: tag, namespaces: namespaces, statistics: self.orderStatistics, halfLimit: count + 1, locations: peerIds)
|
self.state = HistoryViewState(postbox: postbox, inputAnchor: inputAnchor, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: self.orderStatistics, halfLimit: count + 1, locations: peerIds)
|
||||||
if case let .loading(loadingState) = self.state {
|
if case let .loading(loadingState) = self.state {
|
||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, namespaces: namespaces, statistics: self.orderStatistics, halfLimit: count + 1, locations: peerIds, postbox: postbox, holes: holes))
|
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, appendMessagesFromTheSameGroup: self.appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: self.orderStatistics, halfLimit: count + 1, locations: peerIds, postbox: postbox, holes: holes))
|
||||||
self.sampledState = self.state.sample(postbox: postbox, clipHoles: self.clipHoles)
|
self.sampledState = self.state.sample(postbox: postbox, clipHoles: self.clipHoles)
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
break
|
break
|
||||||
@ -371,12 +373,12 @@ final class MutableMessageHistoryView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func reset(postbox: Postbox) {
|
private func reset(postbox: Postbox) {
|
||||||
self.state = HistoryViewState(postbox: postbox, inputAnchor: self.anchor, tag: self.tag, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds)
|
self.state = HistoryViewState(postbox: postbox, inputAnchor: self.anchor, tag: self.tag, appendMessagesFromTheSameGroup: self.appendMessagesFromTheSameGroup, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds)
|
||||||
if case let .loading(loadingState) = self.state {
|
if case let .loading(loadingState) = self.state {
|
||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, appendMessagesFromTheSameGroup: self.appendMessagesFromTheSameGroup, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -385,7 +387,7 @@ final class MutableMessageHistoryView {
|
|||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, appendMessagesFromTheSameGroup: self.appendMessagesFromTheSameGroup, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -521,8 +523,23 @@ final class MutableMessageHistoryView {
|
|||||||
for operation in operationSet {
|
for operation in operationSet {
|
||||||
switch operation {
|
switch operation {
|
||||||
case let .InsertMessage(message):
|
case let .InsertMessage(message):
|
||||||
|
var matchesTag = false
|
||||||
|
if unwrappedTag.isEmpty {
|
||||||
|
matchesTag = true
|
||||||
|
} else if message.tags.contains(unwrappedTag) {
|
||||||
|
matchesTag = true
|
||||||
|
} else if self.appendMessagesFromTheSameGroup, let _ = message.groupInfo {
|
||||||
|
if let group = postbox.messageHistoryTable.getMessageGroup(at: message.index, limit: 20) {
|
||||||
|
for groupMessage in group {
|
||||||
|
if groupMessage.tags.contains(unwrappedTag) {
|
||||||
|
matchesTag = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var matches = false
|
var matches = false
|
||||||
if unwrappedTag.isEmpty || message.tags.contains(unwrappedTag) {
|
if matchesTag {
|
||||||
if threadId == nil || message.threadId == threadId {
|
if threadId == nil || message.threadId == threadId {
|
||||||
if self.namespaces.contains(message.id.namespace) {
|
if self.namespaces.contains(message.id.namespace) {
|
||||||
matches = true
|
matches = true
|
||||||
@ -613,7 +630,7 @@ final class MutableMessageHistoryView {
|
|||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
self.state = .loaded(HistoryViewLoadedState(anchor: anchor, tag: self.tag, appendMessagesFromTheSameGroup: self.appendMessagesFromTheSameGroup, namespaces: self.namespaces, statistics: self.orderStatistics, halfLimit: self.fillCount + 1, locations: self.peerIds, postbox: postbox, holes: holes))
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,17 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public enum MessageHistoryInput: Equatable, Hashable {
|
public enum MessageHistoryInput: Equatable, Hashable {
|
||||||
case automatic(MessageTags?)
|
public struct Automatic: Equatable, Hashable {
|
||||||
|
public var tag: MessageTags
|
||||||
|
public var appendMessagesFromTheSameGroup: Bool
|
||||||
|
|
||||||
|
public init(tag: MessageTags, appendMessagesFromTheSameGroup: Bool) {
|
||||||
|
self.tag = tag
|
||||||
|
self.appendMessagesFromTheSameGroup = appendMessagesFromTheSameGroup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case automatic(Automatic?)
|
||||||
case external(MessageHistoryViewExternalInput, MessageTags?)
|
case external(MessageHistoryViewExternalInput, MessageTags?)
|
||||||
|
|
||||||
public func hash(into hasher: inout Hasher) {
|
public func hash(into hasher: inout Hasher) {
|
||||||
@ -17,8 +27,48 @@ public enum MessageHistoryInput: Equatable, Hashable {
|
|||||||
private extension MessageHistoryInput {
|
private extension MessageHistoryInput {
|
||||||
func fetch(postbox: Postbox, peerId: PeerId, namespace: MessageId.Namespace, from fromIndex: MessageIndex, includeFrom: Bool, to toIndex: MessageIndex, limit: Int) -> [IntermediateMessage] {
|
func fetch(postbox: Postbox, peerId: PeerId, namespace: MessageId.Namespace, from fromIndex: MessageIndex, includeFrom: Bool, to toIndex: MessageIndex, limit: Int) -> [IntermediateMessage] {
|
||||||
switch self {
|
switch self {
|
||||||
case let .automatic(tag):
|
case let .automatic(automatic):
|
||||||
return postbox.messageHistoryTable.fetch(peerId: peerId, namespace: namespace, tag: tag, threadId: nil, from: fromIndex, includeFrom: includeFrom, to: toIndex, limit: limit)
|
var items = postbox.messageHistoryTable.fetch(peerId: peerId, namespace: namespace, tag: automatic?.tag, threadId: nil, from: fromIndex, includeFrom: includeFrom, to: toIndex, limit: limit)
|
||||||
|
if let automatic = automatic, automatic.appendMessagesFromTheSameGroup {
|
||||||
|
enum Direction {
|
||||||
|
case lowToHigh
|
||||||
|
case highToLow
|
||||||
|
}
|
||||||
|
func processItem(index: Int, direction: Direction) {
|
||||||
|
guard let _ = items[index].groupInfo else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if var group = postbox.messageHistoryTable.getMessageGroup(at: items[index].index, limit: 20), group.count > 1 {
|
||||||
|
switch direction {
|
||||||
|
case .lowToHigh:
|
||||||
|
group.sort(by: { lhs, rhs in
|
||||||
|
return lhs.index < rhs.index
|
||||||
|
})
|
||||||
|
case .highToLow:
|
||||||
|
group.sort(by: { lhs, rhs in
|
||||||
|
return lhs.index > rhs.index
|
||||||
|
})
|
||||||
|
}
|
||||||
|
items.replaceSubrange(index ..< index + 1, with: group)
|
||||||
|
switch direction {
|
||||||
|
case .lowToHigh:
|
||||||
|
items.removeFirst(group.count - 1)
|
||||||
|
case .highToLow:
|
||||||
|
items.removeLast(group.count - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if fromIndex < toIndex {
|
||||||
|
for i in 0 ..< items.count {
|
||||||
|
processItem(index: i, direction: .lowToHigh)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i in (0 ..< items.count).reversed() {
|
||||||
|
processItem(index: i, direction: .highToLow)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return items
|
||||||
case let .external(input, tag):
|
case let .external(input, tag):
|
||||||
return postbox.messageHistoryTable.fetch(peerId: peerId, namespace: namespace, tag: tag, threadId: input.threadId, from: fromIndex, includeFrom: includeFrom, to: toIndex, limit: limit)
|
return postbox.messageHistoryTable.fetch(peerId: peerId, namespace: namespace, tag: tag, threadId: input.threadId, from: fromIndex, includeFrom: includeFrom, to: toIndex, limit: limit)
|
||||||
}
|
}
|
||||||
@ -26,9 +76,9 @@ private extension MessageHistoryInput {
|
|||||||
|
|
||||||
func getMessageCountInRange(postbox: Postbox, peerId: PeerId, namespace: MessageId.Namespace, lowerBound: MessageIndex, upperBound: MessageIndex) -> Int {
|
func getMessageCountInRange(postbox: Postbox, peerId: PeerId, namespace: MessageId.Namespace, lowerBound: MessageIndex, upperBound: MessageIndex) -> Int {
|
||||||
switch self {
|
switch self {
|
||||||
case let .automatic(tag):
|
case let .automatic(automatic):
|
||||||
if let tag = tag {
|
if let automatic = automatic {
|
||||||
return postbox.messageHistoryTagsTable.getMessageCountInRange(tag: tag, peerId: peerId, namespace: namespace, lowerBound: lowerBound, upperBound: upperBound)
|
return postbox.messageHistoryTagsTable.getMessageCountInRange(tag: automatic.tag, peerId: peerId, namespace: namespace, lowerBound: lowerBound, upperBound: upperBound)
|
||||||
} else {
|
} else {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
@ -342,8 +392,8 @@ private func sampleHoleRanges(input: MessageHistoryInput, orderedEntriesBySpace:
|
|||||||
var tag: MessageTags?
|
var tag: MessageTags?
|
||||||
var threadId: Int64?
|
var threadId: Int64?
|
||||||
switch input {
|
switch input {
|
||||||
case let .automatic(value):
|
case let .automatic(automatic):
|
||||||
tag = value
|
tag = automatic?.tag
|
||||||
case let .external(value, _):
|
case let .external(value, _):
|
||||||
threadId = value.threadId
|
threadId = value.threadId
|
||||||
}
|
}
|
||||||
@ -834,7 +884,7 @@ final class HistoryViewLoadedState {
|
|||||||
var holes: HistoryViewHoles
|
var holes: HistoryViewHoles
|
||||||
var spacesWithRemovals = Set<PeerIdAndNamespace>()
|
var spacesWithRemovals = Set<PeerIdAndNamespace>()
|
||||||
|
|
||||||
init(anchor: HistoryViewAnchor, tag: MessageTags?, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewInput, postbox: Postbox, holes: HistoryViewHoles) {
|
init(anchor: HistoryViewAnchor, tag: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewInput, postbox: Postbox, holes: HistoryViewHoles) {
|
||||||
precondition(halfLimit >= 3)
|
precondition(halfLimit >= 3)
|
||||||
self.anchor = anchor
|
self.anchor = anchor
|
||||||
self.namespaces = namespaces
|
self.namespaces = namespaces
|
||||||
@ -849,13 +899,17 @@ final class HistoryViewLoadedState {
|
|||||||
switch locations {
|
switch locations {
|
||||||
case let .single(peerId):
|
case let .single(peerId):
|
||||||
peerIds.append(peerId)
|
peerIds.append(peerId)
|
||||||
input = .automatic(tag)
|
input = .automatic(tag.flatMap { tag in
|
||||||
|
MessageHistoryInput.Automatic(tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup)
|
||||||
|
})
|
||||||
case let .associated(peerId, associatedId):
|
case let .associated(peerId, associatedId):
|
||||||
peerIds.append(peerId)
|
peerIds.append(peerId)
|
||||||
if let associatedId = associatedId {
|
if let associatedId = associatedId {
|
||||||
peerIds.append(associatedId.peerId)
|
peerIds.append(associatedId.peerId)
|
||||||
}
|
}
|
||||||
input = .automatic(tag)
|
input = .automatic(tag.flatMap { tag in
|
||||||
|
MessageHistoryInput.Automatic(tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup)
|
||||||
|
})
|
||||||
case let .external(external):
|
case let .external(external):
|
||||||
peerIds.append(external.peerId)
|
peerIds.append(external.peerId)
|
||||||
input = .external(external, tag)
|
input = .external(external, tag)
|
||||||
@ -927,7 +981,7 @@ final class HistoryViewLoadedState {
|
|||||||
|
|
||||||
var entries = OrderedHistoryViewEntries(lowerOrAtAnchor: lowerOrAtAnchorMessages, higherThanAnchor: higherThanAnchorMessages)
|
var entries = OrderedHistoryViewEntries(lowerOrAtAnchor: lowerOrAtAnchorMessages, higherThanAnchor: higherThanAnchorMessages)
|
||||||
|
|
||||||
if case let .automatic(tagValue) = self.input, let _ = tagValue, self.statistics.contains(.combinedLocation), let first = entries.first {
|
if case let .automatic(automaticValue) = self.input, let _ = automaticValue, self.statistics.contains(.combinedLocation), let first = entries.first {
|
||||||
let messageIndex = first.index
|
let messageIndex = first.index
|
||||||
let previousCount = self.input.getMessageCountInRange(postbox: postbox, peerId: space.peerId, namespace: space.namespace, lowerBound: MessageIndex.lowerBound(peerId: space.peerId, namespace: space.namespace), upperBound: messageIndex)
|
let previousCount = self.input.getMessageCountInRange(postbox: postbox, peerId: space.peerId, namespace: space.namespace, lowerBound: MessageIndex.lowerBound(peerId: space.peerId, namespace: space.namespace), upperBound: messageIndex)
|
||||||
let nextCount = self.input.getMessageCountInRange(postbox: postbox, peerId: space.peerId, namespace: space.namespace, lowerBound: messageIndex, upperBound: MessageIndex.upperBound(peerId: space.peerId, namespace: space.namespace))
|
let nextCount = self.input.getMessageCountInRange(postbox: postbox, peerId: space.peerId, namespace: space.namespace, lowerBound: messageIndex, upperBound: MessageIndex.upperBound(peerId: space.peerId, namespace: space.namespace))
|
||||||
@ -1333,7 +1387,9 @@ private func fetchHoles(postbox: Postbox, locations: MessageHistoryViewInput, ta
|
|||||||
let indices = postbox.messageHistoryHoleIndexTable.closest(peerId: peerId, namespace: namespace, space: holeSpace, range: 1 ... (Int32.max - 1))
|
let indices = postbox.messageHistoryHoleIndexTable.closest(peerId: peerId, namespace: namespace, space: holeSpace, range: 1 ... (Int32.max - 1))
|
||||||
if !indices.isEmpty {
|
if !indices.isEmpty {
|
||||||
let peerIdAndNamespace = PeerIdAndNamespace(peerId: peerId, namespace: namespace)
|
let peerIdAndNamespace = PeerIdAndNamespace(peerId: peerId, namespace: namespace)
|
||||||
assert(canContainHoles(peerIdAndNamespace, input: .automatic(tag), seedConfiguration: postbox.seedConfiguration))
|
assert(canContainHoles(peerIdAndNamespace, input: .automatic(tag.flatMap { tag in
|
||||||
|
MessageHistoryInput.Automatic(tag: tag, appendMessagesFromTheSameGroup: false)
|
||||||
|
}), seedConfiguration: postbox.seedConfiguration))
|
||||||
holesBySpace[peerIdAndNamespace] = indices
|
holesBySpace[peerIdAndNamespace] = indices
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1414,14 +1470,14 @@ enum HistoryViewState {
|
|||||||
case loaded(HistoryViewLoadedState)
|
case loaded(HistoryViewLoadedState)
|
||||||
case loading(HistoryViewLoadingState)
|
case loading(HistoryViewLoadingState)
|
||||||
|
|
||||||
init(postbox: Postbox, inputAnchor: HistoryViewInputAnchor, tag: MessageTags?, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewInput) {
|
init(postbox: Postbox, inputAnchor: HistoryViewInputAnchor, tag: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, statistics: MessageHistoryViewOrderStatistics, halfLimit: Int, locations: MessageHistoryViewInput) {
|
||||||
switch inputAnchor {
|
switch inputAnchor {
|
||||||
case let .index(index):
|
case let .index(index):
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: .index(index), tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
self = .loaded(HistoryViewLoadedState(anchor: .index(index), tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
||||||
case .lowerBound:
|
case .lowerBound:
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: .lowerBound, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
self = .loaded(HistoryViewLoadedState(anchor: .lowerBound, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
||||||
case .upperBound:
|
case .upperBound:
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: .upperBound, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
self = .loaded(HistoryViewLoadedState(anchor: .upperBound, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
||||||
case .unread:
|
case .unread:
|
||||||
let anchorPeerId: PeerId
|
let anchorPeerId: PeerId
|
||||||
switch locations {
|
switch locations {
|
||||||
@ -1430,7 +1486,7 @@ enum HistoryViewState {
|
|||||||
case let .associated(peerId, _):
|
case let .associated(peerId, _):
|
||||||
anchorPeerId = peerId
|
anchorPeerId = peerId
|
||||||
case .external:
|
case .external:
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: .upperBound, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
self = .loaded(HistoryViewLoadedState(anchor: .upperBound, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if postbox.chatListIndexTable.get(peerId: anchorPeerId).includedIndex(peerId: anchorPeerId) != nil, let combinedState = postbox.readStateTable.getCombinedState(anchorPeerId) {
|
if postbox.chatListIndexTable.get(peerId: anchorPeerId).includedIndex(peerId: anchorPeerId) != nil, let combinedState = postbox.readStateTable.getCombinedState(anchorPeerId) {
|
||||||
@ -1461,12 +1517,12 @@ enum HistoryViewState {
|
|||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: holes))
|
self = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: holes))
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
self = .loading(loadingState)
|
self = .loading(loadingState)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: anchor ?? .upperBound, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
self = .loaded(HistoryViewLoadedState(anchor: anchor ?? .upperBound, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: HistoryViewHoles(holesBySpace: fetchHoles(postbox: postbox, locations: locations, tag: tag, namespaces: namespaces))))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
preconditionFailure()
|
preconditionFailure()
|
||||||
@ -1483,7 +1539,7 @@ enum HistoryViewState {
|
|||||||
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
let sampledState = loadingState.checkAndSample(postbox: postbox)
|
||||||
switch sampledState {
|
switch sampledState {
|
||||||
case let .ready(anchor, holes):
|
case let .ready(anchor, holes):
|
||||||
self = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: holes))
|
self = .loaded(HistoryViewLoadedState(anchor: anchor, tag: tag, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, statistics: statistics, halfLimit: halfLimit, locations: locations, postbox: postbox, holes: holes))
|
||||||
case .loadHole:
|
case .loadHole:
|
||||||
self = .loading(loadingState)
|
self = .loading(loadingState)
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ final class MutableMessageOfInterestHolesView: MutablePostboxView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.anchor = anchor
|
self.anchor = anchor
|
||||||
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, appendMessagesFromTheSameGroup: false, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
||||||
let _ = self.updateFromView()
|
let _ = self.updateFromView()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,7 +132,7 @@ final class MutableMessageOfInterestHolesView: MutablePostboxView {
|
|||||||
case let .peer(id):
|
case let .peer(id):
|
||||||
peerIds = postbox.peerIdsForLocation(.peer(id), ignoreRelatedChats: false)
|
peerIds = postbox.peerIdsForLocation(.peer(id), ignoreRelatedChats: false)
|
||||||
}
|
}
|
||||||
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, appendMessagesFromTheSameGroup: false, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
||||||
return self.updateFromView()
|
return self.updateFromView()
|
||||||
} else if self.wrappedView.replay(postbox: postbox, transaction: transaction) {
|
} else if self.wrappedView.replay(postbox: postbox, transaction: transaction) {
|
||||||
var reloadView = false
|
var reloadView = false
|
||||||
@ -163,7 +163,7 @@ final class MutableMessageOfInterestHolesView: MutablePostboxView {
|
|||||||
case let .peer(id):
|
case let .peer(id):
|
||||||
peerIds = postbox.peerIdsForLocation(.peer(id), ignoreRelatedChats: false)
|
peerIds = postbox.peerIdsForLocation(.peer(id), ignoreRelatedChats: false)
|
||||||
}
|
}
|
||||||
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
self.wrappedView = MutableMessageHistoryView(postbox: postbox, orderStatistics: [], clipHoles: true, peerIds: peerIds, anchor: self.anchor, combinedReadStates: nil, transientReadStates: nil, tag: nil, appendMessagesFromTheSameGroup: false, namespaces: .all, count: self.count, topTaggedMessages: [:], additionalDatas: [], getMessageCountInRange: { _, _ in return 0})
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.updateFromView()
|
return self.updateFromView()
|
||||||
|
@ -1009,7 +1009,7 @@ public final class Transaction {
|
|||||||
view = next.0
|
view = next.0
|
||||||
}, error: { _ in }, completed: {})
|
}, error: { _ in }, completed: {})
|
||||||
|
|
||||||
let disposable = postbox.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: input, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: Set(), tagMask: nil, namespaces: namespaces, orderStatistics: MessageHistoryViewOrderStatistics(), additionalData: [])
|
let disposable = postbox.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: input, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: Set(), tagMask: nil, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: MessageHistoryViewOrderStatistics(), additionalData: [])
|
||||||
disposable.dispose()
|
disposable.dispose()
|
||||||
|
|
||||||
return view!
|
return view!
|
||||||
@ -2460,7 +2460,7 @@ public final class Postbox {
|
|||||||
return peerIds
|
return peerIds
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundMessageOfInterestHistoryViewForChatLocation(_ chatLocation: ChatLocationInput, count: Int, clipHoles: Bool = true, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundMessageOfInterestHistoryViewForChatLocation(_ chatLocation: ChatLocationInput, count: Int, clipHoles: Bool = true, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
||||||
|> mapToSignal { chatLocationData in
|
|> mapToSignal { chatLocationData in
|
||||||
let (chatLocation, isHoleFill) = chatLocationData
|
let (chatLocation, isHoleFill) = chatLocationData
|
||||||
@ -2516,7 +2516,7 @@ public final class Postbox {
|
|||||||
anchor = .upperBound
|
anchor = .upperBound
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
})
|
})
|
||||||
|
|
||||||
return signal
|
return signal
|
||||||
@ -2530,13 +2530,13 @@ public final class Postbox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, messageId: MessageId, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, messageId: MessageId, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
||||||
|> mapToSignal { chatLocationData in
|
|> mapToSignal { chatLocationData in
|
||||||
let (chatLocation, isHoleFill) = chatLocationData
|
let (chatLocation, isHoleFill) = chatLocationData
|
||||||
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> = self.transactionSignal { subscriber, transaction in
|
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> = self.transactionSignal { subscriber, transaction in
|
||||||
let peerIds = self.peerIdsForLocation(chatLocation, ignoreRelatedChats: ignoreRelatedChats)
|
let peerIds = self.peerIdsForLocation(chatLocation, ignoreRelatedChats: ignoreRelatedChats)
|
||||||
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: .message(messageId), fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: .message(messageId), fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
|
|
||||||
return signal
|
return signal
|
||||||
@ -2550,14 +2550,14 @@ public final class Postbox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, anchor: HistoryViewInputAnchor, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, anchor: HistoryViewInputAnchor, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
return self.resolvedChatLocationInput(chatLocation: chatLocation)
|
||||||
|> mapToSignal { chatLocationData -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> in
|
|> mapToSignal { chatLocationData -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> in
|
||||||
let (chatLocation, isHoleFill) = chatLocationData
|
let (chatLocation, isHoleFill) = chatLocationData
|
||||||
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> = self.transactionSignal { subscriber, transaction in
|
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> = self.transactionSignal { subscriber, transaction in
|
||||||
let peerIds = self.peerIdsForLocation(chatLocation, ignoreRelatedChats: ignoreRelatedChats)
|
let peerIds = self.peerIdsForLocation(chatLocation, ignoreRelatedChats: ignoreRelatedChats)
|
||||||
|
|
||||||
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
return self.syncAroundMessageHistoryViewForPeerId(subscriber: subscriber, peerIds: peerIds, count: count, clipHoles: clipHoles, anchor: anchor, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: topTaggedMessageIdNamespaces, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
|
|
||||||
return signal
|
return signal
|
||||||
@ -2572,7 +2572,7 @@ public final class Postbox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fileprivate func syncAroundMessageHistoryViewForPeerId(subscriber: Subscriber<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>, peerIds: MessageHistoryViewInput, count: Int, clipHoles: Bool, anchor: HistoryViewInputAnchor, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Disposable {
|
fileprivate func syncAroundMessageHistoryViewForPeerId(subscriber: Subscriber<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>, peerIds: MessageHistoryViewInput, count: Int, clipHoles: Bool, anchor: HistoryViewInputAnchor, fixedCombinedReadStates: MessageHistoryViewReadState?, topTaggedMessageIdNamespaces: Set<MessageId.Namespace>, tagMask: MessageTags?, appendMessagesFromTheSameGroup: Bool, namespaces: MessageIdNamespaces, orderStatistics: MessageHistoryViewOrderStatistics, additionalData: [AdditionalMessageHistoryViewData]) -> Disposable {
|
||||||
var topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?] = [:]
|
var topTaggedMessages: [MessageId.Namespace: MessageHistoryTopTaggedMessage?] = [:]
|
||||||
var mainPeerIdForTopTaggedMessages: PeerId?
|
var mainPeerIdForTopTaggedMessages: PeerId?
|
||||||
switch peerIds {
|
switch peerIds {
|
||||||
@ -2668,7 +2668,7 @@ public final class Postbox {
|
|||||||
readStates = transientReadStates
|
readStates = transientReadStates
|
||||||
}
|
}
|
||||||
|
|
||||||
let mutableView = MutableMessageHistoryView(postbox: self, orderStatistics: orderStatistics, clipHoles: clipHoles, peerIds: peerIds, anchor: anchor, combinedReadStates: readStates, transientReadStates: transientReadStates, tag: tagMask, namespaces: namespaces, count: count, topTaggedMessages: topTaggedMessages, additionalDatas: additionalDataEntries, getMessageCountInRange: { lowerBound, upperBound in
|
let mutableView = MutableMessageHistoryView(postbox: self, orderStatistics: orderStatistics, clipHoles: clipHoles, peerIds: peerIds, anchor: anchor, combinedReadStates: readStates, transientReadStates: transientReadStates, tag: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: namespaces, count: count, topTaggedMessages: topTaggedMessages, additionalDatas: additionalDataEntries, getMessageCountInRange: { lowerBound, upperBound in
|
||||||
if let tagMask = tagMask {
|
if let tagMask = tagMask {
|
||||||
return Int32(self.messageHistoryTable.getMessageCountInRange(peerId: lowerBound.id.peerId, namespace: lowerBound.id.namespace, tag: tagMask, lowerBound: lowerBound, upperBound: upperBound))
|
return Int32(self.messageHistoryTable.getMessageCountInRange(peerId: lowerBound.id.peerId, namespace: lowerBound.id.namespace, tag: tagMask, lowerBound: lowerBound, upperBound: upperBound))
|
||||||
} else {
|
} else {
|
||||||
|
@ -247,6 +247,9 @@ public final class SlotMachineAnimationNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DiceAnimatedStickerNode: ASDisplayNode {
|
class DiceAnimatedStickerNode: ASDisplayNode {
|
||||||
@ -350,4 +353,7 @@ class DiceAnimatedStickerNode: ASDisplayNode {
|
|||||||
self.animationNode.updateLayout(size: self.bounds.size)
|
self.animationNode.updateLayout(size: self.bounds.size)
|
||||||
self.animationNode.frame = self.bounds
|
self.animationNode.frame = self.bounds
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1420,7 +1420,7 @@ public final class AccountViewTracker {
|
|||||||
|
|
||||||
public func scheduledMessagesViewForLocation(_ chatLocation: ChatLocationInput, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func scheduledMessagesViewForLocation(_ chatLocation: ChatLocationInput, additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
if let account = self.account {
|
if let account = self.account {
|
||||||
let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: .upperBound, count: 200, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: nil, namespaces: .just(Namespaces.Message.allScheduled), orderStatistics: [], additionalData: additionalData)
|
let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: .upperBound, count: 200, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: nil, appendMessagesFromTheSameGroup: false, namespaces: .just(Namespaces.Message.allScheduled), orderStatistics: [], additionalData: additionalData)
|
||||||
return withState(signal, { [weak self] () -> Int32 in
|
return withState(signal, { [weak self] () -> Int32 in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
return OSAtomicIncrement32(&strongSelf.nextViewId)
|
return OSAtomicIncrement32(&strongSelf.nextViewId)
|
||||||
@ -1448,25 +1448,25 @@ public final class AccountViewTracker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundMessageOfInterestHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, tagMask: MessageTags? = nil, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundMessageOfInterestHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, tagMask: MessageTags? = nil, appendMessagesFromTheSameGroup: Bool = false, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
if let account = self.account {
|
if let account = self.account {
|
||||||
let signal = account.postbox.aroundMessageOfInterestHistoryViewForChatLocation(chatLocation, count: count, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
let signal = account.postbox.aroundMessageOfInterestHistoryViewForChatLocation(chatLocation, count: count, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
||||||
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: true)
|
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: true)
|
||||||
} else {
|
} else {
|
||||||
return .never()
|
return .never()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, ignoreRelatedChats: Bool, messageId: MessageId, tagMask: MessageTags? = nil, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundIdMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, count: Int, ignoreRelatedChats: Bool, messageId: MessageId, tagMask: MessageTags? = nil, appendMessagesFromTheSameGroup: Bool = false, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
if let account = self.account {
|
if let account = self.account {
|
||||||
let signal = account.postbox.aroundIdMessageHistoryViewForLocation(chatLocation, count: count, ignoreRelatedChats: ignoreRelatedChats, messageId: messageId, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
let signal = account.postbox.aroundIdMessageHistoryViewForLocation(chatLocation, count: count, ignoreRelatedChats: ignoreRelatedChats, messageId: messageId, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
||||||
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: false)
|
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: false)
|
||||||
} else {
|
} else {
|
||||||
return .never()
|
return .never()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, index: MessageHistoryAnchorIndex, anchorIndex: MessageHistoryAnchorIndex, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags? = nil, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
public func aroundMessageHistoryViewForLocation(_ chatLocation: ChatLocationInput, index: MessageHistoryAnchorIndex, anchorIndex: MessageHistoryAnchorIndex, count: Int, clipHoles: Bool = true, ignoreRelatedChats: Bool = false, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags? = nil, appendMessagesFromTheSameGroup: Bool = false, orderStatistics: MessageHistoryViewOrderStatistics = [], additionalData: [AdditionalMessageHistoryViewData] = []) -> Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError> {
|
||||||
if let account = self.account {
|
if let account = self.account {
|
||||||
let inputAnchor: HistoryViewInputAnchor
|
let inputAnchor: HistoryViewInputAnchor
|
||||||
switch index {
|
switch index {
|
||||||
@ -1477,7 +1477,7 @@ public final class AccountViewTracker {
|
|||||||
case let .message(index):
|
case let .message(index):
|
||||||
inputAnchor = .index(index)
|
inputAnchor = .index(index)
|
||||||
}
|
}
|
||||||
let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: inputAnchor, count: count, clipHoles: clipHoles, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
let signal = account.postbox.aroundMessageHistoryViewForLocation(chatLocation, anchor: inputAnchor, count: count, clipHoles: clipHoles, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, topTaggedMessageIdNamespaces: [Namespaces.Message.Cloud], tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, namespaces: .not(Namespaces.Message.allScheduled), orderStatistics: orderStatistics, additionalData: wrappedHistoryViewAdditionalData(chatLocation: chatLocation, additionalData: additionalData))
|
||||||
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: false)
|
return wrappedMessageHistorySignal(chatLocation: chatLocation, signal: signal, addHoleIfNeeded: false)
|
||||||
} else {
|
} else {
|
||||||
return .never()
|
return .never()
|
||||||
|
@ -269,6 +269,11 @@ final class HistoryViewStateValidationContexts {
|
|||||||
|
|
||||||
for entry in view.entries {
|
for entry in view.entries {
|
||||||
if historyState.matchesPeerId(entry.message.id.peerId) && entry.message.id.namespace == Namespaces.Message.Cloud {
|
if historyState.matchesPeerId(entry.message.id.peerId) && entry.message.id.namespace == Namespaces.Message.Cloud {
|
||||||
|
if let tag = view.tagMask {
|
||||||
|
if !entry.message.tags.contains(tag) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
if !historyState.isMessageValid(entry.message) {
|
if !historyState.isMessageValid(entry.message) {
|
||||||
addToRange(entry.message.id, &rangesToInvalidate)
|
addToRange(entry.message.id, &rangesToInvalidate)
|
||||||
} else {
|
} else {
|
||||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -3368,7 +3368,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
location = .Initial(count: count)
|
location = .Initial(count: count)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (chatHistoryViewForLocation(ChatHistoryLocationInput(content: location, id: 0), context: context, chatLocation: .peer(peerId), chatLocationContextHolder: Atomic<ChatLocationContextHolder?>(value: nil), scheduled: false, fixedCombinedReadStates: nil, tagMask: MessageTags.pinned, additionalData: [], orderStatistics: .combinedLocation)
|
return (chatHistoryViewForLocation(ChatHistoryLocationInput(content: location, id: 0), context: context, chatLocation: .peer(peerId), chatLocationContextHolder: Atomic<ChatLocationContextHolder?>(value: nil), scheduled: false, fixedCombinedReadStates: nil, tagMask: MessageTags.pinned, appendMessagesFromTheSameGroup: false, additionalData: [], orderStatistics: .combinedLocation)
|
||||||
|> castError(Bool.self)
|
|> castError(Bool.self)
|
||||||
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
||||||
switch update {
|
switch update {
|
||||||
@ -5152,69 +5152,83 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
|
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
let continueAction: () -> Void = {
|
|
||||||
guard let strongSelf = self else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var pinImmediately = false
|
|
||||||
if let channel = peer as? TelegramChannel, case .broadcast = channel.info {
|
|
||||||
pinImmediately = true
|
|
||||||
} else if let _ = peer as? TelegramUser {
|
|
||||||
pinImmediately = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if pinImmediately {
|
|
||||||
pinAction(true, false)
|
|
||||||
} else {
|
|
||||||
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError> = strongSelf.topPinnedMessageSignal(latest: true)
|
|
||||||
|> take(1)
|
|
||||||
|
|
||||||
let _ = (topPinnedMessage
|
|
||||||
|> deliverOnMainQueue).start(next: { value in
|
|
||||||
guard let strongSelf = self else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
let title: String?
|
|
||||||
let text: String
|
|
||||||
let actionLayout: TextAlertContentActionLayout
|
|
||||||
let actions: [TextAlertAction]
|
|
||||||
if let value = value, value.message.id > messageId {
|
|
||||||
title = strongSelf.presentationData.strings.Conversation_PinOlderMessageAlertTitle
|
|
||||||
text = strongSelf.presentationData.strings.Conversation_PinOlderMessageAlertText
|
|
||||||
actionLayout = .vertical
|
|
||||||
actions = [
|
|
||||||
TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Conversation_PinMessageAlertPin, action: {
|
|
||||||
pinAction(false, false)
|
|
||||||
}),
|
|
||||||
TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {
|
|
||||||
})
|
|
||||||
]
|
|
||||||
} else {
|
|
||||||
title = nil
|
|
||||||
text = strongSelf.presentationData.strings.Conversation_PinMessageAlertGroup
|
|
||||||
actionLayout = .horizontal
|
|
||||||
actions = [
|
|
||||||
TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Conversation_PinMessageAlert_OnlyPin, action: {
|
|
||||||
pinAction(false, false)
|
|
||||||
}),
|
|
||||||
TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Yes, action: {
|
|
||||||
pinAction(true, false)
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
strongSelf.present(textAlertController(context: strongSelf.context, title: title, text: text, actions: actions, actionLayout: actionLayout), in: .window(.root))
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let contextController = contextController {
|
if let contextController = contextController {
|
||||||
contextController.dismiss(completion: {
|
var contextItems: [ContextMenuItem] = []
|
||||||
continueAction()
|
|
||||||
})
|
contextItems.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_PinMessageAlert_PinAndNotifyMembers, textColor: .primary, icon: { _ in nil }, action: { c, _ in
|
||||||
|
c.dismiss(completion: {
|
||||||
|
pinAction(true, false)
|
||||||
|
})
|
||||||
|
})))
|
||||||
|
|
||||||
|
contextItems.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_PinMessageAlert_OnlyPin, textColor: .primary, icon: { _ in nil }, action: { c, _ in
|
||||||
|
c.dismiss(completion: {
|
||||||
|
pinAction(false, false)
|
||||||
|
})
|
||||||
|
})))
|
||||||
|
|
||||||
|
contextController.setItems(.single(contextItems))
|
||||||
|
|
||||||
|
return
|
||||||
} else {
|
} else {
|
||||||
|
let continueAction: () -> Void = {
|
||||||
|
guard let strongSelf = self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var pinImmediately = false
|
||||||
|
if let channel = peer as? TelegramChannel, case .broadcast = channel.info {
|
||||||
|
pinImmediately = true
|
||||||
|
} else if let _ = peer as? TelegramUser {
|
||||||
|
pinImmediately = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if pinImmediately {
|
||||||
|
pinAction(true, false)
|
||||||
|
} else {
|
||||||
|
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError> = strongSelf.topPinnedMessageSignal(latest: true)
|
||||||
|
|> take(1)
|
||||||
|
|
||||||
|
let _ = (topPinnedMessage
|
||||||
|
|> deliverOnMainQueue).start(next: { value in
|
||||||
|
guard let strongSelf = self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let title: String?
|
||||||
|
let text: String
|
||||||
|
let actionLayout: TextAlertContentActionLayout
|
||||||
|
let actions: [TextAlertAction]
|
||||||
|
if let value = value, value.message.id > messageId {
|
||||||
|
title = strongSelf.presentationData.strings.Conversation_PinOlderMessageAlertTitle
|
||||||
|
text = strongSelf.presentationData.strings.Conversation_PinOlderMessageAlertText
|
||||||
|
actionLayout = .vertical
|
||||||
|
actions = [
|
||||||
|
TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Conversation_PinMessageAlertPin, action: {
|
||||||
|
pinAction(false, false)
|
||||||
|
}),
|
||||||
|
TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Common_Cancel, action: {
|
||||||
|
})
|
||||||
|
]
|
||||||
|
} else {
|
||||||
|
title = nil
|
||||||
|
text = strongSelf.presentationData.strings.Conversation_PinMessageAlertGroup
|
||||||
|
actionLayout = .horizontal
|
||||||
|
actions = [
|
||||||
|
TextAlertAction(type: .genericAction, title: strongSelf.presentationData.strings.Conversation_PinMessageAlert_OnlyPin, action: {
|
||||||
|
pinAction(false, false)
|
||||||
|
}),
|
||||||
|
TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_Yes, action: {
|
||||||
|
pinAction(true, false)
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.present(textAlertController(context: strongSelf.context, title: title, text: text, actions: actions, actionLayout: actionLayout), in: .window(.root))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
continueAction()
|
continueAction()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -593,8 +593,10 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
|
|
||||||
public init(context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?, source: ChatHistoryListSource = .default, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles) {
|
public init(context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?, source: ChatHistoryListSource = .default, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles) {
|
||||||
var tagMask = tagMask
|
var tagMask = tagMask
|
||||||
|
var appendMessagesFromTheSameGroup = false
|
||||||
if case .pinnedMessages = subject {
|
if case .pinnedMessages = subject {
|
||||||
tagMask = .pinned
|
tagMask = .pinned
|
||||||
|
appendMessagesFromTheSameGroup = true
|
||||||
}
|
}
|
||||||
|
|
||||||
self.context = context
|
self.context = context
|
||||||
@ -720,7 +722,7 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
|
|||||||
historyViewUpdate = self.chatHistoryLocationPromise.get()
|
historyViewUpdate = self.chatHistoryLocationPromise.get()
|
||||||
|> distinctUntilChanged
|
|> distinctUntilChanged
|
||||||
|> mapToSignal { location in
|
|> mapToSignal { location in
|
||||||
return chatHistoryViewForLocation(location, context: context, chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, scheduled: isScheduledMessages, fixedCombinedReadStates: fixedCombinedReadStates.with { $0 }, tagMask: tagMask, additionalData: additionalData)
|
return chatHistoryViewForLocation(location, context: context, chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, scheduled: isScheduledMessages, fixedCombinedReadStates: fixedCombinedReadStates.with { $0 }, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, additionalData: additionalData)
|
||||||
|> beforeNext { viewUpdate in
|
|> beforeNext { viewUpdate in
|
||||||
switch viewUpdate {
|
switch viewUpdate {
|
||||||
case let .HistoryView(view, _, _, _, _, _, _):
|
case let .HistoryView(view, _, _, _, _, _, _):
|
||||||
|
@ -19,7 +19,7 @@ func preloadedChatHistoryViewForLocation(_ location: ChatHistoryLocationInput, c
|
|||||||
tagMask = .pinned
|
tagMask = .pinned
|
||||||
}
|
}
|
||||||
|
|
||||||
return (chatHistoryViewForLocation(location, context: context, chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, scheduled: isScheduled, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, additionalData: additionalData, orderStatistics: orderStatistics)
|
return (chatHistoryViewForLocation(location, context: context, chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, scheduled: isScheduled, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, appendMessagesFromTheSameGroup: false, additionalData: additionalData, orderStatistics: orderStatistics)
|
||||||
|> castError(Bool.self)
|
|> castError(Bool.self)
|
||||||
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
|> mapToSignal { update -> Signal<ChatHistoryViewUpdate, Bool> in
|
||||||
switch update {
|
switch update {
|
||||||
@ -37,7 +37,7 @@ func preloadedChatHistoryViewForLocation(_ location: ChatHistoryLocationInput, c
|
|||||||
|> restartIfError
|
|> restartIfError
|
||||||
}
|
}
|
||||||
|
|
||||||
func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, scheduled: Bool, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags?, additionalData: [AdditionalMessageHistoryViewData], orderStatistics: MessageHistoryViewOrderStatistics = []) -> Signal<ChatHistoryViewUpdate, NoError> {
|
func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: AccountContext, chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, scheduled: Bool, fixedCombinedReadStates: MessageHistoryViewReadState?, tagMask: MessageTags?, appendMessagesFromTheSameGroup: Bool, additionalData: [AdditionalMessageHistoryViewData], orderStatistics: MessageHistoryViewOrderStatistics = []) -> Signal<ChatHistoryViewUpdate, NoError> {
|
||||||
let account = context.account
|
let account = context.account
|
||||||
if scheduled {
|
if scheduled {
|
||||||
var first = true
|
var first = true
|
||||||
@ -84,9 +84,9 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
var fadeIn = false
|
var fadeIn = false
|
||||||
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>
|
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>
|
||||||
if let tagMask = tagMask {
|
if let tagMask = tagMask {
|
||||||
signal = account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: .upperBound, anchorIndex: .upperBound, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: nil, tagMask: tagMask, orderStatistics: orderStatistics)
|
signal = account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: .upperBound, anchorIndex: .upperBound, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: nil, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics)
|
||||||
} else {
|
} else {
|
||||||
signal = account.viewTracker.aroundMessageOfInterestHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), count: count, tagMask: tagMask, orderStatistics: orderStatistics, additionalData: additionalData)
|
signal = account.viewTracker.aroundMessageOfInterestHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), count: count, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
return signal
|
return signal
|
||||||
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
||||||
@ -170,9 +170,9 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>
|
let signal: Signal<(MessageHistoryView, ViewUpdateType, InitialMessageHistoryData?), NoError>
|
||||||
switch searchLocation {
|
switch searchLocation {
|
||||||
case let .index(index):
|
case let .index(index):
|
||||||
signal = account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: .message(index), anchorIndex: .message(index), count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: nil, tagMask: tagMask, orderStatistics: orderStatistics, additionalData: additionalData)
|
signal = account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: .message(index), anchorIndex: .message(index), count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: nil, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
case let .id(id):
|
case let .id(id):
|
||||||
signal = account.viewTracker.aroundIdMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), count: count, ignoreRelatedChats: ignoreRelatedChats, messageId: id, tagMask: tagMask, orderStatistics: orderStatistics, additionalData: additionalData)
|
signal = account.viewTracker.aroundIdMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), count: count, ignoreRelatedChats: ignoreRelatedChats, messageId: id, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
}
|
}
|
||||||
|
|
||||||
return signal |> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
return signal |> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
||||||
@ -220,7 +220,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
}
|
}
|
||||||
case let .Navigation(index, anchorIndex, count, highlight):
|
case let .Navigation(index, anchorIndex, count, highlight):
|
||||||
var first = true
|
var first = true
|
||||||
return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, orderStatistics: orderStatistics, additionalData: additionalData) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: count, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData) |> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
||||||
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
||||||
|
|
||||||
let genericType: ViewUpdateType
|
let genericType: ViewUpdateType
|
||||||
@ -236,7 +236,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, context: A
|
|||||||
let directionHint: ListViewScrollToItemDirectionHint = sourceIndex > index ? .Down : .Up
|
let directionHint: ListViewScrollToItemDirectionHint = sourceIndex > index ? .Down : .Up
|
||||||
let chatScrollPosition = ChatHistoryViewScrollPosition.index(index: index, position: scrollPosition, directionHint: directionHint, animated: animated, highlight: highlight)
|
let chatScrollPosition = ChatHistoryViewScrollPosition.index(index: index, position: scrollPosition, directionHint: directionHint, animated: animated, highlight: highlight)
|
||||||
var first = true
|
var first = true
|
||||||
return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: 128, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, orderStatistics: orderStatistics, additionalData: additionalData)
|
return account.viewTracker.aroundMessageHistoryViewForLocation(context.chatLocationInput(for: chatLocation, contextHolder: chatLocationContextHolder), index: index, anchorIndex: anchorIndex, count: 128, ignoreRelatedChats: ignoreRelatedChats, fixedCombinedReadStates: fixedCombinedReadStates, tagMask: tagMask, appendMessagesFromTheSameGroup: appendMessagesFromTheSameGroup, orderStatistics: orderStatistics, additionalData: additionalData)
|
||||||
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
|> map { view, updateType, initialData -> ChatHistoryViewUpdate in
|
||||||
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
let (cachedData, cachedDataMessages, readStateData) = extractAdditionalData(view: view, chatLocation: chatLocation)
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ private let inlineBotPrefixFont = Font.regular(14.0)
|
|||||||
private let inlineBotNameFont = nameFont
|
private let inlineBotNameFont = nameFont
|
||||||
|
|
||||||
protocol GenericAnimatedStickerNode: ASDisplayNode {
|
protocol GenericAnimatedStickerNode: ASDisplayNode {
|
||||||
|
func setOverlayColor(_ color: UIColor?, animated: Bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
extension AnimatedStickerNode: GenericAnimatedStickerNode {
|
extension AnimatedStickerNode: GenericAnimatedStickerNode {
|
||||||
@ -1542,8 +1542,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
if highlighted {
|
if highlighted {
|
||||||
self.imageNode.setOverlayColor(item.presentationData.theme.theme.chat.message.mediaHighlightOverlayColor, animated: false)
|
self.imageNode.setOverlayColor(item.presentationData.theme.theme.chat.message.mediaHighlightOverlayColor, animated: false)
|
||||||
|
self.animationNode?.setOverlayColor(item.presentationData.theme.theme.chat.message.mediaHighlightOverlayColor, animated: false)
|
||||||
} else {
|
} else {
|
||||||
self.imageNode.setOverlayColor(nil, animated: animated)
|
self.imageNode.setOverlayColor(nil, animated: animated)
|
||||||
|
self.animationNode?.setOverlayColor(nil, animated: false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,4 +201,7 @@ final class ManagedDiceAnimationNode: ManagedAnimationNode, GenericAnimatedStick
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setOverlayColor(_ color: UIColor?, animated: Bool) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -487,7 +487,7 @@ final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
|
|||||||
return .single(nil)
|
return .single(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: .index(message.index), count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, namespaces: namespaces, orderStatistics: [])
|
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: .index(message.index), count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: [])
|
||||||
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
||||||
if let (message, aroundMessages, _) = navigatedMessageFromView(view.0, anchorIndex: message.index, position: .exact) {
|
if let (message, aroundMessages, _) = navigatedMessageFromView(view.0, anchorIndex: message.index, position: .exact) {
|
||||||
return .single((message, aroundMessages))
|
return .single((message, aroundMessages))
|
||||||
@ -585,7 +585,7 @@ final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
|
|||||||
}
|
}
|
||||||
let historySignal = inputIndex
|
let historySignal = inputIndex
|
||||||
|> mapToSignal { inputIndex -> Signal<(Message, [Message])?, NoError> in
|
|> mapToSignal { inputIndex -> Signal<(Message, [Message])?, NoError> in
|
||||||
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: .index(inputIndex), count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, namespaces: namespaces, orderStatistics: [])
|
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: .index(inputIndex), count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: [])
|
||||||
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
||||||
let position: NavigatedMessageFromViewPosition
|
let position: NavigatedMessageFromViewPosition
|
||||||
switch navigation {
|
switch navigation {
|
||||||
@ -615,7 +615,7 @@ final class PeerMessagesMediaPlaylist: SharedMediaPlaylist {
|
|||||||
} else {
|
} else {
|
||||||
viewIndex = .lowerBound
|
viewIndex = .lowerBound
|
||||||
}
|
}
|
||||||
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: viewIndex, count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, namespaces: namespaces, orderStatistics: [])
|
return self.context.account.postbox.aroundMessageHistoryViewForLocation(self.context.chatLocationInput(for: chatLocation, contextHolder: self.chatLocationContextHolder ?? Atomic<ChatLocationContextHolder?>(value: nil)), anchor: viewIndex, count: 10, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: [], tagMask: tagMask, appendMessagesFromTheSameGroup: false, namespaces: namespaces, orderStatistics: [])
|
||||||
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
|> mapToSignal { view -> Signal<(Message, [Message])?, NoError> in
|
||||||
let position: NavigatedMessageFromViewPosition
|
let position: NavigatedMessageFromViewPosition
|
||||||
switch navigation {
|
switch navigation {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user