mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix instant view opening from search results
This commit is contained in:
parent
2ec1d5c78e
commit
7c7760fc5d
@ -51,6 +51,7 @@ static_library(
|
||||
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
||||
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
||||
"//submodules/GalleryData:GalleryData",
|
||||
"//submodules/InstantPageUI:InstantPageUI",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -50,6 +50,7 @@ swift_library(
|
||||
"//submodules/ChatMessageInteractiveMediaBadge:ChatMessageInteractiveMediaBadge",
|
||||
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
||||
"//submodules/GalleryData:GalleryData",
|
||||
"//submodules/InstantPageUI:InstantPageUI",
|
||||
],
|
||||
visibility = [
|
||||
"//visibility:public",
|
||||
|
@ -26,6 +26,7 @@ import PresentationDataUtils
|
||||
import AnimatedStickerNode
|
||||
import AppBundle
|
||||
import GalleryData
|
||||
import InstantPageUI
|
||||
|
||||
private final class PassthroughContainerNode: ASDisplayNode {
|
||||
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
|
||||
@ -1451,8 +1452,13 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
||||
self?.view.window?.endEditing(true)
|
||||
}, contentContext: nil)
|
||||
})
|
||||
}, openInstantPage: { message, data in
|
||||
|
||||
}, openInstantPage: { [weak self] message, data in
|
||||
if let strongSelf = self {
|
||||
if let (webpage, anchor) = instantPageAndAnchor(message: message) {
|
||||
let pageController = InstantPageController(context: context, webPage: webpage, sourcePeerType: .channel, anchor: anchor)
|
||||
navigationController?.pushViewController(pageController)
|
||||
}
|
||||
}
|
||||
}, longTap: { action, message in
|
||||
|
||||
}, getHiddenMedia: {
|
||||
|
@ -9,6 +9,56 @@ import TelegramPresentationData
|
||||
import TelegramUIPreferences
|
||||
import AccountContext
|
||||
|
||||
public func instantPageAndAnchor(message: Message) -> (TelegramMediaWebpage, String?)? {
|
||||
for media in message.media {
|
||||
if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content {
|
||||
if let _ = content.instantPage {
|
||||
var textUrl: String?
|
||||
if let pageUrl = URL(string: content.url) {
|
||||
inner: for attribute in message.attributes {
|
||||
if let attribute = attribute as? TextEntitiesMessageAttribute {
|
||||
for entity in attribute.entities {
|
||||
switch entity.type {
|
||||
case let .TextUrl(url):
|
||||
if let parsedUrl = URL(string: url) {
|
||||
if pageUrl.scheme == parsedUrl.scheme && pageUrl.host == parsedUrl.host && pageUrl.path == parsedUrl.path {
|
||||
textUrl = url
|
||||
}
|
||||
}
|
||||
case .Url:
|
||||
let nsText = message.text as NSString
|
||||
var entityRange = NSRange(location: entity.range.lowerBound, length: entity.range.upperBound - entity.range.lowerBound)
|
||||
if entityRange.location + entityRange.length > nsText.length {
|
||||
entityRange.location = max(0, nsText.length - entityRange.length)
|
||||
entityRange.length = nsText.length - entityRange.location
|
||||
}
|
||||
let url = nsText.substring(with: entityRange)
|
||||
if let parsedUrl = URL(string: url) {
|
||||
if pageUrl.scheme == parsedUrl.scheme && pageUrl.host == parsedUrl.host && pageUrl.path == parsedUrl.path {
|
||||
textUrl = url
|
||||
}
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
break inner
|
||||
}
|
||||
}
|
||||
}
|
||||
var anchor: String?
|
||||
if let textUrl = textUrl, let anchorRange = textUrl.range(of: "#") {
|
||||
anchor = String(textUrl[anchorRange.upperBound...])
|
||||
}
|
||||
|
||||
return (webpage, anchor)
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
public final class InstantPageController: ViewController {
|
||||
private let context: AccountContext
|
||||
private var webPage: TelegramMediaWebpage
|
||||
|
@ -239,52 +239,9 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
|
||||
}
|
||||
|
||||
func openChatInstantPage(context: AccountContext, message: Message, sourcePeerType: MediaAutoDownloadPeerType?, navigationController: NavigationController) {
|
||||
for media in message.media {
|
||||
if let webpage = media as? TelegramMediaWebpage, case let .Loaded(content) = webpage.content {
|
||||
if let _ = content.instantPage {
|
||||
var textUrl: String?
|
||||
if let pageUrl = URL(string: content.url) {
|
||||
inner: for attribute in message.attributes {
|
||||
if let attribute = attribute as? TextEntitiesMessageAttribute {
|
||||
for entity in attribute.entities {
|
||||
switch entity.type {
|
||||
case let .TextUrl(url):
|
||||
if let parsedUrl = URL(string: url) {
|
||||
if pageUrl.scheme == parsedUrl.scheme && pageUrl.host == parsedUrl.host && pageUrl.path == parsedUrl.path {
|
||||
textUrl = url
|
||||
}
|
||||
}
|
||||
case .Url:
|
||||
let nsText = message.text as NSString
|
||||
var entityRange = NSRange(location: entity.range.lowerBound, length: entity.range.upperBound - entity.range.lowerBound)
|
||||
if entityRange.location + entityRange.length > nsText.length {
|
||||
entityRange.location = max(0, nsText.length - entityRange.length)
|
||||
entityRange.length = nsText.length - entityRange.location
|
||||
}
|
||||
let url = nsText.substring(with: entityRange)
|
||||
if let parsedUrl = URL(string: url) {
|
||||
if pageUrl.scheme == parsedUrl.scheme && pageUrl.host == parsedUrl.host && pageUrl.path == parsedUrl.path {
|
||||
textUrl = url
|
||||
}
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
break inner
|
||||
}
|
||||
}
|
||||
}
|
||||
var anchor: String?
|
||||
if let textUrl = textUrl, let anchorRange = textUrl.range(of: "#") {
|
||||
anchor = String(textUrl[anchorRange.upperBound...])
|
||||
}
|
||||
|
||||
let pageController = InstantPageController(context: context, webPage: webpage, sourcePeerType: sourcePeerType ?? .channel, anchor: anchor)
|
||||
navigationController.pushViewController(pageController)
|
||||
}
|
||||
break
|
||||
}
|
||||
if let (webpage, anchor) = instantPageAndAnchor(message: message) {
|
||||
let pageController = InstantPageController(context: context, webPage: webpage, sourcePeerType: sourcePeerType ?? .channel, anchor: anchor)
|
||||
navigationController.pushViewController(pageController)
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user