[WIP] Saved messages

This commit is contained in:
Isaac
2023-12-25 22:58:09 +04:00
parent 4651c39083
commit 0e75f18f14
65 changed files with 934 additions and 369 deletions

View File

@@ -312,166 +312,68 @@ func chatListViewForLocation(chatListLocation: ChatListControllerLocation, locat
return ChatListNodeViewUpdate(list: list, type: type, scrollPosition: nil)
}
case .savedMessagesChats:
if "".isEmpty {
let viewKey: PostboxViewKey = .savedMessagesIndex(peerId: account.peerId)
var isFirst = true
return account.postbox.combinedView(keys: [viewKey])
|> map { views -> ChatListNodeViewUpdate in
guard let view = views.views[viewKey] as? MessageHistorySavedMessagesIndexView else {
preconditionFailure()
}
var items: [EngineChatList.Item] = []
for item in view.items {
guard let sourcePeer = item.peer else {
continue
}
let sourceId = PeerId(item.id)
var messages: [EngineMessage] = []
if let topMessage = item.topMessage {
messages.append(EngineMessage(topMessage))
}
let mappedMessageIndex = MessageIndex(id: MessageId(peerId: sourceId, namespace: item.index.id.namespace, id: item.index.id.id), timestamp: item.index.timestamp)
items.append(EngineChatList.Item(
id: .chatList(sourceId),
index: .chatList(ChatListIndex(pinningIndex: item.pinnedIndex.flatMap(UInt16.init), messageIndex: mappedMessageIndex)),
messages: messages,
readCounters: nil,
isMuted: false,
draft: nil,
threadData: nil,
renderedPeer: EngineRenderedPeer(peer: EnginePeer(sourcePeer)),
presence: nil,
hasUnseenMentions: false,
hasUnseenReactions: false,
forumTopicData: nil,
topForumTopicItems: [],
hasFailed: false,
isContact: false,
autoremoveTimeout: nil,
storyStats: nil
))
}
let list = EngineChatList(
items: items.reversed(),
groupItems: [],
additionalItems: [],
hasEarlier: false,
hasLater: false,
isLoading: view.isLoading
)
let type: ViewUpdateType
if isFirst {
type = .Initial
} else {
type = .Generic
}
isFirst = false
return ChatListNodeViewUpdate(list: list, type: type, scrollPosition: nil)
let viewKey: PostboxViewKey = .savedMessagesIndex(peerId: account.peerId)
var isFirst = true
return account.postbox.combinedView(keys: [viewKey])
|> map { views -> ChatListNodeViewUpdate in
guard let view = views.views[viewKey] as? MessageHistorySavedMessagesIndexView else {
preconditionFailure()
}
} else {
var isFirst = true
return account.postbox.aroundMessageHistoryViewForLocation(.peer(peerId: account.peerId, threadId: nil), anchor: .upperBound, ignoreMessagesInTimestampRange: nil, count: 1000, fixedCombinedReadStates: nil, topTaggedMessageIdNamespaces: Set(), tagMask: nil, appendMessagesFromTheSameGroup: false, namespaces: .not(Set([Namespaces.Message.ScheduledCloud, Namespaces.Message.ScheduledLocal])), orderStatistics: [])
|> map { view, _, _ -> ChatListNodeViewUpdate in
let isLoading = view.isLoading
var items: [EngineChatList.Item] = []
var topMessageByPeerId: [EnginePeer.Id: Message] = [:]
if !isLoading {
for entry in view.entries {
guard let threadId = entry.message.threadId else {
continue
}
let sourcePeerId = PeerId(threadId)
if let currentTopMessage = topMessageByPeerId[sourcePeerId] {
if currentTopMessage.index < entry.index {
topMessageByPeerId[sourcePeerId] = entry.message
}
} else {
topMessageByPeerId[sourcePeerId] = entry.message
}
}
for (_, message) in topMessageByPeerId.sorted(by: { $0.value.index > $1.value.index }) {
guard let threadId = message.threadId else {
continue
}
let sourceId = PeerId(threadId)
var sourcePeer = message.peers[sourceId]
if sourcePeer == nil, let forwardInfo = message.forwardInfo, let authorSignature = forwardInfo.authorSignature {
sourcePeer = TelegramUser(
id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(1)),
accessHash: nil,
firstName: authorSignature,
lastName: nil,
username: nil,
phone: nil,
photo: [],
botInfo: nil,
restrictionInfo: nil,
flags: [],
emojiStatus: nil,
usernames: [],
storiesHidden: nil,
nameColor: nil,
backgroundEmojiId: nil,
profileColor: nil,
profileBackgroundEmojiId: nil
)
}
guard let sourcePeer else {
continue
}
let mappedMessageIndex = MessageIndex(id: MessageId(peerId: sourceId, namespace: message.index.id.namespace, id: message.index.id.id), timestamp: message.index.timestamp)
items.append(EngineChatList.Item(
id: .chatList(sourceId),
index: .chatList(ChatListIndex(pinningIndex: nil, messageIndex: mappedMessageIndex)),
messages: [EngineMessage(message)],
readCounters: nil,
isMuted: false,
draft: nil,
threadData: nil,
renderedPeer: EngineRenderedPeer(peer: EnginePeer(sourcePeer)),
presence: nil,
hasUnseenMentions: false,
hasUnseenReactions: false,
forumTopicData: nil,
topForumTopicItems: [],
hasFailed: false,
isContact: false,
autoremoveTimeout: nil,
storyStats: nil
))
}
var items: [EngineChatList.Item] = []
for item in view.items {
guard let sourcePeer = item.peer else {
continue
}
let list = EngineChatList(
items: items.reversed(),
groupItems: [],
additionalItems: [],
hasEarlier: false,
hasLater: false,
isLoading: isLoading
)
let sourceId = PeerId(item.id)
let type: ViewUpdateType
if isFirst {
type = .Initial
} else {
type = .Generic
var messages: [EngineMessage] = []
if let topMessage = item.topMessage {
messages.append(EngineMessage(topMessage))
}
isFirst = false
return ChatListNodeViewUpdate(list: list, type: type, scrollPosition: nil)
let mappedMessageIndex = MessageIndex(id: MessageId(peerId: sourceId, namespace: item.index.id.namespace, id: item.index.id.id), timestamp: item.index.timestamp)
items.append(EngineChatList.Item(
id: .chatList(sourceId),
index: .chatList(ChatListIndex(pinningIndex: item.pinnedIndex.flatMap(UInt16.init), messageIndex: mappedMessageIndex)),
messages: messages,
readCounters: nil,
isMuted: false,
draft: nil,
threadData: nil,
renderedPeer: EngineRenderedPeer(peer: EnginePeer(sourcePeer)),
presence: nil,
hasUnseenMentions: false,
hasUnseenReactions: false,
forumTopicData: nil,
topForumTopicItems: [],
hasFailed: false,
isContact: false,
autoremoveTimeout: nil,
storyStats: nil
))
}
let list = EngineChatList(
items: items.reversed(),
groupItems: [],
additionalItems: [],
hasEarlier: false,
hasLater: false,
isLoading: view.isLoading
)
let type: ViewUpdateType
if isFirst {
type = .Initial
} else {
type = .Generic
}
isFirst = false
return ChatListNodeViewUpdate(list: list, type: type, scrollPosition: nil)
}
}
}