diff --git a/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift b/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift index f6656ad29b..dc3d54acc7 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/StoreMessage_Telegram.swift @@ -519,6 +519,8 @@ func mediaAreaFromApiMediaArea(_ mediaArea: Api.MediaArea) -> MediaArea? { } else { return nil } + case let .mediaAreaUrl(coordinates, url): + return .url(coordinates: coodinatesFromApiMediaAreaCoordinates(coordinates), url: url) case let .mediaAreaChannelPost(coordinates, channelId, messageId): return .channelMessage(coordinates: coodinatesFromApiMediaAreaCoordinates(coordinates), messageId: EngineMessage.Id(peerId: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(channelId)), namespace: Namespaces.Message.Cloud, id: messageId)) } @@ -551,6 +553,8 @@ func apiMediaAreasFromMediaAreas(_ mediaAreas: [MediaArea], transaction: Transac if let peer = transaction.getPeer(messageId.peerId), let inputChannel = apiInputChannel(peer) { apiMediaAreas.append(.inputMediaAreaChannelPost(coordinates: inputCoordinates, channel: inputChannel, msgId: messageId.id)) } + case let .url(_, url): + apiMediaAreas.append(.mediaAreaUrl(coordinates: inputCoordinates, url: url)) } } return apiMediaAreas diff --git a/submodules/TelegramCore/Sources/State/ManagedSynchronizeChatInputStateOperations.swift b/submodules/TelegramCore/Sources/State/ManagedSynchronizeChatInputStateOperations.swift index 3f85200f21..3277233f4b 100644 --- a/submodules/TelegramCore/Sources/State/ManagedSynchronizeChatInputStateOperations.swift +++ b/submodules/TelegramCore/Sources/State/ManagedSynchronizeChatInputStateOperations.swift @@ -211,7 +211,7 @@ private func synchronizeChatInputState(transaction: Transaction, postbox: Postbo replyTo = .inputReplyToMessage(flags: innerFlags, replyToMsgId: topMsgId, topMsgId: topMsgId, replyToPeerId: nil, quoteText: nil, quoteEntities: nil, quoteOffset: nil) } - return network.request(Api.functions.messages.saveDraft(flags: flags, replyTo: replyTo, peer: inputPeer, message: inputState?.text ?? "", entities: apiEntitiesFromMessageTextEntities(inputState?.entities ?? [], associatedPeers: SimpleDictionary()), media: nil)) + return network.request(Api.functions.messages.saveDraft(flags: flags, replyTo: replyTo, peer: inputPeer, message: inputState?.text ?? "", entities: apiEntitiesFromMessageTextEntities(inputState?.entities ?? [], associatedPeers: SimpleDictionary()), media: nil, effect: nil)) |> delay(2.0, queue: Queue.concurrentDefaultQueue()) |> `catch` { _ -> Signal in return .single(.boolFalse) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ClearCloudDrafts.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ClearCloudDrafts.swift index 5a4955128c..558e7408b9 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/ClearCloudDrafts.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/ClearCloudDrafts.swift @@ -50,7 +50,7 @@ func _internal_clearCloudDraftsInteractively(postbox: Postbox, network: Network, innerFlags |= 1 << 0 replyTo = .inputReplyToMessage(flags: innerFlags, replyToMsgId: 0, topMsgId: topMsgId, replyToPeerId: nil, quoteText: nil, quoteEntities: nil, quoteOffset: nil) } - signals.append(network.request(Api.functions.messages.saveDraft(flags: flags, replyTo: replyTo, peer: inputPeer, message: "", entities: nil, media: nil)) + signals.append(network.request(Api.functions.messages.saveDraft(flags: flags, replyTo: replyTo, peer: inputPeer, message: "", entities: nil, media: nil, effect: nil)) |> `catch` { _ -> Signal in return .single(.boolFalse) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/MediaArea.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/MediaArea.swift index 7f810cccac..d388e490a6 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/MediaArea.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/MediaArea.swift @@ -125,7 +125,7 @@ public enum MediaArea: Codable, Equatable { case venue(coordinates: Coordinates, venue: Venue) case reaction(coordinates: Coordinates, reaction: MessageReaction.Reaction, flags: ReactionFlags) case channelMessage(coordinates: Coordinates, messageId: EngineMessage.Id) - + case url(coordinates: Coordinates, url: String) public struct ReactionFlags: OptionSet { public var rawValue: Int32 @@ -146,6 +146,7 @@ public enum MediaArea: Codable, Equatable { case venue case reaction case channelMessage + case url } public enum DecodingError: Error { @@ -172,6 +173,10 @@ public enum MediaArea: Codable, Equatable { let coordinates = try container.decode(MediaArea.Coordinates.self, forKey: .coordinates) let messageId = try container.decode(MessageId.self, forKey: .value) self = .channelMessage(coordinates: coordinates, messageId: messageId) + case .url: + let coordinates = try container.decode(MediaArea.Coordinates.self, forKey: .coordinates) + let url = try container.decode(String.self, forKey: .value) + self = .url(coordinates: coordinates, url: url) } } @@ -192,6 +197,10 @@ public enum MediaArea: Codable, Equatable { try container.encode(MediaAreaType.channelMessage.rawValue, forKey: .type) try container.encode(coordinates, forKey: .coordinates) try container.encode(messageId, forKey: .value) + case let .url(coordinates, url): + try container.encode(MediaAreaType.url.rawValue, forKey: .type) + try container.encode(coordinates, forKey: .coordinates) + try container.encode(url, forKey: .value) } } } @@ -205,6 +214,8 @@ public extension MediaArea { return coordinates case let .channelMessage(coordinates, _): return coordinates + case let .url(coordinates, _): + return coordinates } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift index 11891ef7b2..035bd4af42 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift @@ -1260,10 +1260,16 @@ public final class PeerStoryListContext: StoryListContext { } public final class SearchStoryListContext: StoryListContext { + + public enum Source { + case hashtag(String) + case venue(provider: String, id: String) + } + private final class Impl { private let queue: Queue private let account: Account - private let query: String + private let source: Source private let statePromise = Promise() private var stateValue: State { @@ -1282,10 +1288,10 @@ public final class SearchStoryListContext: StoryListContext { private var completionCallbacksByToken: [AnyHashable: [() -> Void]] = [:] - init(queue: Queue, account: Account, query: String) { + init(queue: Queue, account: Account, source: Source) { self.queue = queue self.account = account - self.query = query + self.source = source self.stateValue = State(peerReference: nil, items: [], pinnedIds: Set(), totalCount: 0, loadMoreToken: AnyHashable(""), isCached: false, hasCache: false, allEntityFiles: [:]) self.statePromise.set(.single(self.stateValue)) @@ -1320,14 +1326,26 @@ public final class SearchStoryListContext: StoryListContext { let account = self.account let accountPeerId = account.peerId - let searchHashtag: String - if self.query.hasPrefix("#") { - searchHashtag = String(self.query[self.query.index(after: self.query.startIndex)...]) - } else { - searchHashtag = self.query + var searchHashtag: String? = nil + var venueProvider: String? = nil + var venueId: String? = nil + + var flags: Int32 = 0 + switch source { + case let .hashtag(query): + if query.hasPrefix("#") { + searchHashtag = String(query[query.index(after: query.startIndex)...]) + } else { + searchHashtag = query + } + flags |= (1 << 0) + case .venue(let provider, let id): + venueProvider = provider + venueId = id + flags |= (1 << 1) } - self.requestDisposable = (account.network.request(Api.functions.stories.searchPosts(hashtag: searchHashtag, offset: "", limit: Int32(limit))) + self.requestDisposable = (account.network.request(Api.functions.stories.searchPosts(flags: flags, hashtag: searchHashtag, venueProvider: venueProvider, venueId: venueId, offset: "", limit: Int32(limit))) |> map { result -> Api.stories.FoundStories? in return result } @@ -1455,11 +1473,11 @@ public final class SearchStoryListContext: StoryListContext { private let queue: Queue private let impl: QueueLocalObject - public init(account: Account, query: String) { + public init(account: Account, source: Source) { let queue = Queue.mainQueue() self.queue = queue self.impl = QueueLocalObject(queue: queue, generate: { - return Impl(queue: queue, account: account, query: query) + return Impl(queue: queue, account: account, source: source) }) }