diff --git a/submodules/AttachmentUI/Sources/AttachmentContainer.swift b/submodules/AttachmentUI/Sources/AttachmentContainer.swift index 2ef790f35d..406ab1f2d2 100644 --- a/submodules/AttachmentUI/Sources/AttachmentContainer.swift +++ b/submodules/AttachmentUI/Sources/AttachmentContainer.swift @@ -123,6 +123,9 @@ final class AttachmentContainer: ASDisplayNode, UIGestureRecognizerDelegate { } return true } + if gestureRecognizer is UIPanGestureRecognizer && otherGestureRecognizer is UILongPressGestureRecognizer { + return true + } return false } diff --git a/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift b/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift index e21bec652d..209981733e 100644 --- a/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatButtonKeyboardInputNode.swift @@ -215,9 +215,8 @@ final class ChatButtonKeyboardInputNode: ChatInputNode { self.controllerInteraction.openPollCreation(isQuiz) case let .openUserProfile(peerId): self.controllerInteraction.openPeer(peerId, .info, nil, nil) - case let .openWebView(startParam): - print(startParam) - break + case let .openWebView(url): + self.controllerInteraction.openWebView(url) } if dismissIfOnce { if let message = self.message { diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 50802c5d03..20da27c1a1 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -3299,6 +3299,77 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } strongSelf.openResolved(result: .join(joinHash), sourceMessageId: nil) + }, openWebView: { [weak self] url in + guard let strongSelf = self, let peerId = strongSelf.chatLocation.peerId, let peer = strongSelf.presentationInterfaceState.renderedPeer?.peer else { + return + } + + let botName = EnginePeer(peer).displayTitle(strings: strongSelf.presentationData.strings, displayOrder: strongSelf.presentationData.nameDisplayOrder) + + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { + return $0.updatedTitlePanelContext { + if !$0.contains(where: { + switch $0 { + case .requestInProgress: + return true + default: + return false + } + }) { + var updatedContexts = $0 + updatedContexts.append(.requestInProgress) + return updatedContexts.sorted() + } + return $0 + } + }) + + let updateProgress = { [weak self] in + Queue.mainQueue().async { + if let strongSelf = self { + strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, { + return $0.updatedTitlePanelContext { + if let index = $0.firstIndex(where: { + switch $0 { + case .requestInProgress: + return true + default: + return false + } + }) { + var updatedContexts = $0 + updatedContexts.remove(at: index) + return updatedContexts + } + return $0 + } + }) + } + } + } + + strongSelf.messageActionCallbackDisposable.set(((strongSelf.context.engine.messages.requestWebView(peerId: peerId, botId: peerId, url: url, themeParams: nil) + |> afterDisposed { + updateProgress() + }) + |> deliverOnMainQueue).start(next: { [weak self] result in + guard let strongSelf = self else { + return + } + switch result { + case let .webViewResult(queryId, url): + let controller = WebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peerId: peerId, botId: peerId, botName: botName, url: url, queryId: queryId) + controller.navigationPresentation = .modal + strongSelf.push(controller) + case .requestConfirmation: + break + } + }, error: { [weak self] error in + if let strongSelf = self { + strongSelf.present(textAlertController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, title: nil, text: strongSelf.presentationData.strings.Login_UnknownError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: { + })]), in: .window(.root)) + } + })) }, requestMessageUpdate: { [weak self] id in if let strongSelf = self { strongSelf.chatDisplayNode.historyNode.requestMessageUpdate(id) @@ -10704,7 +10775,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G completion(controller, nil) strongSelf.controllerNavigationDisposable.set(nil) case let .app(botId, botName, _): - let controller = WebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peerId: peer.id, botId: botId, botName: botName, url: nil) + let controller = WebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peerId: peer.id, botId: botId, botName: botName, url: nil, queryId: nil) completion(controller, nil) strongSelf.controllerNavigationDisposable.set(nil) } diff --git a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift index acff7b34b1..0b72c4a1af 100644 --- a/submodules/TelegramUI/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Sources/ChatControllerInteraction.swift @@ -131,6 +131,7 @@ public final class ChatControllerInteraction { let commitEmojiInteraction: (MessageId, String, EmojiInteraction, TelegramMediaFile) -> Void let openLargeEmojiInfo: (String, String?, TelegramMediaFile) -> Void let openJoinLink: (String) -> Void + let openWebView: (String) -> Void let requestMessageUpdate: (MessageId) -> Void let cancelInteractiveKeyboardGestures: () -> Void @@ -230,6 +231,7 @@ public final class ChatControllerInteraction { commitEmojiInteraction: @escaping (MessageId, String, EmojiInteraction, TelegramMediaFile) -> Void, openLargeEmojiInfo: @escaping (String, String?, TelegramMediaFile) -> Void, openJoinLink: @escaping (String) -> Void, + openWebView: @escaping (String) -> Void, requestMessageUpdate: @escaping (MessageId) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, automaticMediaDownloadSettings: MediaAutoDownloadSettings, @@ -315,6 +317,7 @@ public final class ChatControllerInteraction { self.commitEmojiInteraction = commitEmojiInteraction self.openLargeEmojiInfo = openLargeEmojiInfo self.openJoinLink = openJoinLink + self.openWebView = openWebView self.requestMessageUpdate = requestMessageUpdate self.cancelInteractiveKeyboardGestures = cancelInteractiveKeyboardGestures @@ -374,6 +377,7 @@ public final class ChatControllerInteraction { }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/TelegramUI/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Sources/ChatMessageItemView.swift index d8dd36e520..7a2b8a9d07 100644 --- a/submodules/TelegramUI/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Sources/ChatMessageItemView.swift @@ -854,9 +854,8 @@ public class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol break case let .openUserProfile(peerId): item.controllerInteraction.openPeer(peerId, .info, nil, nil) - case let .openWebView(startParam): - print(startParam) - break + case let .openWebView(url): + item.controllerInteraction.openWebView(url) } } } diff --git a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift index e89f628475..7315816a94 100644 --- a/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Sources/ChatRecentActionsControllerNode.swift @@ -532,6 +532,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: self.automaticMediaDownloadSettings, diff --git a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift index 66cc0c9175..67413618cb 100644 --- a/submodules/TelegramUI/Sources/DrawingStickersScreen.swift +++ b/submodules/TelegramUI/Sources/DrawingStickersScreen.swift @@ -159,6 +159,7 @@ private final class DrawingStickersScreenNode: ViewControllerTracingNode { }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift index 9026c3295d..f7a18f821c 100644 --- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift @@ -151,6 +151,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, pollActionState: ChatInterfacePollActionState(), stickerSettings: ChatInterfaceStickerSettings(loopAnimatedStickers: false), presentationContext: ChatPresentationContext(backgroundNode: nil)) diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 3084e13b98..0e7f8b6b9a 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -2266,6 +2266,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index 8c00a2f4b8..15a4da6265 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1325,6 +1325,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { }, commitEmojiInteraction: { _, _, _, _ in }, openLargeEmojiInfo: { _, _, _ in }, openJoinLink: { _ in + }, openWebView: { _ in }, requestMessageUpdate: { _ in }, cancelInteractiveKeyboardGestures: { }, automaticMediaDownloadSettings: MediaAutoDownloadSettings.defaultSettings, diff --git a/submodules/UrlHandling/Sources/UrlHandling.swift b/submodules/UrlHandling/Sources/UrlHandling.swift index 601629c8cd..1639c6f13f 100644 --- a/submodules/UrlHandling/Sources/UrlHandling.swift +++ b/submodules/UrlHandling/Sources/UrlHandling.swift @@ -42,7 +42,7 @@ extension ResolvedBotAdminRights { if components.contains("pin_messages") { rawValue |= ResolvedBotAdminRights.pinMessages.rawValue } - if components.contains("promotѲe_members") { + if components.contains("promote_members") { rawValue |= ResolvedBotAdminRights.promoteMembers.rawValue } if components.contains("manage_video_chats") { diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index f4e3a61f33..6f9623aec6 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -29,10 +29,14 @@ private class WeakGameScriptMessageHandler: NSObject, WKScriptMessageHandler { } private func generateThemeParams(_ presentationTheme: PresentationTheme) -> [String: Any] { + var backgroundColor = presentationTheme.list.plainBackgroundColor.rgb + if backgroundColor == 0x000000 { + backgroundColor = presentationTheme.list.itemBlocksBackgroundColor.rgb + } return [ - "bg_color": Int32(bitPattern: presentationTheme.list.plainBackgroundColor.rgb), + "bg_color": Int32(bitPattern: backgroundColor), "text_color": Int32(bitPattern: presentationTheme.list.itemPrimaryTextColor.rgb), - "hint_color": Int32(bitPattern: presentationTheme.list.blocksBackgroundColor.rgb), + "hint_color": Int32(bitPattern: presentationTheme.list.itemSecondaryTextColor.rgb), "link_color": Int32(bitPattern: presentationTheme.list.itemAccentColor.rgb), "button_color": Int32(bitPattern: presentationTheme.list.itemCheckColors.fillColor.rgb), "button_text_color": Int32(bitPattern: presentationTheme.list.itemCheckColors.foregroundColor.rgb) @@ -45,7 +49,7 @@ public final class WebAppController: ViewController, AttachmentContainable { public var updateTabBarAlpha: (CGFloat, ContainedViewLayoutTransition) -> Void = { _, _ in } public var cancelPanGesture: () -> Void = { } - private class Node: ViewControllerTracingNode { + private class Node: ViewControllerTracingNode, UIScrollViewDelegate { private weak var controller: WebAppController? private var webView: WKWebView? @@ -55,7 +59,7 @@ public final class WebAppController: ViewController, AttachmentContainable { private let present: (ViewController, Any?) -> Void private var queryId: Int64? - init(context: AccountContext, controller: WebAppController, presentationData: PresentationData, peerId: PeerId, botId: PeerId, url: String?, present: @escaping (ViewController, Any?) -> Void) { + init(context: AccountContext, controller: WebAppController, presentationData: PresentationData, peerId: PeerId, botId: PeerId, url: String?, queryId: Int64?, present: @escaping (ViewController, Any?) -> Void) { self.context = context self.controller = controller self.presentationData = presentationData @@ -65,24 +69,30 @@ public final class WebAppController: ViewController, AttachmentContainable { self.backgroundColor = .white + let configuration = WKWebViewConfiguration() + let userController = WKUserContentController() + let js = "var TelegramWebviewProxyProto = function() {}; " + "TelegramWebviewProxyProto.prototype.postEvent = function(eventName, eventData) { " + "window.webkit.messageHandlers.performAction.postMessage({'eventName': eventName, 'eventData': eventData}); " + "}; " + "var TelegramWebviewProxy = new TelegramWebviewProxyProto();" - - let configuration = WKWebViewConfiguration() - let userController = WKUserContentController() - + let userScript = WKUserScript(source: js, injectionTime: .atDocumentStart, forMainFrameOnly: false) userController.addUserScript(userScript) - userController.add(WeakGameScriptMessageHandler { [weak self] message in if let strongSelf = self { strongSelf.handleScriptMessage(message) } }, name: "performAction") + let selectionString = "var css = '*{-webkit-touch-callout:none;-webkit-user-select:none}';" + + " var head = document.head || document.getElementsByTagName('head')[0];" + + " var style = document.createElement('style'); style.type = 'text/css';" + + " style.appendChild(document.createTextNode(css)); head.appendChild(style);" + let selectionScript: WKUserScript = WKUserScript(source: selectionString, injectionTime: .atDocumentEnd, forMainFrameOnly: true) + userController.addUserScript(selectionScript) + configuration.userContentController = userController configuration.allowsInlineMediaPlayback = true @@ -104,25 +114,39 @@ public final class WebAppController: ViewController, AttachmentContainable { webView.interactiveTransitionGestureRecognizerTest = { point -> Bool in return point.x > 30.0 } + webView.allowsBackForwardNavigationGestures = false + webView.scrollView.delegate = self self.view.addSubview(webView) self.webView = webView - let _ = (context.engine.messages.requestWebView(peerId: peerId, botId: botId, url: url, themeParams: generateThemeParams(presentationData.theme)) - |> deliverOnMainQueue).start(next: { [weak self] result in - guard let strongSelf = self else { - return + if let url = url, let queryId = queryId { + self.queryId = queryId + if let parsedUrl = URL(string: url) { + self.webView?.load(URLRequest(url: parsedUrl)) } - switch result { - case let .webViewResult(queryId, url): - if let parsedUrl = URL(string: url) { - strongSelf.queryId = queryId - strongSelf.webView?.load(URLRequest(url: parsedUrl)) - } - case .requestConfirmation: - break - } - }) + } else { + let _ = (context.engine.messages.requestWebView(peerId: peerId, botId: botId, url: url, themeParams: generateThemeParams(presentationData.theme)) + |> deliverOnMainQueue).start(next: { [weak self] result in + guard let strongSelf = self else { + return + } + switch result { + case let .webViewResult(queryId, url): + if let parsedUrl = URL(string: url) { + strongSelf.queryId = queryId + strongSelf.webView?.load(URLRequest(url: parsedUrl)) + } + case .requestConfirmation: + break + } + }) + } + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + let contentOffset = scrollView.contentOffset.y + self.controller?.navigationBar?.updateBackgroundAlpha(min(30.0, contentOffset) / 30.0, transition: .immediate) } func containerLayoutUpdated(_ layout: ContainerViewLayout, navigationBarHeight: CGFloat, transition: ContainedViewLayoutTransition) { @@ -220,22 +244,28 @@ public final class WebAppController: ViewController, AttachmentContainable { private let peerId: PeerId private let botId: PeerId private let url: String? + private let queryId: Int64? private var presentationData: PresentationData fileprivate let updatedPresentationData: (initial: PresentationData, signal: Signal)? private var presentationDataDisposable: Disposable? - public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, botId: PeerId, botName: String, url: String?) { + public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, peerId: PeerId, botId: PeerId, botName: String, url: String?, queryId: Int64?) { self.context = context self.peerId = peerId self.botId = botId self.url = url + self.queryId = queryId self.updatedPresentationData = updatedPresentationData self.presentationData = updatedPresentationData?.initial ?? context.sharedContext.currentPresentationData.with { $0 } var theme = NavigationBarTheme(rootControllerTheme: self.presentationData.theme) - theme = theme.withUpdatedBackgroundColor(self.presentationData.theme.list.plainBackgroundColor) + if self.presentationData.theme.list.plainBackgroundColor.rgb == 0x000000 { + theme = theme.withUpdatedBackgroundColor(self.presentationData.theme.list.itemBlocksBackgroundColor) + } else { + theme = theme.withUpdatedBackgroundColor(self.presentationData.theme.list.plainBackgroundColor) + } let navigationBarPresentationData = NavigationBarPresentationData(theme: theme, strings: NavigationBarStrings(back: "", close: "")) self.moreButtonNode = MoreButtonNode(theme: self.presentationData.theme) @@ -267,7 +297,11 @@ public final class WebAppController: ViewController, AttachmentContainable { strongSelf.presentationData = presentationData var theme = NavigationBarTheme(rootControllerTheme: presentationData.theme) - theme = theme.withUpdatedBackgroundColor(presentationData.theme.list.plainBackgroundColor) + if presentationData.theme.list.plainBackgroundColor.rgb == 0x000000 { + theme = theme.withUpdatedBackgroundColor(presentationData.theme.list.itemBlocksBackgroundColor) + } else { + theme = theme.withUpdatedBackgroundColor(presentationData.theme.list.plainBackgroundColor) + } let navigationBarPresentationData = NavigationBarPresentationData(theme: theme, strings: NavigationBarStrings(back: "", close: "")) strongSelf.navigationBar?.updatePresentationData(navigationBarPresentationData) strongSelf.titleView?.theme = presentationData.theme @@ -296,47 +330,60 @@ public final class WebAppController: ViewController, AttachmentContainable { @objc private func morePressed(node: ContextReferenceContentNode, gesture: ContextGesture?) { let context = self.context - var items: [ContextMenuItem] = [] + let presentationData = self.presentationData - if self.botId != self.peerId { - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.WebApp_OpenBot, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Bots"), color: theme.contextMenu.primaryColor) + let peerId = self.peerId + let botId = self.botId + + let items = context.engine.messages.attachMenuBots() + |> map { attachMenuBots -> ContextController.Items in + var items: [ContextMenuItem] = [] + if peerId != botId { + items.append(.action(ContextMenuActionItem(text: presentationData.strings.WebApp_OpenBot, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Bots"), color: theme.contextMenu.primaryColor) + }, action: { _, f in + f(.default) + + // if let strongSelf = self { + // strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf., context: strongSelf.context, chatLocation: .peer(id: strongSelf.peerId))) + // } + }))) + } + + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.WebApp_ReloadPage, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Share"), color: theme.contextMenu.primaryColor) }, action: { _, f in f(.default) -// if let strongSelf = self { -// strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf., context: strongSelf.context, chatLocation: .peer(id: strongSelf.peerId))) -// } + }))) - } - - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.WebApp_ReloadPage, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Share"), color: theme.contextMenu.primaryColor) - }, action: { _, f in - f(.default) - - }))) - - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.WebApp_RemoveBot, textColor: .destructive, icon: { theme in - return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) - }, action: { [weak self] _, f in - f(.default) - - if let strongSelf = self { - let _ = context.engine.messages.removeBotFromAttachMenu(peerId: strongSelf.botId).start() - strongSelf.dismiss() + if let _ = attachMenuBots.firstIndex(where: { $0.peer.id == botId}) { + items.append(.action(ContextMenuActionItem(text: presentationData.strings.WebApp_RemoveBot, textColor: .destructive, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) + }, action: { [weak self] _, f in + f(.default) + + if let strongSelf = self { + let _ = context.engine.messages.removeBotFromAttachMenu(peerId: strongSelf.botId).start() + strongSelf.dismiss() + } + }))) } - }))) - - let contextController = ContextController(account: self.context.account, presentationData: self.presentationData, source: .reference(WebAppContextReferenceContentSource(controller: self, sourceNode: node)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture) + + return ContextController.Items(content: .list(items)) + } + + let contextController = ContextController(account: self.context.account, presentationData: self.presentationData, source: .reference(WebAppContextReferenceContentSource(controller: self, sourceNode: node)), items: items, gesture: gesture) self.presentInGlobalOverlay(contextController) } override public func loadDisplayNode() { - self.displayNode = Node(context: self.context, controller: self, presentationData: self.presentationData, peerId: self.peerId, botId: self.botId, url: self.url, present: { [weak self] c, a in + self.displayNode = Node(context: self.context, controller: self, presentationData: self.presentationData, peerId: self.peerId, botId: self.botId, url: self.url, queryId: self.queryId, present: { [weak self] c, a in self?.present(c, in: .window(.root), with: a) }) + + self.navigationBar?.updateBackgroundAlpha(0.0, transition: .immediate) } override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {