mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Fix bot app launch
This commit is contained in:
parent
6092883479
commit
f35d5ff3f5
@ -1565,7 +1565,7 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
let theme = component.theme
|
let theme = component.theme
|
||||||
let updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>) = (component.context.sharedContext.currentPresentationData.with({ $0 }).withUpdated(theme: theme), component.context.sharedContext.presentationData |> map { $0.withUpdated(theme: theme) })
|
let updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>) = (component.context.sharedContext.currentPresentationData.with({ $0 }).withUpdated(theme: theme), component.context.sharedContext.presentationData |> map { $0.withUpdated(theme: theme) })
|
||||||
let controller = WebAppController(context: component.context, updatedPresentationData: updatedPresentationData, params: params, replyToMessageId: nil, threadId: nil)
|
let controller = WebAppController(context: component.context, updatedPresentationData: updatedPresentationData, params: params, replyToMessageId: nil, threadId: nil)
|
||||||
controller.openUrl = { [weak self] url in
|
controller.openUrl = { [weak self] url, _, _ in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -4214,8 +4214,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
|
|
||||||
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: true, fromAttachMenu: false, isInline: false, isSimple: false)
|
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: true, fromAttachMenu: false, isInline: false, isSimple: false)
|
||||||
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url in
|
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url, concealed, commit in
|
||||||
self?.openUrl(url, concealed: true, forceExternal: true)
|
self?.openUrl(url, concealed: concealed, forceExternal: true, commit: commit)
|
||||||
}, getInputContainerNode: { [weak self] in
|
}, getInputContainerNode: { [weak self] in
|
||||||
if let strongSelf = self, let layout = strongSelf.validLayout, case .compact = layout.metrics.widthClass {
|
if let strongSelf = self, let layout = strongSelf.validLayout, case .compact = layout.metrics.widthClass {
|
||||||
return (strongSelf.chatDisplayNode.getWindowInputAccessoryHeight(), strongSelf.chatDisplayNode.inputPanelContainerNode, {
|
return (strongSelf.chatDisplayNode.getWindowInputAccessoryHeight(), strongSelf.chatDisplayNode.inputPanelContainerNode, {
|
||||||
@ -4269,8 +4269,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let params = WebAppParameters(peerId: peerId, botId: botId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: false, fromAttachMenu: false, isInline: isInline, isSimple: true)
|
let params = WebAppParameters(peerId: peerId, botId: botId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: false, fromAttachMenu: false, isInline: isInline, isSimple: true)
|
||||||
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url in
|
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url, concealed, commit in
|
||||||
self?.openUrl(url, concealed: true, forceExternal: true)
|
self?.openUrl(url, concealed: concealed, forceExternal: true, commit: commit)
|
||||||
}, requestSwitchInline: { [weak self] query, chatTypes, completion in
|
}, requestSwitchInline: { [weak self] query, chatTypes, completion in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
if let chatTypes {
|
if let chatTypes {
|
||||||
@ -4309,8 +4309,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botName, url: result.url, queryId: result.queryId, payload: nil, buttonText: buttonText, keepAliveSignal: result.keepAliveSignal, fromMenu: false, fromAttachMenu: false, isInline: false, isSimple: false)
|
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botName, url: result.url, queryId: result.queryId, payload: nil, buttonText: buttonText, keepAliveSignal: result.keepAliveSignal, fromMenu: false, fromAttachMenu: false, isInline: false, isSimple: false)
|
||||||
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url in
|
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url, concealed, commit in
|
||||||
self?.openUrl(url, concealed: true, forceExternal: true)
|
self?.openUrl(url, concealed: concealed, forceExternal: true, commit: commit)
|
||||||
}, completion: { [weak self] in
|
}, completion: { [weak self] in
|
||||||
self?.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
self?.chatDisplayNode.historyNode.scrollToEndOfHistory()
|
||||||
}, getNavigationController: { [weak self] in
|
}, getNavigationController: { [weak self] in
|
||||||
@ -4341,7 +4341,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if value {
|
if value {
|
||||||
openWebView()
|
openWebView()
|
||||||
} else {
|
} else {
|
||||||
let controller = webAppLaunchConfirmationController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: botPeer, commit: {
|
let controller = webAppLaunchConfirmationController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: botPeer, completion: { _ in
|
||||||
let _ = ApplicationSpecificNotice.setBotGameNotice(accountManager: strongSelf.context.sharedContext.accountManager, peerId: botPeer.id).start()
|
let _ = ApplicationSpecificNotice.setBotGameNotice(accountManager: strongSelf.context.sharedContext.accountManager, peerId: botPeer.id).start()
|
||||||
openWebView()
|
openWebView()
|
||||||
}, showMore: nil)
|
}, showMore: nil)
|
||||||
@ -8837,7 +8837,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
|> take(1)
|
|> take(1)
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] searchResult in
|
|> deliverOnMainQueue).start(next: { [weak self] searchResult in
|
||||||
if let strongSelf = self, let (searchResult, searchState, searchLocation) = searchResult {
|
if let strongSelf = self, let (searchResult, searchState, searchLocation) = searchResult {
|
||||||
|
|
||||||
let controller = ChatSearchResultsController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, location: searchLocation, searchQuery: searchData.query, searchResult: searchResult, searchState: searchState, navigateToMessageIndex: { index in
|
let controller = ChatSearchResultsController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, location: searchLocation, searchQuery: searchData.query, searchResult: searchResult, searchState: searchState, navigateToMessageIndex: { index in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
@ -12948,7 +12947,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
self.presentAttachmentMenu(subject: .bot(id: botId, payload: payload, justInstalled: justInstalled))
|
self.presentAttachmentMenu(subject: .bot(id: botId, payload: payload, justInstalled: justInstalled))
|
||||||
}
|
}
|
||||||
|
|
||||||
public func presentBotApp(botApp: BotApp, botPeer: EnginePeer, payload: String?, concealed: Bool = false) {
|
public func presentBotApp(botApp: BotApp, botPeer: EnginePeer, payload: String?, concealed: Bool = false, commit: @escaping () -> Void = {}) {
|
||||||
guard let peerId = self.chatLocation.peerId else {
|
guard let peerId = self.chatLocation.peerId else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -12958,6 +12957,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
commit()
|
||||||
|
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, {
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: true, {
|
||||||
return $0.updatedTitlePanelContext {
|
return $0.updatedTitlePanelContext {
|
||||||
if !$0.contains(where: {
|
if !$0.contains(where: {
|
||||||
@ -13010,8 +13011,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botApp.title, url: url, queryId: 0, payload: payload, buttonText: "", keepAliveSignal: nil, fromMenu: false, fromAttachMenu: false, isInline: false, isSimple: false)
|
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botApp.title, url: url, queryId: 0, payload: payload, buttonText: "", keepAliveSignal: nil, fromMenu: false, fromAttachMenu: false, isInline: false, isSimple: false)
|
||||||
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url in
|
let controller = standaloneWebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, threadId: strongSelf.chatLocation.threadId, openUrl: { [weak self] url, concealed, commit in
|
||||||
self?.openUrl(url, concealed: true, forceExternal: true)
|
self?.openUrl(url, concealed: concealed, forceExternal: true, commit: commit)
|
||||||
}, requestSwitchInline: { [weak self] query, chatTypes, completion in
|
}, requestSwitchInline: { [weak self] query, chatTypes, completion in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
if let chatTypes {
|
if let chatTypes {
|
||||||
@ -13044,18 +13045,28 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
if concealed || botApp.flags.contains(.notActivated) {
|
let _ = (ApplicationSpecificNotice.getBotGameNotice(accountManager: self.context.sharedContext.accountManager, peerId: botPeer.id)
|
||||||
let controller = webAppLaunchConfirmationController(context: self.context, updatedPresentationData: self.updatedPresentationData, peer: botPeer, commit: {
|
|> deliverOnMainQueue).start(next: { [weak self] value in
|
||||||
openBotApp(false)
|
guard let self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !value || concealed || botApp.flags.contains(.notActivated) {
|
||||||
|
let context = self.context
|
||||||
|
|
||||||
|
let controller = webAppLaunchConfirmationController(context: context, updatedPresentationData: self.updatedPresentationData, peer: botPeer, requestWriteAccess: !botApp.flags.contains(.notActivated) && botApp.flags.contains(.requiresWriteAccess), completion: { allowWrite in
|
||||||
|
let _ = ApplicationSpecificNotice.setBotGameNotice(accountManager: context.sharedContext.accountManager, peerId: botPeer.id).start()
|
||||||
|
openBotApp(allowWrite)
|
||||||
}, showMore: { [weak self] in
|
}, showMore: { [weak self] in
|
||||||
if let strongSelf = self {
|
if let self {
|
||||||
strongSelf.openResolved(result: .peer(botPeer._asPeer(), .info), sourceMessageId: nil)
|
self.openResolved(result: .peer(botPeer._asPeer(), .info), sourceMessageId: nil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
self.present(controller, in: .window(.root))
|
self.present(controller, in: .window(.root))
|
||||||
} else {
|
} else {
|
||||||
openBotApp(false)
|
openBotApp(false)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private func presentAttachmentPremiumGift() {
|
private func presentAttachmentPremiumGift() {
|
||||||
@ -13572,8 +13583,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
let params = WebAppParameters(peerId: peer.id, botId: bot.id, botName: botName, url: nil, queryId: nil, payload: payload, buttonText: nil, keepAliveSignal: nil, fromMenu: false, fromAttachMenu: fromAttachMenu, isInline: false, isSimple: false)
|
let params = WebAppParameters(peerId: peer.id, botId: bot.id, botName: botName, url: nil, queryId: nil, payload: payload, buttonText: nil, keepAliveSignal: nil, fromMenu: false, fromAttachMenu: fromAttachMenu, isInline: false, isSimple: false)
|
||||||
let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId
|
let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId
|
||||||
let controller = WebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, replyToMessageId: replyMessageId, threadId: strongSelf.chatLocation.threadId)
|
let controller = WebAppController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, params: params, replyToMessageId: replyMessageId, threadId: strongSelf.chatLocation.threadId)
|
||||||
controller.openUrl = { [weak self] url in
|
controller.openUrl = { [weak self] url, concealed, commit in
|
||||||
self?.openUrl(url, concealed: true, forceExternal: true)
|
self?.openUrl(url, concealed: concealed, forceExternal: true, commit: commit)
|
||||||
}
|
}
|
||||||
controller.getNavigationController = { [weak self] in
|
controller.getNavigationController = { [weak self] in
|
||||||
return self?.effectiveNavigationController
|
return self?.effectiveNavigationController
|
||||||
@ -17400,7 +17411,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
private func openResolved(result: ResolvedUrl, sourceMessageId: MessageId?, forceExternal: Bool = false, concealed: Bool = false) {
|
private func openResolved(result: ResolvedUrl, sourceMessageId: MessageId?, forceExternal: Bool = false, concealed: Bool = false, commit: @escaping () -> Void = {}) {
|
||||||
guard let peerId = self.chatLocation.peerId else {
|
guard let peerId = self.chatLocation.peerId else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -17409,6 +17420,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let dismissWebAppContollers: () -> Void = {
|
||||||
if let currentWebAppController = strongSelf.currentWebAppController {
|
if let currentWebAppController = strongSelf.currentWebAppController {
|
||||||
strongSelf.currentWebAppController = nil
|
strongSelf.currentWebAppController = nil
|
||||||
currentWebAppController.dismiss(animated: true, completion: nil)
|
currentWebAppController.dismiss(animated: true, completion: nil)
|
||||||
@ -17416,9 +17428,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
strongSelf.currentMenuWebAppController = nil
|
strongSelf.currentMenuWebAppController = nil
|
||||||
currentWebAppController.dismiss(animated: true, completion: nil)
|
currentWebAppController.dismiss(animated: true, completion: nil)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch navigation {
|
switch navigation {
|
||||||
case let .chat(_, subject, peekData):
|
case let .chat(_, subject, peekData):
|
||||||
|
dismissWebAppContollers()
|
||||||
if case .peer(peerId.id) = strongSelf.chatLocation {
|
if case .peer(peerId.id) = strongSelf.chatLocation {
|
||||||
if let subject = subject, case let .message(messageSubject, _, timecode) = subject {
|
if let subject = subject, case let .message(messageSubject, _, timecode) = subject {
|
||||||
if case let .id(messageId) = messageSubject {
|
if case let .id(messageId) = messageSubject {
|
||||||
@ -17434,7 +17448,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, keepStack: .always, peekData: peekData))
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), subject: subject, keepStack: .always, peekData: peekData))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
commit()
|
||||||
case .info:
|
case .info:
|
||||||
|
dismissWebAppContollers()
|
||||||
strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId.id)
|
strongSelf.navigationActionDisposable.set((strongSelf.context.account.postbox.loadedPeerWithId(peerId.id)
|
||||||
|> take(1)
|
|> take(1)
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||||
@ -17444,21 +17460,29 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
|
commit()
|
||||||
case let .withBotStartPayload(startPayload):
|
case let .withBotStartPayload(startPayload):
|
||||||
|
dismissWebAppContollers()
|
||||||
if case .peer(peerId.id) = strongSelf.chatLocation {
|
if case .peer(peerId.id) = strongSelf.chatLocation {
|
||||||
strongSelf.startBot(startPayload.payload)
|
strongSelf.startBot(startPayload.payload)
|
||||||
} else if let navigationController = strongSelf.effectiveNavigationController {
|
} else if let navigationController = strongSelf.effectiveNavigationController {
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), botStart: startPayload, keepStack: .always))
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), botStart: startPayload, keepStack: .always))
|
||||||
}
|
}
|
||||||
|
commit()
|
||||||
case let .withAttachBot(attachBotStart):
|
case let .withAttachBot(attachBotStart):
|
||||||
|
dismissWebAppContollers()
|
||||||
if let navigationController = strongSelf.effectiveNavigationController {
|
if let navigationController = strongSelf.effectiveNavigationController {
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), attachBotStart: attachBotStart))
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peerId), attachBotStart: attachBotStart))
|
||||||
}
|
}
|
||||||
|
commit()
|
||||||
case let .withBotApp(botAppStart):
|
case let .withBotApp(botAppStart):
|
||||||
let _ = (strongSelf.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId.id))
|
let _ = (strongSelf.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId.id))
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
|> deliverOnMainQueue).start(next: { [weak self] peer in
|
||||||
if let strongSelf = self, let peer {
|
if let strongSelf = self, let peer {
|
||||||
strongSelf.presentBotApp(botApp: botAppStart.botApp, botPeer: peer, payload: botAppStart.payload, concealed: concealed)
|
strongSelf.presentBotApp(botApp: botAppStart.botApp, botPeer: peer, payload: botAppStart.payload, concealed: concealed, commit: {
|
||||||
|
dismissWebAppContollers()
|
||||||
|
commit()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
default:
|
default:
|
||||||
@ -17483,14 +17507,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}, contentContext: nil)
|
}, contentContext: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func openUrl(_ url: String, concealed: Bool, forceExternal: Bool = false, skipUrlAuth: Bool = false, skipConcealedAlert: Bool = false, message: Message? = nil) {
|
private func openUrl(_ url: String, concealed: Bool, forceExternal: Bool = false, skipUrlAuth: Bool = false, skipConcealedAlert: Bool = false, message: Message? = nil, commit: @escaping () -> Void = {}) {
|
||||||
self.commitPurposefulAction()
|
self.commitPurposefulAction()
|
||||||
|
|
||||||
let _ = self.presentVoiceMessageDiscardAlert(action: {
|
let _ = self.presentVoiceMessageDiscardAlert(action: {
|
||||||
openUserGeneratedUrl(context: self.context, peerId: self.peerView?.peerId, url: url, concealed: concealed, skipUrlAuth: skipUrlAuth, skipConcealedAlert: skipConcealedAlert, present: { [weak self] c in
|
openUserGeneratedUrl(context: self.context, peerId: self.peerView?.peerId, url: url, concealed: concealed, skipUrlAuth: skipUrlAuth, skipConcealedAlert: skipConcealedAlert, present: { [weak self] c in
|
||||||
self?.present(c, in: .window(.root))
|
self?.present(c, in: .window(.root))
|
||||||
}, openResolved: { [weak self] resolved in
|
}, openResolved: { [weak self] resolved in
|
||||||
self?.openResolved(result: resolved, sourceMessageId: message?.id, forceExternal: forceExternal, concealed: concealed)
|
self?.openResolved(result: resolved, sourceMessageId: message?.id, forceExternal: forceExternal, concealed: concealed, commit: commit)
|
||||||
})
|
})
|
||||||
}, performAction: true)
|
}, performAction: true)
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,8 @@ swift_library(
|
|||||||
"//submodules/PhoneNumberFormat:PhoneNumberFormat",
|
"//submodules/PhoneNumberFormat:PhoneNumberFormat",
|
||||||
"//submodules/QrCodeUI:QrCodeUI",
|
"//submodules/QrCodeUI:QrCodeUI",
|
||||||
"//submodules/InstantPageUI:InstantPageUI",
|
"//submodules/InstantPageUI:InstantPageUI",
|
||||||
|
"//submodules/CheckNode:CheckNode",
|
||||||
|
"//submodules/Markdown:Markdown",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -20,7 +20,6 @@ private func formattedText(_ text: String, color: UIColor, textAlignment: NSText
|
|||||||
return parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: textFont, textColor: color), bold: MarkdownAttributeSet(font: boldTextFont, textColor: color), link: MarkdownAttributeSet(font: textFont, textColor: color), linkAttribute: { _ in return nil}), textAlignment: textAlignment)
|
return parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: textFont, textColor: color), bold: MarkdownAttributeSet(font: boldTextFont, textColor: color), link: MarkdownAttributeSet(font: textFont, textColor: color), linkAttribute: { _ in return nil}), textAlignment: textAlignment)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private final class WebAppAlertContentNode: AlertContentNode {
|
private final class WebAppAlertContentNode: AlertContentNode {
|
||||||
private let strings: PresentationStrings
|
private let strings: PresentationStrings
|
||||||
private let peerName: String
|
private let peerName: String
|
||||||
@ -312,22 +311,24 @@ public func addWebAppToAttachmentController(context: AccountContext, peerName: S
|
|||||||
let strings = presentationData.strings
|
let strings = presentationData.strings
|
||||||
|
|
||||||
var dismissImpl: ((Bool) -> Void)?
|
var dismissImpl: ((Bool) -> Void)?
|
||||||
var contentNode: WebAppAlertContentNode?
|
var getContentNodeImpl: (() -> WebAppAlertContentNode?)?
|
||||||
let actions: [TextAlertAction] = [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {
|
let actions: [TextAlertAction] = [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {
|
||||||
dismissImpl?(true)
|
dismissImpl?(true)
|
||||||
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.WebApp_AddToAttachmentAdd, action: { [weak contentNode] in
|
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.WebApp_AddToAttachmentAdd, action: {
|
||||||
dismissImpl?(true)
|
if requestWriteAccess, let allowWriteAccess = getContentNodeImpl?()?.allowWriteAccess {
|
||||||
|
|
||||||
if requestWriteAccess, let allowWriteAccess = contentNode?.allowWriteAccess {
|
|
||||||
completion(allowWriteAccess)
|
completion(allowWriteAccess)
|
||||||
} else {
|
} else {
|
||||||
completion(false)
|
completion(false)
|
||||||
}
|
}
|
||||||
|
dismissImpl?(true)
|
||||||
})]
|
})]
|
||||||
|
|
||||||
contentNode = WebAppAlertContentNode(account: context.account, theme: AlertControllerTheme(presentationData: presentationData), ptheme: theme, strings: strings, peerName: peerName, icons: icons, requestWriteAccess: requestWriteAccess, actions: actions)
|
let contentNode = WebAppAlertContentNode(account: context.account, theme: AlertControllerTheme(presentationData: presentationData), ptheme: theme, strings: strings, peerName: peerName, icons: icons, requestWriteAccess: requestWriteAccess, actions: actions)
|
||||||
|
getContentNodeImpl = { [weak contentNode] in
|
||||||
|
return contentNode
|
||||||
|
}
|
||||||
|
|
||||||
let controller = AlertController(theme: AlertControllerTheme(presentationData: presentationData), contentNode: contentNode!)
|
let controller = AlertController(theme: AlertControllerTheme(presentationData: presentationData), contentNode: contentNode)
|
||||||
dismissImpl = { [weak controller] animated in
|
dismissImpl = { [weak controller] animated in
|
||||||
if animated {
|
if animated {
|
||||||
controller?.dismissAnimated()
|
controller?.dismissAnimated()
|
||||||
|
@ -458,7 +458,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
if let url = navigationAction.request.url?.absoluteString {
|
if let url = navigationAction.request.url?.absoluteString {
|
||||||
if isTelegramMeLink(url) || isTelegraPhLink(url) {
|
if isTelegramMeLink(url) || isTelegraPhLink(url) {
|
||||||
decisionHandler(.cancel)
|
decisionHandler(.cancel)
|
||||||
self.controller?.openUrl(url)
|
self.controller?.openUrl(url, true, {})
|
||||||
} else {
|
} else {
|
||||||
decisionHandler(.allow)
|
decisionHandler(.allow)
|
||||||
}
|
}
|
||||||
@ -469,7 +469,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
|
|
||||||
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
|
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
|
||||||
if navigationAction.targetFrame == nil, let url = navigationAction.request.url {
|
if navigationAction.targetFrame == nil, let url = navigationAction.request.url {
|
||||||
self.controller?.openUrl(url.absoluteString)
|
self.controller?.openUrl(url.absoluteString, true, {})
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -714,8 +714,9 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
controller.dismiss()
|
controller.dismiss()
|
||||||
case "web_app_open_tg_link":
|
case "web_app_open_tg_link":
|
||||||
if let json = json, let path = json["path_full"] as? String {
|
if let json = json, let path = json["path_full"] as? String {
|
||||||
controller.openUrl("https://t.me\(path)")
|
controller.openUrl("https://t.me\(path)", false, { [weak controller] in
|
||||||
controller.dismiss()
|
controller?.dismiss()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
case "web_app_open_invoice":
|
case "web_app_open_invoice":
|
||||||
if let json = json, let slug = json["slug"] as? String {
|
if let json = json, let slug = json["slug"] as? String {
|
||||||
@ -1095,7 +1096,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
fileprivate let updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?
|
fileprivate let updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?
|
||||||
private var presentationDataDisposable: Disposable?
|
private var presentationDataDisposable: Disposable?
|
||||||
|
|
||||||
public var openUrl: (String) -> Void = { _ in }
|
public var openUrl: (String, Bool, @escaping () -> Void) -> Void = { _, _, _ in }
|
||||||
public var getNavigationController: () -> NavigationController? = { return nil }
|
public var getNavigationController: () -> NavigationController? = { return nil }
|
||||||
public var completion: () -> Void = {}
|
public var completion: () -> Void = {}
|
||||||
public var requestSwitchInline: (String, [ReplyMarkupButtonRequestPeerType]?, @escaping () -> Void) -> Void = { _, _, _ in }
|
public var requestSwitchInline: (String, [ReplyMarkupButtonRequestPeerType]?, @escaping () -> Void) -> Void = { _, _, _ in }
|
||||||
@ -1394,7 +1395,19 @@ private final class WebAppContextReferenceContentSource: ContextReferenceContent
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func standaloneWebAppController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil, params: WebAppParameters, threadId: Int64?, openUrl: @escaping (String) -> Void, requestSwitchInline: @escaping (String, [ReplyMarkupButtonRequestPeerType]?, @escaping () -> Void) -> Void = { _, _, _ in }, getInputContainerNode: @escaping () -> (CGFloat, ASDisplayNode, () -> AttachmentController.InputPanelTransition?)? = { return nil }, completion: @escaping () -> Void = {}, willDismiss: @escaping () -> Void = {}, didDismiss: @escaping () -> Void = {}, getNavigationController: @escaping () -> NavigationController? = { return nil }, getSourceRect: (() -> CGRect?)? = nil) -> ViewController {
|
public func standaloneWebAppController(
|
||||||
|
context: AccountContext,
|
||||||
|
updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil,
|
||||||
|
params: WebAppParameters,
|
||||||
|
threadId: Int64?,
|
||||||
|
openUrl: @escaping (String, Bool, @escaping () -> Void) -> Void,
|
||||||
|
requestSwitchInline: @escaping (String, [ReplyMarkupButtonRequestPeerType]?, @escaping () -> Void) -> Void = { _, _, _ in },
|
||||||
|
getInputContainerNode: @escaping () -> (CGFloat, ASDisplayNode, () -> AttachmentController.InputPanelTransition?)? = { return nil },
|
||||||
|
completion: @escaping () -> Void = {},
|
||||||
|
willDismiss: @escaping () -> Void = {},
|
||||||
|
didDismiss: @escaping () -> Void = {},
|
||||||
|
getNavigationController: @escaping () -> NavigationController? = { return nil },
|
||||||
|
getSourceRect: (() -> CGRect?)? = nil) -> ViewController {
|
||||||
let controller = AttachmentController(context: context, updatedPresentationData: updatedPresentationData, chatLocation: .peer(id: params.peerId), buttons: [.standalone], initialButton: .standalone, fromMenu: params.fromMenu, hasTextInput: false, makeEntityInputView: {
|
let controller = AttachmentController(context: context, updatedPresentationData: updatedPresentationData, chatLocation: .peer(id: params.peerId), buttons: [.standalone], initialButton: .standalone, fromMenu: params.fromMenu, hasTextInput: false, makeEntityInputView: {
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -10,9 +10,19 @@ import TelegramUIPreferences
|
|||||||
import AccountContext
|
import AccountContext
|
||||||
import AppBundle
|
import AppBundle
|
||||||
import AvatarNode
|
import AvatarNode
|
||||||
|
import CheckNode
|
||||||
|
import Markdown
|
||||||
|
|
||||||
|
private let textFont = Font.regular(13.0)
|
||||||
|
private let boldTextFont = Font.semibold(13.0)
|
||||||
|
|
||||||
|
private func formattedText(_ text: String, color: UIColor, textAlignment: NSTextAlignment = .natural) -> NSAttributedString {
|
||||||
|
return parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: MarkdownAttributeSet(font: textFont, textColor: color), bold: MarkdownAttributeSet(font: boldTextFont, textColor: color), link: MarkdownAttributeSet(font: textFont, textColor: color), linkAttribute: { _ in return nil}), textAlignment: textAlignment)
|
||||||
|
}
|
||||||
|
|
||||||
private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
||||||
private let strings: PresentationStrings
|
private let strings: PresentationStrings
|
||||||
|
private let peer: EnginePeer
|
||||||
private let title: String
|
private let title: String
|
||||||
private let text: String
|
private let text: String
|
||||||
private let showMore: Bool
|
private let showMore: Bool
|
||||||
@ -24,6 +34,9 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
private let moreButton: HighlightableButtonNode
|
private let moreButton: HighlightableButtonNode
|
||||||
private let arrowNode: ASImageNode
|
private let arrowNode: ASImageNode
|
||||||
|
|
||||||
|
private let allowWriteCheckNode: InteractiveCheckNode
|
||||||
|
private let allowWriteLabelNode: ASTextNode
|
||||||
|
|
||||||
private let actionNodesSeparator: ASDisplayNode
|
private let actionNodesSeparator: ASDisplayNode
|
||||||
private let actionNodes: [TextAlertContentActionNode]
|
private let actionNodes: [TextAlertContentActionNode]
|
||||||
private let actionVerticalSeparators: [ASDisplayNode]
|
private let actionVerticalSeparators: [ASDisplayNode]
|
||||||
@ -36,8 +49,15 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
return self.isUserInteractionEnabled
|
return self.isUserInteractionEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
init(context: AccountContext, theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, peer: EnginePeer, title: String, text: String, showMore: Bool, actions: [TextAlertAction], morePressed: @escaping () -> Void) {
|
var allowWriteAccess: Bool = true {
|
||||||
|
didSet {
|
||||||
|
self.allowWriteCheckNode.setSelected(self.allowWriteAccess, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init(context: AccountContext, theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, peer: EnginePeer, title: String, text: String, showMore: Bool, requestWriteAccess: Bool, actions: [TextAlertAction], morePressed: @escaping () -> Void) {
|
||||||
self.strings = strings
|
self.strings = strings
|
||||||
|
self.peer = peer
|
||||||
self.title = title
|
self.title = title
|
||||||
self.text = text
|
self.text = text
|
||||||
self.showMore = showMore
|
self.showMore = showMore
|
||||||
@ -62,6 +82,12 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
self.arrowNode.isHidden = !showMore
|
self.arrowNode.isHidden = !showMore
|
||||||
self.arrowNode.contentMode = .scaleAspectFit
|
self.arrowNode.contentMode = .scaleAspectFit
|
||||||
|
|
||||||
|
self.allowWriteCheckNode = InteractiveCheckNode(theme: CheckNodeTheme(backgroundColor: theme.accentColor, strokeColor: theme.contrastColor, borderColor: theme.controlBorderColor, overlayBorder: false, hasInset: false, hasShadow: false))
|
||||||
|
self.allowWriteCheckNode.setSelected(true, animated: false)
|
||||||
|
self.allowWriteLabelNode = ASTextNode()
|
||||||
|
self.allowWriteLabelNode.maximumNumberOfLines = 4
|
||||||
|
self.allowWriteLabelNode.isUserInteractionEnabled = true
|
||||||
|
|
||||||
self.actionNodesSeparator = ASDisplayNode()
|
self.actionNodesSeparator = ASDisplayNode()
|
||||||
self.actionNodesSeparator.isLayerBacked = true
|
self.actionNodesSeparator.isLayerBacked = true
|
||||||
|
|
||||||
@ -87,6 +113,11 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
self.addSubnode(self.moreButton)
|
self.addSubnode(self.moreButton)
|
||||||
self.moreButton.addSubnode(self.arrowNode)
|
self.moreButton.addSubnode(self.arrowNode)
|
||||||
|
|
||||||
|
if requestWriteAccess {
|
||||||
|
self.addSubnode(self.allowWriteCheckNode)
|
||||||
|
self.addSubnode(self.allowWriteLabelNode)
|
||||||
|
}
|
||||||
|
|
||||||
self.addSubnode(self.actionNodesSeparator)
|
self.addSubnode(self.actionNodesSeparator)
|
||||||
|
|
||||||
for actionNode in self.actionNodes {
|
for actionNode in self.actionNodes {
|
||||||
@ -97,6 +128,12 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
self.addSubnode(separatorNode)
|
self.addSubnode(separatorNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.allowWriteCheckNode.valueChanged = { [weak self] value in
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.allowWriteAccess = !strongSelf.allowWriteAccess
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.updateTheme(theme)
|
self.updateTheme(theme)
|
||||||
|
|
||||||
self.avatarNode.setPeer(context: context, theme: ptheme, peer: peer)
|
self.avatarNode.setPeer(context: context, theme: ptheme, peer: peer)
|
||||||
@ -104,6 +141,18 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
self.moreButton.addTarget(self, action: #selector(self.moreButtonPressed), forControlEvents: .touchUpInside)
|
self.moreButton.addTarget(self, action: #selector(self.moreButtonPressed), forControlEvents: .touchUpInside)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func didLoad() {
|
||||||
|
super.didLoad()
|
||||||
|
|
||||||
|
self.allowWriteLabelNode.view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.allowWriteTap(_:))))
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func allowWriteTap(_ gestureRecognizer: UITapGestureRecognizer) {
|
||||||
|
if self.allowWriteCheckNode.isUserInteractionEnabled {
|
||||||
|
self.allowWriteAccess = !self.allowWriteAccess
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@objc private func moreButtonPressed() {
|
@objc private func moreButtonPressed() {
|
||||||
self.morePressed()
|
self.morePressed()
|
||||||
}
|
}
|
||||||
@ -115,6 +164,8 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
self.moreButton.setAttributedTitle(NSAttributedString(string: self.strings.WebApp_LaunchMoreInfo, font: Font.regular(13.0), textColor: theme.accentColor), for: .normal)
|
self.moreButton.setAttributedTitle(NSAttributedString(string: self.strings.WebApp_LaunchMoreInfo, font: Font.regular(13.0), textColor: theme.accentColor), for: .normal)
|
||||||
self.arrowNode.image = generateTintedImage(image: UIImage(bundleImageName: "Peer Info/AlertArrow"), color: theme.accentColor)
|
self.arrowNode.image = generateTintedImage(image: UIImage(bundleImageName: "Peer Info/AlertArrow"), color: theme.accentColor)
|
||||||
|
|
||||||
|
self.allowWriteLabelNode.attributedText = formattedText(strings.WebApp_AddToAttachmentAllowMessages(self.peer.compactDisplayTitle).string, color: theme.primaryColor)
|
||||||
|
|
||||||
self.actionNodesSeparator.backgroundColor = theme.separatorColor
|
self.actionNodesSeparator.backgroundColor = theme.separatorColor
|
||||||
for actionNode in self.actionNodes {
|
for actionNode in self.actionNodes {
|
||||||
actionNode.updateTheme(theme)
|
actionNode.updateTheme(theme)
|
||||||
@ -153,15 +204,32 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - titleSize.width) / 2.0), y: origin.y), size: titleSize))
|
transition.updateFrame(node: self.titleNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - titleSize.width) / 2.0), y: origin.y), size: titleSize))
|
||||||
origin.y += titleSize.height + 6.0
|
origin.y += titleSize.height + 6.0
|
||||||
|
|
||||||
|
var entriesHeight: CGFloat = 0.0
|
||||||
if self.showMore {
|
if self.showMore {
|
||||||
let moreButtonSize = self.moreButton.measure(CGSize(width: size.width - 32.0, height: size.height))
|
let moreButtonSize = self.moreButton.measure(CGSize(width: size.width - 32.0, height: size.height))
|
||||||
transition.updateFrame(node: self.moreButton, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - moreButtonSize.width) / 2.0) - 5.0, y: origin.y), size: moreButtonSize))
|
transition.updateFrame(node: self.moreButton, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - moreButtonSize.width) / 2.0) - 5.0, y: origin.y), size: moreButtonSize))
|
||||||
transition.updateFrame(node: self.arrowNode, frame: CGRect(origin: CGPoint(x: moreButtonSize.width + 3.0, y: 4.0), size: CGSize(width: 9.0, height: 9.0)))
|
transition.updateFrame(node: self.arrowNode, frame: CGRect(origin: CGPoint(x: moreButtonSize.width + 3.0, y: 4.0), size: CGSize(width: 9.0, height: 9.0)))
|
||||||
origin.y += moreButtonSize.height + 22.0
|
origin.y += moreButtonSize.height + 22.0
|
||||||
|
entriesHeight += 37.0
|
||||||
}
|
}
|
||||||
|
|
||||||
let textSize = self.textNode.measure(CGSize(width: size.width - 32.0, height: size.height))
|
let textSize = self.textNode.measure(CGSize(width: size.width - 32.0, height: size.height))
|
||||||
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - textSize.width) / 2.0), y: origin.y), size: textSize))
|
transition.updateFrame(node: self.textNode, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((size.width - textSize.width) / 2.0), y: origin.y), size: textSize))
|
||||||
|
origin.y += textSize.height
|
||||||
|
|
||||||
|
if self.allowWriteLabelNode.supernode != nil {
|
||||||
|
origin.y += 16.0
|
||||||
|
entriesHeight += 16.0
|
||||||
|
|
||||||
|
let checkSize = CGSize(width: 22.0, height: 22.0)
|
||||||
|
let condensedSize = CGSize(width: size.width - 76.0, height: size.height)
|
||||||
|
|
||||||
|
let allowWriteSize = self.allowWriteLabelNode.measure(condensedSize)
|
||||||
|
transition.updateFrame(node: self.allowWriteLabelNode, frame: CGRect(origin: CGPoint(x: 46.0, y: origin.y), size: allowWriteSize))
|
||||||
|
transition.updateFrame(node: self.allowWriteCheckNode, frame: CGRect(origin: CGPoint(x: 12.0, y: origin.y - 2.0), size: checkSize))
|
||||||
|
origin.y += allowWriteSize.height
|
||||||
|
entriesHeight += allowWriteSize.height
|
||||||
|
}
|
||||||
|
|
||||||
let actionButtonHeight: CGFloat = 44.0
|
let actionButtonHeight: CGFloat = 44.0
|
||||||
var minActionsWidth: CGFloat = 0.0
|
var minActionsWidth: CGFloat = 0.0
|
||||||
@ -194,10 +262,7 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
actionsHeight = actionButtonHeight * CGFloat(self.actionNodes.count)
|
actionsHeight = actionButtonHeight * CGFloat(self.actionNodes.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
var resultSize = CGSize(width: contentWidth, height: avatarSize.height + titleSize.height + textSize.height + actionsHeight + 25.0 + insets.top + insets.bottom)
|
let resultSize = CGSize(width: contentWidth, height: avatarSize.height + titleSize.height + textSize.height + entriesHeight + actionsHeight + 25.0 + insets.top + insets.bottom)
|
||||||
if self.showMore {
|
|
||||||
resultSize.height += 37.0
|
|
||||||
}
|
|
||||||
|
|
||||||
transition.updateFrame(node: self.actionNodesSeparator, frame: CGRect(origin: CGPoint(x: 0.0, y: resultSize.height - actionsHeight - UIScreenPixel), size: CGSize(width: resultSize.width, height: UIScreenPixel)))
|
transition.updateFrame(node: self.actionNodesSeparator, frame: CGRect(origin: CGPoint(x: 0.0, y: resultSize.height - actionsHeight - UIScreenPixel), size: CGSize(width: resultSize.width, height: UIScreenPixel)))
|
||||||
|
|
||||||
@ -248,7 +313,7 @@ private final class WebAppLaunchConfirmationAlertContentNode: AlertContentNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func webAppLaunchConfirmationController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: EnginePeer, commit: @escaping () -> Void, showMore: (() -> Void)?) -> AlertController {
|
public func webAppLaunchConfirmationController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, peer: EnginePeer, requestWriteAccess: Bool = false, completion: @escaping (Bool) -> Void, showMore: (() -> Void)?) -> AlertController {
|
||||||
let theme = defaultDarkColorPresentationTheme
|
let theme = defaultDarkColorPresentationTheme
|
||||||
let presentationData: PresentationData
|
let presentationData: PresentationData
|
||||||
if let updatedPresentationData {
|
if let updatedPresentationData {
|
||||||
@ -259,10 +324,14 @@ public func webAppLaunchConfirmationController(context: AccountContext, updatedP
|
|||||||
let strings = presentationData.strings
|
let strings = presentationData.strings
|
||||||
|
|
||||||
var dismissImpl: ((Bool) -> Void)?
|
var dismissImpl: ((Bool) -> Void)?
|
||||||
var contentNode: WebAppLaunchConfirmationAlertContentNode?
|
var getContentNodeImpl: (() -> WebAppLaunchConfirmationAlertContentNode?)?
|
||||||
let actions: [TextAlertAction] = [TextAlertAction(type: .defaultAction, title: presentationData.strings.WebApp_LaunchOpenApp, action: {
|
let actions: [TextAlertAction] = [TextAlertAction(type: .defaultAction, title: presentationData.strings.WebApp_LaunchOpenApp, action: {
|
||||||
|
if requestWriteAccess, let allowWriteAccess = getContentNodeImpl?()?.allowWriteAccess {
|
||||||
|
completion(allowWriteAccess)
|
||||||
|
} else {
|
||||||
|
completion(false)
|
||||||
|
}
|
||||||
dismissImpl?(true)
|
dismissImpl?(true)
|
||||||
commit()
|
|
||||||
}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {
|
}), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {
|
||||||
dismissImpl?(true)
|
dismissImpl?(true)
|
||||||
})]
|
})]
|
||||||
@ -270,12 +339,15 @@ public func webAppLaunchConfirmationController(context: AccountContext, updatedP
|
|||||||
let title = peer.compactDisplayTitle
|
let title = peer.compactDisplayTitle
|
||||||
let text = presentationData.strings.WebApp_LaunchConfirmation
|
let text = presentationData.strings.WebApp_LaunchConfirmation
|
||||||
|
|
||||||
contentNode = WebAppLaunchConfirmationAlertContentNode(context: context, theme: AlertControllerTheme(presentationData: presentationData), ptheme: theme, strings: strings, peer: peer, title: title, text: text, showMore: showMore != nil, actions: actions, morePressed: {
|
let contentNode = WebAppLaunchConfirmationAlertContentNode(context: context, theme: AlertControllerTheme(presentationData: presentationData), ptheme: theme, strings: strings, peer: peer, title: title, text: text, showMore: showMore != nil, requestWriteAccess: requestWriteAccess, actions: actions, morePressed: {
|
||||||
dismissImpl?(true)
|
dismissImpl?(true)
|
||||||
showMore?()
|
showMore?()
|
||||||
})
|
})
|
||||||
|
getContentNodeImpl = { [weak contentNode] in
|
||||||
|
return contentNode
|
||||||
|
}
|
||||||
|
|
||||||
let controller = AlertController(theme: AlertControllerTheme(presentationData: presentationData), contentNode: contentNode!)
|
let controller = AlertController(theme: AlertControllerTheme(presentationData: presentationData), contentNode: contentNode)
|
||||||
dismissImpl = { [weak controller] animated in
|
dismissImpl = { [weak controller] animated in
|
||||||
if animated {
|
if animated {
|
||||||
controller?.dismissAnimated()
|
controller?.dismissAnimated()
|
Loading…
x
Reference in New Issue
Block a user