From 608893e3175c1b5f96cefbce4b7d45adfc868dfc Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Tue, 14 May 2024 15:48:07 +0400 Subject: [PATCH] Message effects improvements --- .../ChatMessageAttachedContentNode.swift | 6 +++++ .../Sources/ChatMessageBubbleItemNode.swift | 21 ++++++++++++++++++ ...atMessageInteractiveInstantVideoNode.swift | 16 +++++++++++++- .../ChatMessageInteractiveMediaNode.swift | 22 ++++++++++++++++++- .../Sources/ChatMessageItemView.swift | 3 +++ .../ChatMessageMediaBubbleContentNode.swift | 8 +++++-- .../ChatRecentActionsControllerNode.swift | 1 + .../Sources/ChatControllerInteraction.swift | 3 +++ .../Sources/PeerInfoScreen.swift | 1 + .../Components/VideoMessageCameraScreen/BUILD | 1 + .../Sources/VideoMessageCameraScreen.swift | 7 ++++-- .../Chat/ChatControllerMediaRecording.swift | 5 ++++- .../ChatControllerPlayMessageEffect.swift | 22 +++++++++++++++++++ .../TelegramUI/Sources/ChatController.swift | 5 +++++ .../OverlayAudioPlayerControllerNode.swift | 1 + .../Sources/SharedAccountContext.swift | 1 + 16 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 submodules/TelegramUI/Sources/Chat/ChatControllerPlayMessageEffect.swift diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift index be15aeecee..a7fff6e9af 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift @@ -1309,6 +1309,12 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { } controllerInteraction.activateMessagePinch(sourceNode) } + contentMedia.playMessageEffect = { [weak controllerInteraction] message in + guard let controllerInteraction else { + return + } + controllerInteraction.playMessageEffect(message) + } contentMedia.activateLocalContent = { [weak self] mode in guard let self else { return diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift index 1657f60090..9bfc28b731 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift @@ -3980,6 +3980,17 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } let absoluteOrigin = mosaicStatusOrigin.offsetBy(dx: contentOrigin.x, dy: contentOrigin.y) statusNodeAnimation.animator.updateFrame(layer: mosaicStatusNode.layer, frame: CGRect(origin: CGPoint(x: absoluteOrigin.x - layoutConstants.image.statusInsets.right - size.width, y: absoluteOrigin.y - layoutConstants.image.statusInsets.bottom - size.height), size: size), completion: nil) + + if item.message.messageEffect(availableMessageEffects: item.associatedData.availableMessageEffects) != nil { + mosaicStatusNode.pressed = { [weak strongSelf] in + guard let strongSelf, let item = strongSelf.item else { + return + } + item.controllerInteraction.playMessageEffect(item.message) + } + } else { + mosaicStatusNode.pressed = nil + } } else if let mosaicStatusNode = strongSelf.mosaicStatusNode { strongSelf.mosaicStatusNode = nil mosaicStatusNode.removeFromSupernode() @@ -4886,6 +4897,12 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } } + if let mosaicStatusNode = self.mosaicStatusNode { + if let result = mosaicStatusNode.hitTest(self.view.convert(point, to: mosaicStatusNode.view), with: event) { + return result + } + } + for contentNode in self.contentNodes { if let result = contentNode.hitTest(self.view.convert(point, to: contentNode.view), with: event) { return result @@ -5929,6 +5946,10 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } } + override public func playMessageEffect() { + self.playMessageEffect(force: true) + } + private func updateVisibility() { guard let item = self.item else { return diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift index c7c9cdb1cd..44455ad61b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -564,6 +564,8 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { isReplyThread = true } + let messageEffect = item.topMessage.messageEffect(availableMessageEffects: item.associatedData.availableMessageEffects) + let statusSuggestedWidthAndContinue = makeDateAndStatusLayout(ChatMessageDateAndStatusNode.Arguments( context: item.context, presentationData: item.presentationData, @@ -579,7 +581,7 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { reactionPeers: dateReactionsAndPeers.peers, displayAllReactionPeers: item.message.id.peerId.namespace == Namespaces.Peer.CloudUser, areReactionsTags: item.topMessage.areReactionsTags(accountPeerId: item.context.account.peerId), - messageEffect: item.topMessage.messageEffect(availableMessageEffects: item.associatedData.availableMessageEffects), + messageEffect: messageEffect, replyCount: dateReplies, isPinned: item.message.tags.contains(.pinned) && !item.associatedData.isInPinnedListMode && !isReplyThread, hasAutoremove: item.message.isSelfExpiring, @@ -997,6 +999,13 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { } item.controllerInteraction.displayImportedMessageTooltip(strongSelf.dateAndStatusNode) } + } else if messageEffect != nil { + strongSelf.dateAndStatusNode.pressed = { [weak strongSelf] in + guard let strongSelf, let item = strongSelf.item else { + return + } + item.controllerInteraction.playMessageEffect(item.message) + } } else { strongSelf.dateAndStatusNode.pressed = nil } @@ -1630,6 +1639,11 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { if let statusNode = self.statusNode, statusNode.supernode != nil, !statusNode.isHidden, statusNode.frame.contains(point) { return self.view } + if self.dateAndStatusNode.supernode != nil, !self.dateAndStatusNode.isHidden { + if let result = self.dateAndStatusNode.hitTest(self.view.convert(point, to: self.dateAndStatusNode.view), with: event) { + return result + } + } if let videoNode = self.videoNode, videoNode.view.frame.contains(point) { return self.view diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode/Sources/ChatMessageInteractiveMediaNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode/Sources/ChatMessageInteractiveMediaNode.swift index c2adbf6d9d..516a8755eb 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode/Sources/ChatMessageInteractiveMediaNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode/Sources/ChatMessageInteractiveMediaNode.swift @@ -456,6 +456,7 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr public var activateLocalContent: (InteractiveMediaNodeActivateContent) -> Void = { _ in } public var activatePinch: ((PinchSourceContainerNode) -> Void)? public var updateMessageReaction: ((Message, ChatControllerInteractionReaction, Bool, ContextExtractedContentContainingView?) -> Void)? + public var playMessageEffect: ((Message) -> Void)? override public init() { self.pinchContainerNode = PinchSourceContainerNode() @@ -637,6 +638,11 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr } } + override public func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + let result = super.hitTest(point, with: event) + return result + } + @objc private func imageTap(_ recognizer: UITapGestureRecognizer) { if case .ended = recognizer.state { let point = recognizer.location(in: self.imageNode.view) @@ -857,6 +863,8 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr var statusSize = CGSize() var statusApply: ((ListViewItemUpdateAnimation) -> Void)? + + let messageEffect = message.messageEffect(availableMessageEffects: associatedData.availableMessageEffects) if let dateAndStatus = dateAndStatus { let statusSuggestedWidthAndContinue = statusLayout(ChatMessageDateAndStatusNode.Arguments( @@ -874,7 +882,7 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr reactionPeers: dateAndStatus.dateReactionPeers, displayAllReactionPeers: message.id.peerId.namespace == Namespaces.Peer.CloudUser, areReactionsTags: message.areReactionsTags(accountPeerId: context.account.peerId), - messageEffect: message.messageEffect(availableMessageEffects: associatedData.availableMessageEffects), + messageEffect: messageEffect, replyCount: dateAndStatus.dateReplies, isPinned: dateAndStatus.isPinned, hasAutoremove: message.isSelfExpiring, @@ -1465,8 +1473,20 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr transition.animator.updateFrame(layer: strongSelf.dateAndStatusNode.layer, frame: dateAndStatusFrame, completion: nil) statusApply(transition) } + + if messageEffect != nil { + strongSelf.dateAndStatusNode.pressed = { [weak strongSelf] in + guard let strongSelf, let message = strongSelf.message else { + return + } + strongSelf.playMessageEffect?(message) + } + } else { + strongSelf.dateAndStatusNode.pressed = nil + } } else if strongSelf.dateAndStatusNode.supernode != nil { strongSelf.dateAndStatusNode.removeFromSupernode() + strongSelf.dateAndStatusNode.pressed = nil } if let statusNode = strongSelf.statusNode { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift index 0877313e09..3088dae88f 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift @@ -887,4 +887,7 @@ open class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol { open func contentFrame() -> CGRect { return self.bounds } + + open func playMessageEffect() { + } } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift index 26c0ef9212..168f20a5f2 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageMediaBubbleContentNode/Sources/ChatMessageMediaBubbleContentNode.swift @@ -71,6 +71,12 @@ public class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { } strongSelf.item?.controllerInteraction.activateMessagePinch(sourceNode) } + self.interactiveImageNode.playMessageEffect = { [weak self] message in + guard let strongSelf = self, let _ = strongSelf.item else { + return + } + strongSelf.item?.controllerInteraction.playMessageEffect(message) + } } required public init?(coder aDecoder: NSCoder) { @@ -403,8 +409,6 @@ public class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode { } item.controllerInteraction.displayImportedMessageTooltip(strongSelf.interactiveImageNode.dateAndStatusNode) } - } else { - strongSelf.interactiveImageNode.dateAndStatusNode.pressed = nil } } }) diff --git a/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsControllerNode.swift b/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsControllerNode.swift index ab878010c0..cd6b4a8321 100644 --- a/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsControllerNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsControllerNode.swift @@ -614,6 +614,7 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode { }, openRecommendedChannelContextMenu: { _, _, _ in }, openGroupBoostInfo: { _, _ in }, openStickerEditor: { + }, playMessageEffect: { _ in }, requestMessageUpdate: { _, _ in }, cancelInteractiveKeyboardGestures: { }, dismissTextInput: { diff --git a/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift b/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift index 7d426b3957..c0c3ad2844 100644 --- a/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift +++ b/submodules/TelegramUI/Components/ChatControllerInteraction/Sources/ChatControllerInteraction.swift @@ -242,6 +242,7 @@ public final class ChatControllerInteraction: ChatControllerInteractionProtocol public let openRecommendedChannelContextMenu: (EnginePeer, UIView, ContextGesture?) -> Void public let openGroupBoostInfo: (EnginePeer.Id?, Int) -> Void public let openStickerEditor: () -> Void + public let playMessageEffect: (Message) -> Void public let requestMessageUpdate: (MessageId, Bool) -> Void public let cancelInteractiveKeyboardGestures: () -> Void @@ -367,6 +368,7 @@ public final class ChatControllerInteraction: ChatControllerInteractionProtocol openRecommendedChannelContextMenu: @escaping (EnginePeer, UIView, ContextGesture?) -> Void, openGroupBoostInfo: @escaping (EnginePeer.Id?, Int) -> Void, openStickerEditor: @escaping () -> Void, + playMessageEffect: @escaping (Message) -> Void, requestMessageUpdate: @escaping (MessageId, Bool) -> Void, cancelInteractiveKeyboardGestures: @escaping () -> Void, dismissTextInput: @escaping () -> Void, @@ -472,6 +474,7 @@ public final class ChatControllerInteraction: ChatControllerInteractionProtocol self.openRecommendedChannelContextMenu = openRecommendedChannelContextMenu self.openGroupBoostInfo = openGroupBoostInfo self.openStickerEditor = openStickerEditor + self.playMessageEffect = playMessageEffect self.requestMessageUpdate = requestMessageUpdate self.cancelInteractiveKeyboardGestures = cancelInteractiveKeyboardGestures diff --git a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift index 35c141cf27..4439aef9d2 100644 --- a/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoScreen.swift @@ -3326,6 +3326,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro }, openRecommendedChannelContextMenu: { _, _, _ in }, openGroupBoostInfo: { _, _ in }, openStickerEditor: { + }, playMessageEffect: { _ in }, requestMessageUpdate: { _, _ in }, cancelInteractiveKeyboardGestures: { }, dismissTextInput: { diff --git a/submodules/TelegramUI/Components/VideoMessageCameraScreen/BUILD b/submodules/TelegramUI/Components/VideoMessageCameraScreen/BUILD index 3405ccaf0d..2d431411f1 100644 --- a/submodules/TelegramUI/Components/VideoMessageCameraScreen/BUILD +++ b/submodules/TelegramUI/Components/VideoMessageCameraScreen/BUILD @@ -40,6 +40,7 @@ swift_library( "//submodules/LegacyMediaPickerUI", "//submodules/TelegramAudio", "//submodules/ChatSendMessageActionUI", + "//submodules/TelegramUI/Components/ChatControllerInteraction", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift b/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift index d873e6011f..8438eaed7a 100644 --- a/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift +++ b/submodules/TelegramUI/Components/VideoMessageCameraScreen/Sources/VideoMessageCameraScreen.swift @@ -28,6 +28,7 @@ import ImageCompression import LegacyMediaPickerUI import TelegramAudio import ChatSendMessageActionUI +import ChatControllerInteraction struct CameraState: Equatable { enum Recording: Equatable { @@ -1467,7 +1468,7 @@ public class VideoMessageCameraScreen: ViewController { fileprivate var didSend = false fileprivate var lastActionTimestamp: Double? fileprivate var isSendingImmediately = false - public func sendVideoRecording(silentPosting: Bool? = nil, scheduleTime: Int32? = nil) { + public func sendVideoRecording(silentPosting: Bool? = nil, scheduleTime: Int32? = nil, messageEffect: ChatSendMessageEffect? = nil) { guard !self.didSend else { return } @@ -1613,11 +1614,13 @@ public class VideoMessageCameraScreen: ViewController { let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: Int64.random(in: Int64.min ... Int64.max)), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, videoThumbnails: [], immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: [.FileName(fileName: "video.mp4"), .Video(duration: finalDuration, size: video.dimensions, flags: [.instantRoundVideo], preloadSize: nil)]) - var attributes: [MessageAttribute] = [] if self.cameraState.isViewOnceEnabled { attributes.append(AutoremoveTimeoutMessageAttribute(timeout: viewOnceTimeout, countdownBeginTime: nil)) } + if let messageEffect { + attributes.append(EffectMessageAttribute(id: messageEffect.id)) + } self.completion(.message( text: "", diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift index 3fa9e43879..9217def435 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerMediaRecording.swift @@ -517,6 +517,9 @@ extension ChatControllerImpl { if viewOnce { attributes.append(AutoremoveTimeoutMessageAttribute(timeout: viewOnceTimeout, countdownBeginTime: nil)) } + if let messageEffect { + attributes.append(EffectMessageAttribute(id: messageEffect.id)) + } let messages: [EnqueueMessage] = [.message(text: "", attributes: attributes, inlineStickers: [:], mediaReference: .standalone(media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: Int64.random(in: Int64.min ... Int64.max)), partialReference: nil, resource: audio.resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "audio/ogg", size: Int64(audio.fileSize), attributes: [.Audio(isVoice: true, duration: Int(audio.duration), title: nil, performer: nil, waveform: waveformBuffer)])), threadId: self.chatLocation.threadId, replyToMessageId: self.presentationInterfaceState.interfaceState.replyMessageSubject?.subjectModel, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])] @@ -542,7 +545,7 @@ extension ChatControllerImpl { donateSendMessageIntent(account: self.context.account, sharedContext: self.context.sharedContext, intentContext: .chat, peerIds: [peerId]) case .video: - self.videoRecorderValue?.sendVideoRecording(silentPosting: silentPosting, scheduleTime: scheduleTime) + self.videoRecorderValue?.sendVideoRecording(silentPosting: silentPosting, scheduleTime: scheduleTime, messageEffect: messageEffect) } } } diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerPlayMessageEffect.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerPlayMessageEffect.swift new file mode 100644 index 0000000000..e135ba84ba --- /dev/null +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerPlayMessageEffect.swift @@ -0,0 +1,22 @@ +import Foundation +import UIKit +import Display +import SwiftSignalKit +import Postbox +import TelegramCore +import TelegramUIPreferences +import AccountContext +import ChatMessageItemView + +extension ChatControllerImpl { + func playMessageEffect(message: Message) { + var messageItemNode: ChatMessageItemView? + self.chatDisplayNode.historyNode.forEachVisibleMessageItemNode { itemNode in + if let item = itemNode.item, item.message.id == message.id { + messageItemNode = itemNode + } + } + + messageItemNode?.playMessageEffect() + } +} diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 6395962f23..d50cf4dfac 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -4629,6 +4629,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return } self.openStickerEditor() + }, playMessageEffect: { [weak self] message in + guard let self else { + return + } + self.playMessageEffect(message: message) }, requestMessageUpdate: { [weak self] id, scroll in if let self { self.chatDisplayNode.historyNode.requestMessageUpdate(id, andScrollToItem: scroll) diff --git a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift index 5f67c834e4..35c542e0f8 100644 --- a/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift +++ b/submodules/TelegramUI/Sources/OverlayAudioPlayerControllerNode.swift @@ -175,6 +175,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, ASGestu }, openRecommendedChannelContextMenu: { _, _, _ in }, openGroupBoostInfo: { _, _ in }, openStickerEditor: { + }, playMessageEffect: { _ in }, requestMessageUpdate: { _, _ in }, cancelInteractiveKeyboardGestures: { }, dismissTextInput: { diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index a74e286ae2..698c5b2d12 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1769,6 +1769,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { }, openRecommendedChannelContextMenu: { _, _, _ in }, openGroupBoostInfo: { _, _ in }, openStickerEditor: { + }, playMessageEffect: { _ in }, requestMessageUpdate: { _, _ in }, cancelInteractiveKeyboardGestures: { }, dismissTextInput: {