Various fixes

This commit is contained in:
Ilya Laktyushin 2023-03-19 20:34:56 +04:00
parent 56191f4c0b
commit 7269255d00
7 changed files with 44 additions and 28 deletions

View File

@ -8,22 +8,21 @@ import MtProtoKit
func _internal_requestStartBot(account: Account, botPeerId: PeerId, payload: String?) -> Signal<Void, NoError> { func _internal_requestStartBot(account: Account, botPeerId: PeerId, payload: String?) -> Signal<Void, NoError> {
if let payload = payload, !payload.isEmpty { if let payload = payload, !payload.isEmpty {
return account.postbox.loadedPeerWithId(botPeerId) return account.postbox.loadedPeerWithId(botPeerId)
|> mapToSignal { botPeer -> Signal<Void, NoError> in |> mapToSignal { botPeer -> Signal<Void, NoError> in
if let inputUser = apiInputUser(botPeer) { if let inputUser = apiInputUser(botPeer) {
let r = account.network.request(Api.functions.messages.startBot(bot: inputUser, peer: .inputPeerEmpty, randomId: Int64.random(in: Int64.min ... Int64.max), startParam: payload)) return account.network.request(Api.functions.messages.startBot(bot: inputUser, peer: .inputPeerEmpty, randomId: Int64.random(in: Int64.min ... Int64.max), startParam: payload))
|> mapToSignal { result -> Signal<Void, MTRpcError> in |> mapToSignal { result -> Signal<Void, MTRpcError> in
account.stateManager.addUpdates(result) account.stateManager.addUpdates(result)
return .complete()
}
|> `catch` { _ -> Signal<Void, MTRpcError> in
return .complete()
}
return r
|> retryRequest
} else {
return .complete() return .complete()
} }
|> `catch` { _ -> Signal<Void, MTRpcError> in
return .complete()
}
|> retryRequest
} else {
return .complete()
} }
}
} else { } else {
return enqueueMessages(account: account, peerId: botPeerId, messages: [.message(text: "/start", attributes: [], inlineStickers: [:], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])]) |> mapToSignal { _ -> Signal<Void, NoError> in return enqueueMessages(account: account, peerId: botPeerId, messages: [.message(text: "/start", attributes: [], inlineStickers: [:], mediaReference: nil, replyToMessageId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])]) |> mapToSignal { _ -> Signal<Void, NoError> in
return .complete() return .complete()

View File

@ -4104,7 +4104,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return state.updatedShowWebView(true).updatedForceInputCommandsHidden(true) return state.updatedShowWebView(true).updatedForceInputCommandsHidden(true)
} }
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: true, 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 in
self?.openUrl(url, concealed: true, forceExternal: true) self?.openUrl(url, concealed: true, forceExternal: true)
}, getInputContainerNode: { [weak self] in }, getInputContainerNode: { [weak self] in
@ -4159,7 +4159,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
let params = WebAppParameters(peerId: peerId, botId: botId, botName: botName, url: url, queryId: nil, payload: nil, buttonText: buttonText, keepAliveSignal: nil, fromMenu: 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 in
self?.openUrl(url, concealed: true, forceExternal: true) self?.openUrl(url, concealed: true, forceExternal: true)
}, requestSwitchInline: { [weak self] query, chatTypes, completion in }, requestSwitchInline: { [weak self] query, chatTypes, completion in
@ -4199,7 +4199,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else { guard let strongSelf = self else {
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, 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 in
self?.openUrl(url, concealed: true, forceExternal: true) self?.openUrl(url, concealed: true, forceExternal: true)
}, completion: { [weak self] in }, completion: { [weak self] in
@ -12722,7 +12722,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
guard let strongSelf = self else { guard let strongSelf = self else {
return return
} }
let params = WebAppParameters(peerId: peerId, botId: peerId, botName: botApp.title, url: url, queryId: 0, payload: payload, buttonText: "", keepAliveSignal: nil, fromMenu: 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 in
self?.openUrl(url, concealed: true, forceExternal: true) self?.openUrl(url, concealed: true, forceExternal: true)
}, completion: { [weak self] in }, completion: { [weak self] in
@ -13242,10 +13242,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
} }
case let .app(bot, botName, _): case let .app(bot, botName, _):
var payload: String? var payload: String?
var fromAttachMenu = true
if case let .bot(_, botPayload, _) = subject { if case let .bot(_, botPayload, _) = subject {
payload = botPayload payload = botPayload
fromAttachMenu = false
} }
let params = WebAppParameters(peerId: peer.id, botId: bot.id, botName: botName, url: nil, queryId: nil, payload: payload, buttonText: nil, keepAliveSignal: nil, fromMenu: false, 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 in

View File

@ -1597,8 +1597,8 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
} }
let keyboardAppearance = interfaceState.theme.rootController.keyboardColor.keyboardAppearance let keyboardAppearance = interfaceState.theme.rootController.keyboardColor.keyboardAppearance
if let textInputNode = self.textInputNode, textInputNode.keyboardAppearance != keyboardAppearance, textInputNode.isFirstResponder() { if let textInputNode = self.textInputNode, textInputNode.keyboardAppearance != keyboardAppearance {
if textInputNode.isCurrentlyEmoji() { if textInputNode.isFirstResponder() && textInputNode.isCurrentlyEmoji() {
textInputNode.initialPrimaryLanguage = "emoji" textInputNode.initialPrimaryLanguage = "emoji"
textInputNode.resetInitialPrimaryLanguage() textInputNode.resetInitialPrimaryLanguage()
} }
@ -2268,7 +2268,13 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate {
let _ = placeholderApply() let _ = placeholderApply()
transition.updateFrame(node: contextPlaceholderNode, frame: CGRect(origin: CGPoint(x: hideOffset.x + leftInset + textFieldInsets.left + self.textInputViewInternalInsets.left, y: hideOffset.y + textFieldInsets.top + self.textInputViewInternalInsets.top + textInputViewRealInsets.top + UIScreenPixel), size: placeholderSize.size)) let placeholderTransition: ContainedViewLayoutTransition
if placeholderSize.size.width == contextPlaceholderNode.frame.width {
placeholderTransition = transition
} else {
placeholderTransition = .immediate
}
placeholderTransition.updateFrame(node: contextPlaceholderNode, frame: CGRect(origin: CGPoint(x: hideOffset.x + leftInset + textFieldInsets.left + self.textInputViewInternalInsets.left, y: hideOffset.y + textFieldInsets.top + self.textInputViewInternalInsets.top + textInputViewRealInsets.top + UIScreenPixel), size: placeholderSize.size))
contextPlaceholderNode.alpha = audioRecordingItemsAlpha contextPlaceholderNode.alpha = audioRecordingItemsAlpha
} else if let contextPlaceholderNode = self.contextPlaceholderNode { } else if let contextPlaceholderNode = self.contextPlaceholderNode {
self.contextPlaceholderNode = nil self.contextPlaceholderNode = nil

View File

@ -210,7 +210,7 @@ final class CommandMenuChatInputPanelItemNode: ListViewItemNode {
let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: textString, backgroundColor: nil, maximumNumberOfLines: 2, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset - rightInset - 130.0, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let (textLayout, textApply) = makeTextLayout(TextNodeLayoutArguments(attributedString: textString, backgroundColor: nil, maximumNumberOfLines: 2, truncationType: .end, constrainedSize: CGSize(width: params.width - leftInset - rightInset - 130.0, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
let (commandLayout, commandApply) = makeCommandLayout(TextNodeLayoutArguments(attributedString: commandString, backgroundColor: nil, maximumNumberOfLines: 2, truncationType: .end, constrainedSize: CGSize(width: 120.0, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) let (commandLayout, commandApply) = makeCommandLayout(TextNodeLayoutArguments(attributedString: commandString, backgroundColor: nil, maximumNumberOfLines: 1, truncationType: .end, constrainedSize: CGSize(width: params.width - rightInset - textLayout.size.width - 16.0, height: 100.0), alignment: .natural, cutout: nil, insets: UIEdgeInsets()))
let nodeLayout = ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: max(CommandMenuChatInputPanelItemNode.itemHeight, textLayout.size.height + 14.0)), insets: UIEdgeInsets()) let nodeLayout = ListViewItemNodeLayout(contentSize: CGSize(width: params.width, height: max(CommandMenuChatInputPanelItemNode.itemHeight, textLayout.size.height + 14.0)), insets: UIEdgeInsets())

View File

@ -3675,12 +3675,16 @@ final class PeerInfoHeaderNode: ASDisplayNode {
} }
private class DynamicIslandMaskNode: ManagedAnimationNode { private class DynamicIslandMaskNode: ManagedAnimationNode {
var frameIndex: Int = 0
func update(_ value: CGFloat) { func update(_ value: CGFloat) {
let lowerBound = 0 let lowerBound = 0
let upperBound = 180 let upperBound = 180
let frameIndex = lowerBound + Int(value * CGFloat(upperBound - lowerBound)) let frameIndex = lowerBound + Int(value * CGFloat(upperBound - lowerBound))
if frameIndex != self.frameIndex {
self.trackTo(item: ManagedAnimationItem(source: .local("UserAvatarMask"), frames: .range(startFrame: frameIndex, endFrame: frameIndex), duration: 0.001)) self.frameIndex = frameIndex
self.trackTo(item: ManagedAnimationItem(source: .local("UserAvatarMask"), frames: .range(startFrame: frameIndex, endFrame: frameIndex), duration: 0.001))
}
} }
} }
@ -3730,6 +3734,7 @@ private class DynamicIslandBlurNode: ASDisplayNode {
} }
func update(_ value: CGFloat) { func update(_ value: CGFloat) {
let fadeAlpha = min(1.0, max(0.0, -0.25 + value * 1.55))
if value > 0.0 { if value > 0.0 {
self.prepare() self.prepare()
self.effectView?.layer.timeOffset = max(0.0, -0.1 + value * 1.1) self.effectView?.layer.timeOffset = max(0.0, -0.1 + value * 1.1)
@ -3739,8 +3744,7 @@ private class DynamicIslandBlurNode: ASDisplayNode {
self.effectView?.layer.timeOffset = 0.0 self.effectView?.layer.timeOffset = 0.0
self.effectView?.effect = nil self.effectView?.effect = nil
} }
self.fadeNode.alpha = fadeAlpha
self.fadeNode.alpha = min(1.0, max(0.0, -0.25 + value * 1.55))
} }
override func layout() { override func layout() {

View File

@ -667,7 +667,7 @@ public class ShareRootControllerImpl {
attemptSelectionImpl?(peer) attemptSelectionImpl?(peer)
}, createNewGroup: { }, createNewGroup: {
createNewGroupImpl?() createNewGroupImpl?()
}, pretendPresentedInModal: true, selectForumThreads: true)) }, pretendPresentedInModal: true, selectForumThreads: false))
controller.customDismiss = { controller.customDismiss = {
self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil) self?.getExtensionContext()?.completeRequest(returningItems: nil, completionHandler: nil)

View File

@ -134,6 +134,7 @@ public struct WebAppParameters {
let buttonText: String? let buttonText: String?
let keepAliveSignal: Signal<Never, KeepWebViewError>? let keepAliveSignal: Signal<Never, KeepWebViewError>?
let fromMenu: Bool let fromMenu: Bool
let fromAttachMenu: Bool
let isInline: Bool let isInline: Bool
let isSimple: Bool let isSimple: Bool
@ -147,6 +148,7 @@ public struct WebAppParameters {
buttonText: String?, buttonText: String?,
keepAliveSignal: Signal<Never, KeepWebViewError>?, keepAliveSignal: Signal<Never, KeepWebViewError>?,
fromMenu: Bool, fromMenu: Bool,
fromAttachMenu: Bool,
isInline: Bool, isInline: Bool,
isSimple: Bool isSimple: Bool
) { ) {
@ -159,6 +161,7 @@ public struct WebAppParameters {
self.buttonText = buttonText self.buttonText = buttonText
self.keepAliveSignal = keepAliveSignal self.keepAliveSignal = keepAliveSignal
self.fromMenu = fromMenu self.fromMenu = fromMenu
self.fromAttachMenu = fromAttachMenu
self.isInline = isInline self.isInline = isInline
self.isSimple = isSimple self.isSimple = isSimple
} }
@ -656,7 +659,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
self.handleSendData(data: eventData) self.handleSendData(data: eventData)
} }
case "web_app_setup_main_button": case "web_app_setup_main_button":
if let webView = self.webView, !webView.didTouchOnce && controller.url == nil { if let webView = self.webView, !webView.didTouchOnce && controller.url == nil && controller.fromAttachMenu {
self.delayedScriptMessage = message self.delayedScriptMessage = message
} else if let json = json { } else if let json = json {
if var isVisible = json["is_visible"] as? Bool { if var isVisible = json["is_visible"] as? Bool {
@ -1058,6 +1061,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
private let payload: String? private let payload: String?
private let buttonText: String? private let buttonText: String?
private let fromMenu: Bool private let fromMenu: Bool
private let fromAttachMenu: Bool
private let isInline: Bool private let isInline: Bool
private let isSimple: Bool private let isSimple: Bool
private let keepAliveSignal: Signal<Never, KeepWebViewError>? private let keepAliveSignal: Signal<Never, KeepWebViewError>?
@ -1083,6 +1087,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
self.payload = params.payload self.payload = params.payload
self.buttonText = params.buttonText self.buttonText = params.buttonText
self.fromMenu = params.fromMenu self.fromMenu = params.fromMenu
self.fromAttachMenu = params.fromAttachMenu
self.isInline = params.isInline self.isInline = params.isInline
self.isSimple = params.isSimple self.isSimple = params.isSimple
self.keepAliveSignal = params.keepAliveSignal self.keepAliveSignal = params.keepAliveSignal