Attachment menu improvements

This commit is contained in:
Ilya Laktyushin
2022-02-21 10:11:53 +03:00
parent 2efbb9170f
commit d811f5f160
80 changed files with 6104 additions and 1273 deletions

View File

@@ -7,10 +7,10 @@ import MtProtoKit
public enum GetMessagesStrategy {
case local
case cloud
case cloud(skipLocal: Bool)
}
func _internal_getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Postbox, network: Network, accountPeerId: PeerId, strategy: GetMessagesStrategy = .cloud) -> Signal <[Message], NoError> {
func _internal_getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Postbox, network: Network, accountPeerId: PeerId, strategy: GetMessagesStrategy = .cloud(skipLocal: false)) -> Signal <[Message], NoError> {
let postboxSignal = postbox.transaction { transaction -> ([Message], Set<MessageId>, SimpleDictionary<PeerId, Peer>) in
var ids = messageIds
@@ -22,21 +22,29 @@ func _internal_getMessagesLoadIfNecessary(_ messageIds: [MessageId], postbox: Po
var messages:[Message] = []
var missingMessageIds:Set<MessageId> = Set()
var supportPeers:SimpleDictionary<PeerId, Peer> = SimpleDictionary()
var supportPeers: SimpleDictionary<PeerId, Peer> = SimpleDictionary()
for messageId in ids {
if let message = transaction.getMessage(messageId) {
messages.append(message)
} else {
if case let .cloud(skipLocal) = strategy, skipLocal {
missingMessageIds.insert(messageId)
if let peer = transaction.getPeer(messageId.peerId) {
supportPeers[messageId.peerId] = peer
}
} else {
if let message = transaction.getMessage(messageId) {
messages.append(message)
} else {
missingMessageIds.insert(messageId)
if let peer = transaction.getPeer(messageId.peerId) {
supportPeers[messageId.peerId] = peer
}
}
}
}
return (messages, missingMessageIds, supportPeers)
}
if strategy == .cloud {
if case .cloud = strategy {
return postboxSignal
|> mapToSignal { (existMessages, missingMessageIds, supportPeers) in

View File

@@ -10,7 +10,7 @@ public enum SearchMessagesLocation: Equatable {
case group(groupId: PeerGroupId, tags: MessageTags?, minDate: Int32?, maxDate: Int32?)
case peer(peerId: PeerId, fromId: PeerId?, tags: MessageTags?, topMsgId: MessageId?, minDate: Int32?, maxDate: Int32?)
case publicForwards(messageId: MessageId, datacenterId: Int?)
case recentDocuments
case sentMedia(tags: MessageTags?)
}
private struct SearchMessagesPeerState: Equatable {
@@ -339,42 +339,20 @@ func _internal_searchMessages(account: Account, location: SearchMessagesLocation
return .single((nil, nil))
}
}
case .recentDocuments:
let filter: Api.MessagesFilter = messageFilterForTagMask(.file) ?? .inputMessagesFilterEmpty
let peerId = account.peerId
case let .sentMedia(tags):
let filter: Api.MessagesFilter = tags.flatMap { messageFilterForTagMask($0) } ?? .inputMessagesFilterEmpty
remoteSearchResult = account.postbox.transaction { transaction -> Peer? in
guard let peer = transaction.getPeer(peerId) else {
return nil
let peerMessages: Signal<Api.messages.Messages?, NoError>
if let completed = state?.main.completed, completed {
peerMessages = .single(nil)
} else {
peerMessages = account.network.request(Api.functions.messages.searchSentMedia(q: query, filter: filter, limit: limit))
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.messages.Messages?, NoError> in
return .single(nil)
}
return peer
}
|> mapToSignal { peer -> Signal<(Api.messages.Messages?, Api.messages.Messages?), NoError> in
guard let peer = peer else {
return .single((nil, nil))
}
let inputPeer = Api.InputPeer.inputPeerEmpty
var flags: Int32 = 0
let fromInputPeer = apiInputPeer(peer)
flags |= (1 << 0)
let peerMessages: Signal<Api.messages.Messages?, NoError>
if let completed = state?.main.completed, completed {
peerMessages = .single(nil)
} else {
let lowerBound = state?.main.messages.last.flatMap({ $0.index })
let signal = account.network.request(Api.functions.messages.search(flags: flags, peer: inputPeer, q: query, fromId: fromInputPeer, topMsgId: nil, filter: filter, minDate: 0, maxDate: (Int32.max - 1), offsetId: lowerBound?.id.id ?? 0, addOffset: 0, limit: limit, maxId: Int32.max - 1, minId: 0, hash: 0))
peerMessages = signal
|> map(Optional.init)
|> `catch` { _ -> Signal<Api.messages.Messages?, NoError> in
return .single(nil)
}
}
return combineLatest(peerMessages, .single(nil))
}
remoteSearchResult = combineLatest(peerMessages, .single(nil))
}
return remoteSearchResult

View File

@@ -120,7 +120,7 @@ public extension TelegramEngine {
return _internal_markAllChatsAsRead(postbox: self.account.postbox, network: self.account.network, stateManager: self.account.stateManager)
}
public func getMessagesLoadIfNecessary(_ messageIds: [MessageId], strategy: GetMessagesStrategy = .cloud) -> Signal <[Message], NoError> {
public func getMessagesLoadIfNecessary(_ messageIds: [MessageId], strategy: GetMessagesStrategy = .cloud(skipLocal: false)) -> Signal <[Message], NoError> {
return _internal_getMessagesLoadIfNecessary(messageIds, postbox: self.account.postbox, network: self.account.network, accountPeerId: self.account.peerId, strategy: strategy)
}

View File

@@ -83,6 +83,8 @@ public enum ReportReason: Equatable {
case childAbuse
case copyright
case irrelevantLocation
case illegalDrugs
case personalDetails
case custom
}
@@ -103,6 +105,10 @@ private extension ReportReason {
return .inputReportReasonCopyright
case .irrelevantLocation:
return .inputReportReasonGeoIrrelevant
case .illegalDrugs:
return .inputReportReasonIllegalDrugs
case .personalDetails:
return .inputReportReasonPersonalDetails
case .custom:
return .inputReportReasonOther
}