mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 22:25:57 +00:00
[WIP] Saved messages
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user