mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Add global search filtering
This commit is contained in:
parent
9b342df78d
commit
edd2db706b
@ -762,7 +762,30 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
let location: SearchMessagesLocation
|
let location: SearchMessagesLocation
|
||||||
location = .general(tags: nil)
|
let messageTags: MessageTags?
|
||||||
|
if query.hasPrefix("%media ") {
|
||||||
|
messageTags = .photoOrVideo
|
||||||
|
} else if query.hasPrefix("%photo ") {
|
||||||
|
messageTags = .photo
|
||||||
|
} else if query.hasPrefix("%video ") {
|
||||||
|
messageTags = .video
|
||||||
|
} else if query.hasPrefix("%file ") {
|
||||||
|
messageTags = .file
|
||||||
|
} else if query.hasPrefix("%music ") {
|
||||||
|
messageTags = .music
|
||||||
|
} else if query.hasPrefix("%link ") {
|
||||||
|
messageTags = .webPage
|
||||||
|
} else if query.hasPrefix("%gif ") {
|
||||||
|
messageTags = .gif
|
||||||
|
} else {
|
||||||
|
messageTags = nil
|
||||||
|
}
|
||||||
|
location = .general(tags: messageTags)
|
||||||
|
|
||||||
|
var finalQuery = query
|
||||||
|
if let _ = messageTags, let index = finalQuery.firstIndex(of: " ") {
|
||||||
|
finalQuery = String(finalQuery.suffix(from: finalQuery.index(after: index)))
|
||||||
|
}
|
||||||
|
|
||||||
updateSearchContext { _ in
|
updateSearchContext { _ in
|
||||||
return (nil, true)
|
return (nil, true)
|
||||||
@ -771,22 +794,22 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
if filter.contains(.doNotSearchMessages) {
|
if filter.contains(.doNotSearchMessages) {
|
||||||
foundRemoteMessages = .single((([], [:], 0), false))
|
foundRemoteMessages = .single((([], [:], 0), false))
|
||||||
} else {
|
} else {
|
||||||
if !query.isEmpty {
|
if !finalQuery.isEmpty {
|
||||||
addAppLogEvent(postbox: context.account.postbox, time: Date().timeIntervalSince1970, type: "search_global_query", peerId: nil, data: .dictionary([:]))
|
addAppLogEvent(postbox: context.account.postbox, time: Date().timeIntervalSince1970, type: "search_global_query", peerId: nil, data: .dictionary([:]))
|
||||||
}
|
}
|
||||||
|
|
||||||
let searchSignal = searchMessages(account: context.account, location: location, query: query, state: nil, limit: 50)
|
let searchSignal = searchMessages(account: context.account, location: location, query: finalQuery, state: nil, limit: 50)
|
||||||
|> map { result, updatedState -> ChatListSearchMessagesResult in
|
|> map { result, updatedState -> ChatListSearchMessagesResult in
|
||||||
return ChatListSearchMessagesResult(query: query, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState)
|
return ChatListSearchMessagesResult(query: finalQuery, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState)
|
||||||
}
|
}
|
||||||
|
|
||||||
let loadMore = searchContext.get()
|
let loadMore = searchContext.get()
|
||||||
|> mapToSignal { searchContext -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in
|
|> mapToSignal { searchContext -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in
|
||||||
if let searchContext = searchContext {
|
if let searchContext = searchContext {
|
||||||
if let _ = searchContext.loadMoreIndex {
|
if let _ = searchContext.loadMoreIndex {
|
||||||
return searchMessages(account: context.account, location: location, query: query, state: searchContext.result.state, limit: 80)
|
return searchMessages(account: context.account, location: location, query: finalQuery, state: searchContext.result.state, limit: 80)
|
||||||
|> map { result, updatedState -> ChatListSearchMessagesResult in
|
|> map { result, updatedState -> ChatListSearchMessagesResult in
|
||||||
return ChatListSearchMessagesResult(query: query, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState)
|
return ChatListSearchMessagesResult(query: finalQuery, messages: result.messages.sorted(by: { $0.index > $1.index }), readStates: result.readStates, hasMore: !result.completed, state: updatedState)
|
||||||
}
|
}
|
||||||
|> mapToSignal { foundMessages -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in
|
|> mapToSignal { foundMessages -> Signal<(([Message], [PeerId: CombinedPeerReadState], Int32), Bool), NoError> in
|
||||||
updateSearchContext { previous in
|
updateSearchContext { previous in
|
||||||
@ -818,7 +841,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
}
|
}
|
||||||
|
|
||||||
let resolvedMessage = .single(nil)
|
let resolvedMessage = .single(nil)
|
||||||
|> then(context.sharedContext.resolveUrl(account: context.account, url: query)
|
|> then(context.sharedContext.resolveUrl(account: context.account, url: finalQuery)
|
||||||
|> mapToSignal { resolvedUrl -> Signal<Message?, NoError> in
|
|> mapToSignal { resolvedUrl -> Signal<Message?, NoError> in
|
||||||
if case let .channelMessage(peerId, messageId) = resolvedUrl {
|
if case let .channelMessage(peerId, messageId) = resolvedUrl {
|
||||||
return downloadMessage(postbox: context.account.postbox, network: context.account.network, messageId: messageId)
|
return downloadMessage(postbox: context.account.postbox, network: context.account.network, messageId: messageId)
|
||||||
@ -904,7 +927,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
globalExpandType = .none
|
globalExpandType = .none
|
||||||
}
|
}
|
||||||
|
|
||||||
let lowercasedQuery = query.lowercased()
|
let lowercasedQuery = finalQuery.lowercased()
|
||||||
if presentationData.strings.DialogList_SavedMessages.lowercased().hasPrefix(lowercasedQuery) || "saved messages".hasPrefix(lowercasedQuery) {
|
if presentationData.strings.DialogList_SavedMessages.lowercased().hasPrefix(lowercasedQuery) || "saved messages".hasPrefix(lowercasedQuery) {
|
||||||
if !existingPeerIds.contains(accountPeer.id), filteredPeer(accountPeer, accountPeer) {
|
if !existingPeerIds.contains(accountPeer.id), filteredPeer(accountPeer, accountPeer) {
|
||||||
existingPeerIds.insert(accountPeer.id)
|
existingPeerIds.insert(accountPeer.id)
|
||||||
@ -986,8 +1009,8 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if addContact != nil && isViablePhoneNumber(query) {
|
if addContact != nil && isViablePhoneNumber(finalQuery) {
|
||||||
entries.append(.addContact(query, presentationData.theme, presentationData.strings))
|
entries.append(.addContact(finalQuery, presentationData.theme, presentationData.strings))
|
||||||
}
|
}
|
||||||
|
|
||||||
return (entries, isSearching)
|
return (entries, isSearching)
|
||||||
|
@ -96,8 +96,10 @@ public extension MessageTags {
|
|||||||
static let unseenPersonalMessage = MessageTags(rawValue: 1 << 5)
|
static let unseenPersonalMessage = MessageTags(rawValue: 1 << 5)
|
||||||
static let liveLocation = MessageTags(rawValue: 1 << 6)
|
static let liveLocation = MessageTags(rawValue: 1 << 6)
|
||||||
static let gif = MessageTags(rawValue: 1 << 7)
|
static let gif = MessageTags(rawValue: 1 << 7)
|
||||||
|
static let photo = MessageTags(rawValue: 1 << 8)
|
||||||
|
static let video = MessageTags(rawValue: 1 << 9)
|
||||||
|
|
||||||
static let all: MessageTags = [.photoOrVideo, .file, .music, .webPage, .voiceOrInstantVideo, .unseenPersonalMessage, .liveLocation, .gif]
|
static let all: MessageTags = [.photoOrVideo, .file, .music, .webPage, .voiceOrInstantVideo, .unseenPersonalMessage, .liveLocation, .gif, .photo, .video]
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension GlobalMessageTags {
|
public extension GlobalMessageTags {
|
||||||
|
@ -9,6 +9,10 @@ import SyncCore
|
|||||||
func messageFilterForTagMask(_ tagMask: MessageTags) -> Api.MessagesFilter? {
|
func messageFilterForTagMask(_ tagMask: MessageTags) -> Api.MessagesFilter? {
|
||||||
if tagMask == .photoOrVideo {
|
if tagMask == .photoOrVideo {
|
||||||
return Api.MessagesFilter.inputMessagesFilterPhotoVideo
|
return Api.MessagesFilter.inputMessagesFilterPhotoVideo
|
||||||
|
} else if tagMask == .photo {
|
||||||
|
return Api.MessagesFilter.inputMessagesFilterPhotos
|
||||||
|
} else if tagMask == .video {
|
||||||
|
return Api.MessagesFilter.inputMessagesFilterVideo
|
||||||
} else if tagMask == .file {
|
} else if tagMask == .file {
|
||||||
return Api.MessagesFilter.inputMessagesFilterDocument
|
return Api.MessagesFilter.inputMessagesFilterDocument
|
||||||
} else if tagMask == .music {
|
} else if tagMask == .music {
|
||||||
|
@ -192,20 +192,7 @@ public func searchMessages(account: Account, location: SearchMessagesLocation, q
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let filter: Api.MessagesFilter
|
let filter: Api.MessagesFilter = tags.flatMap { messageFilterForTagMask($0) } ?? .inputMessagesFilterEmpty
|
||||||
if let tags = tags {
|
|
||||||
if tags.contains(.file) {
|
|
||||||
filter = .inputMessagesFilterDocument
|
|
||||||
} else if tags.contains(.music) {
|
|
||||||
filter = .inputMessagesFilterMusic
|
|
||||||
} else if tags.contains(.webPage) {
|
|
||||||
filter = .inputMessagesFilterUrl
|
|
||||||
} else {
|
|
||||||
filter = .inputMessagesFilterEmpty
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
filter = .inputMessagesFilterEmpty
|
|
||||||
}
|
|
||||||
remoteSearchResult = account.postbox.transaction { transaction -> (peer: Peer, additionalPeer: Peer?, from: Peer?)? in
|
remoteSearchResult = account.postbox.transaction { transaction -> (peer: Peer, additionalPeer: Peer?, from: Peer?)? in
|
||||||
guard let peer = transaction.getPeer(peerId) else {
|
guard let peer = transaction.getPeer(peerId) else {
|
||||||
return nil
|
return nil
|
||||||
|
@ -30,6 +30,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute],
|
|||||||
if let _ = attachment as? TelegramMediaImage {
|
if let _ = attachment as? TelegramMediaImage {
|
||||||
if !isSecret {
|
if !isSecret {
|
||||||
tags.insert(.photoOrVideo)
|
tags.insert(.photoOrVideo)
|
||||||
|
tags.insert(.photo)
|
||||||
}
|
}
|
||||||
} else if let file = attachment as? TelegramMediaFile {
|
} else if let file = attachment as? TelegramMediaFile {
|
||||||
var refinedTag: MessageTags? = .file
|
var refinedTag: MessageTags? = .file
|
||||||
@ -41,7 +42,7 @@ public func tagsForStoreMessage(incoming: Bool, attributes: [MessageAttribute],
|
|||||||
refinedTag = .voiceOrInstantVideo
|
refinedTag = .voiceOrInstantVideo
|
||||||
} else {
|
} else {
|
||||||
if !isSecret {
|
if !isSecret {
|
||||||
refinedTag = .photoOrVideo
|
refinedTag = [.photoOrVideo, .video]
|
||||||
} else {
|
} else {
|
||||||
refinedTag = nil
|
refinedTag = nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user