[WIP] Saved tags

This commit is contained in:
Isaac
2024-01-10 00:45:01 +04:00
parent 49cbbc9436
commit 5e4a9cff28
77 changed files with 3274 additions and 1822 deletions

View File

@@ -305,7 +305,7 @@ public enum HistoryViewInputAnchor: Equatable {
final class MutableMessageHistoryView {
private(set) var peerIds: MessageHistoryViewInput
private let ignoreMessagesInTimestampRange: ClosedRange<Int32>?
let tag: MessageTags?
let tag: HistoryViewInputTag?
private let appendMessagesFromTheSameGroup: Bool
let namespaces: MessageIdNamespaces
private let orderStatistics: MessageHistoryViewOrderStatistics
@@ -338,7 +338,7 @@ final class MutableMessageHistoryView {
anchor inputAnchor: HistoryViewInputAnchor,
combinedReadStates: MessageHistoryViewReadState?,
transientReadStates: MessageHistoryViewReadState?,
tag: MessageTags?,
tag: HistoryViewInputTag?,
appendMessagesFromTheSameGroup: Bool,
namespaces: MessageIdNamespaces,
count: Int,
@@ -501,7 +501,6 @@ final class MutableMessageHistoryView {
var hasChanges = false
let unwrappedTag: MessageTags = self.tag ?? []
let externalThreadId: Int64?
let isExternal: Bool
switch self.peerIds {
@@ -530,9 +529,15 @@ final class MutableMessageHistoryView {
if !isExternal {
switch key.space {
case .everywhere:
matchesSpace = unwrappedTag.isEmpty
if self.tag == nil {
matchesSpace = true
}
case let .tag(tag):
if let currentTag = self.tag, currentTag == tag {
if case let .tag(currentTag) = self.tag, currentTag == tag {
matchesSpace = true
}
case let .customTag(customTag):
if case let .customTag(currentTag) = self.tag, currentTag == customTag {
matchesSpace = true
}
}
@@ -572,15 +577,42 @@ final class MutableMessageHistoryView {
switch operation {
case let .InsertMessage(message):
var matchesTag = false
if unwrappedTag.isEmpty {
switch self.tag {
case .none:
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
case let .tag(value):
if message.tags.contains(value) {
matchesTag = true
}
case let .customTag(value):
if message.customTags.contains(value) {
matchesTag = true
}
}
if !matchesTag {
if self.appendMessagesFromTheSameGroup, let _ = message.groupInfo {
if let group = postbox.messageHistoryTable.getMessageGroup(at: message.index, limit: 20) {
for groupMessage in group {
var groupMatchesTag = false
switch self.tag {
case .none:
matchesTag = true
case let .tag(value):
if groupMessage.tags.contains(value) {
groupMatchesTag = true
}
case let .customTag(value):
if groupMessage.customTags.contains(value) {
groupMatchesTag = true
}
}
if groupMatchesTag {
matchesTag = true
}
}
}
}
@@ -637,14 +669,35 @@ final class MutableMessageHistoryView {
}
}
}
var currentThreadId: Int64?
switch self.peerIds {
case let .single(_, threadIdValue):
currentThreadId = threadIdValue
case .associated:
break
case .external:
break
}
for (key, holeOperations) in transaction.currentPeerHoleOperations {
if key.threadId != currentThreadId {
continue
}
var matchesSpace = false
if !isExternal {
switch key.space {
case .everywhere:
matchesSpace = unwrappedTag.isEmpty
if self.tag == nil {
matchesSpace = true
}
case let .tag(tag):
if let currentTag = self.tag, currentTag == tag {
if case let .tag(currentTag) = self.tag, currentTag == tag {
matchesSpace = true
}
case let .customTag(customTag):
if case let .customTag(currentTag) = self.tag, currentTag == customTag {
matchesSpace = true
}
}
@@ -906,7 +959,18 @@ final class MutableMessageHistoryView {
case .external:
break
}
let space: MessageHistoryHoleSpace = self.tag.flatMap(MessageHistoryHoleSpace.tag) ?? .everywhere
let space: MessageHistoryHoleOperationSpace
if let tag = self.tag {
switch tag {
case let .tag(value):
space = .tag(value)
case let .customTag(value):
space = .customTag(value)
}
} else {
space = .everywhere
}
for key in transaction.currentPeerHoleOperations.keys {
if holePeerIdsSet.contains(key.peerId) && threadId == key.threadId && key.space == space {
hasChanges = true
@@ -984,7 +1048,7 @@ final class MutableMessageHistoryView {
}
public final class MessageHistoryView {
public let tagMask: MessageTags?
public let tag: HistoryViewInputTag?
public let namespaces: MessageIdNamespaces
public let anchorIndex: MessageHistoryAnchorIndex
public let earlierId: MessageIndex?
@@ -1002,8 +1066,8 @@ public final class MessageHistoryView {
public let isAddedToChatList: Bool
public let peerStoryStats: [PeerId: PeerStoryStats]
public init(tagMask: MessageTags?, namespaces: MessageIdNamespaces, entries: [MessageHistoryEntry], holeEarlier: Bool, holeLater: Bool, isLoading: Bool) {
self.tagMask = tagMask
public init(tag: HistoryViewInputTag?, namespaces: MessageIdNamespaces, entries: [MessageHistoryEntry], holeEarlier: Bool, holeLater: Bool, isLoading: Bool) {
self.tag = tag
self.namespaces = namespaces
self.anchorIndex = .lowerBound
self.earlierId = nil
@@ -1023,7 +1087,7 @@ public final class MessageHistoryView {
}
init(_ mutableView: MutableMessageHistoryView) {
self.tagMask = mutableView.tag
self.tag = mutableView.tag
self.namespaces = mutableView.namespaces
self.isAddedToChatList = mutableView.isAddedToChatList
var entries: [MessageHistoryEntry]
@@ -1248,7 +1312,7 @@ public final class MessageHistoryView {
}
public init(base: MessageHistoryView, fixed combinedReadStates: MessageHistoryViewReadState?, transient transientReadStates: MessageHistoryViewReadState?) {
self.tagMask = base.tagMask
self.tag = base.tag
self.namespaces = base.namespaces
self.anchorIndex = base.anchorIndex
self.earlierId = base.earlierId