mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 09:20:08 +00:00
Various fixes
This commit is contained in:
parent
b1f80d475c
commit
cf49acb4aa
@ -14,6 +14,7 @@ import InAppPurchaseManager
|
|||||||
import AnimationCache
|
import AnimationCache
|
||||||
import MultiAnimationRenderer
|
import MultiAnimationRenderer
|
||||||
import Photos
|
import Photos
|
||||||
|
import TextFormat
|
||||||
|
|
||||||
public final class TelegramApplicationOpenUrlCompletion {
|
public final class TelegramApplicationOpenUrlCompletion {
|
||||||
public let completion: (Bool) -> Void
|
public let completion: (Bool) -> Void
|
||||||
@ -965,7 +966,7 @@ public protocol SharedAccountContext: AnyObject {
|
|||||||
func makeSetupTwoFactorAuthController(context: AccountContext) -> ViewController
|
func makeSetupTwoFactorAuthController(context: AccountContext) -> ViewController
|
||||||
func makeStorageManagementController(context: AccountContext) -> ViewController
|
func makeStorageManagementController(context: AccountContext) -> ViewController
|
||||||
func makeAttachmentFileController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, bannedSendMedia: (Int32, Bool)?, presentGallery: @escaping () -> Void, presentFiles: @escaping () -> Void, send: @escaping (AnyMediaReference) -> Void) -> AttachmentFileController
|
func makeAttachmentFileController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)?, bannedSendMedia: (Int32, Bool)?, presentGallery: @escaping () -> Void, presentFiles: @escaping () -> Void, send: @escaping (AnyMediaReference) -> Void) -> AttachmentFileController
|
||||||
func makeGalleryCaptionPanelView(context: AccountContext, chatLocation: ChatLocation, isScheduledMessages: Bool, customEmojiAvailable: Bool, present: @escaping (ViewController) -> Void, presentInGlobalOverlay: @escaping (ViewController) -> Void) -> NSObject?
|
func makeGalleryCaptionPanelView(context: AccountContext, chatLocation: ChatLocation, isScheduledMessages: Bool, isFile: Bool, customEmojiAvailable: Bool, present: @escaping (ViewController) -> Void, presentInGlobalOverlay: @escaping (ViewController) -> Void) -> NSObject?
|
||||||
func makeHashtagSearchController(context: AccountContext, peer: EnginePeer?, query: String, all: Bool) -> ViewController
|
func makeHashtagSearchController(context: AccountContext, peer: EnginePeer?, query: String, all: Bool) -> ViewController
|
||||||
func makeMyStoriesController(context: AccountContext, isArchive: Bool) -> ViewController
|
func makeMyStoriesController(context: AccountContext, isArchive: Bool) -> ViewController
|
||||||
func makeArchiveSettingsController(context: AccountContext) -> ViewController
|
func makeArchiveSettingsController(context: AccountContext) -> ViewController
|
||||||
@ -998,7 +999,7 @@ public protocol SharedAccountContext: AnyObject {
|
|||||||
func chatAvailableMessageActions(engine: TelegramEngine, accountPeerId: EnginePeer.Id, messageIds: Set<EngineMessage.Id>, messages: [EngineMessage.Id: EngineMessage], peers: [EnginePeer.Id: EnginePeer]) -> Signal<ChatAvailableMessageActions, NoError>
|
func chatAvailableMessageActions(engine: TelegramEngine, accountPeerId: EnginePeer.Id, messageIds: Set<EngineMessage.Id>, messages: [EngineMessage.Id: EngineMessage], peers: [EnginePeer.Id: EnginePeer]) -> Signal<ChatAvailableMessageActions, NoError>
|
||||||
func resolveUrl(context: AccountContext, peerId: PeerId?, url: String, skipUrlAuth: Bool) -> Signal<ResolvedUrl, NoError>
|
func resolveUrl(context: AccountContext, peerId: PeerId?, url: String, skipUrlAuth: Bool) -> Signal<ResolvedUrl, NoError>
|
||||||
func resolveUrlWithProgress(context: AccountContext, peerId: PeerId?, url: String, skipUrlAuth: Bool) -> Signal<ResolveUrlResult, NoError>
|
func resolveUrlWithProgress(context: AccountContext, peerId: PeerId?, url: String, skipUrlAuth: Bool) -> Signal<ResolveUrlResult, NoError>
|
||||||
func openResolvedUrl(_ resolvedUrl: ResolvedUrl, context: AccountContext, urlContext: OpenURLContext, navigationController: NavigationController?, forceExternal: Bool, openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void, sendFile: ((FileMediaReference) -> Void)?, sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?, requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)?, joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?, present: @escaping (ViewController, Any?) -> Void, dismissInput: @escaping () -> Void, contentContext: Any?, progress: Promise<Bool>?, completion: (() -> Void)?)
|
func openResolvedUrl(_ resolvedUrl: ResolvedUrl, context: AccountContext, urlContext: OpenURLContext, navigationController: NavigationController?, forceExternal: Bool, openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void, sendFile: ((FileMediaReference) -> Void)?, sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?, sendEmoji: ((String, ChatTextInputTextCustomEmojiAttribute) -> Void)?, requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)?, joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?, present: @escaping (ViewController, Any?) -> Void, dismissInput: @escaping () -> Void, contentContext: Any?, progress: Promise<Bool>?, completion: (() -> Void)?)
|
||||||
func openAddContact(context: AccountContext, firstName: String, lastName: String, phoneNumber: String, label: String, present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, completed: @escaping () -> Void)
|
func openAddContact(context: AccountContext, firstName: String, lastName: String, phoneNumber: String, label: String, present: @escaping (ViewController, Any?) -> Void, pushController: @escaping (ViewController) -> Void, completed: @escaping () -> Void)
|
||||||
func openAddPersonContact(context: AccountContext, peerId: PeerId, pushController: @escaping (ViewController) -> Void, present: @escaping (ViewController, Any?) -> Void)
|
func openAddPersonContact(context: AccountContext, peerId: PeerId, pushController: @escaping (ViewController) -> Void, present: @escaping (ViewController, Any?) -> Void)
|
||||||
func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void)
|
func presentContactsWarningSuppression(context: AccountContext, present: (ViewController, Any?) -> Void)
|
||||||
|
|||||||
@ -200,8 +200,10 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo
|
|||||||
}, openResolved: { [weak self] resolved in
|
}, openResolved: { [weak self] resolved in
|
||||||
context.sharedContext.openResolvedUrl(resolved, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peerId, navigation in
|
context.sharedContext.openResolvedUrl(resolved, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peerId, navigation in
|
||||||
|
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { c, a in
|
present: { c, a in
|
||||||
|
|||||||
@ -276,7 +276,7 @@ private enum DebugControllerEntry: ItemListNodeEntry {
|
|||||||
} else {
|
} else {
|
||||||
UIPasteboard.general.setData(data, forPasteboardType: dataType)
|
UIPasteboard.general.setData(data, forPasteboardType: dataType)
|
||||||
}
|
}
|
||||||
context.sharedContext.openResolvedUrl(.importStickers, context: context, urlContext: .generic, navigationController: arguments.getNavigationController(), forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { c, a in arguments.presentController(c, a as? ViewControllerPresentationArguments) }, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
context.sharedContext.openResolvedUrl(.importStickers, context: context, urlContext: .generic, navigationController: arguments.getNavigationController(), forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { c, a in arguments.presentController(c, a as? ViewControllerPresentationArguments) }, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
case .sendLogs:
|
case .sendLogs:
|
||||||
|
|||||||
@ -1375,8 +1375,10 @@ final class InstantPageControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { c, a in
|
present: { c, a in
|
||||||
|
|||||||
@ -46,6 +46,7 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/MediaEditor",
|
"//submodules/TelegramUI/Components/MediaEditor",
|
||||||
"//submodules/RadialStatusNode",
|
"//submodules/RadialStatusNode",
|
||||||
"//submodules/Camera",
|
"//submodules/Camera",
|
||||||
|
"//submodules/TelegramUI/Components/MediaEditor/ImageObjectSeparation",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
|||||||
@ -24,6 +24,7 @@ import MoreButtonNode
|
|||||||
import Camera
|
import Camera
|
||||||
import CameraScreen
|
import CameraScreen
|
||||||
import MediaEditor
|
import MediaEditor
|
||||||
|
import ImageObjectSeparation
|
||||||
|
|
||||||
final class MediaPickerInteraction {
|
final class MediaPickerInteraction {
|
||||||
let downloadManager: AssetDownloadManager
|
let downloadManager: AssetDownloadManager
|
||||||
@ -1941,11 +1942,10 @@ public final class MediaPickerScreen: ViewController, AttachmentContainable {
|
|||||||
|
|
||||||
self.updateSelectionState(count: Int32(selectionContext.count()))
|
self.updateSelectionState(count: Int32(selectionContext.count()))
|
||||||
|
|
||||||
// self.longTapWithTabBar = { [weak self] in
|
|
||||||
// if let self, self.groupsController == nil {
|
if case let .assets(_, mode) = self.subject, case .createSticker = mode {
|
||||||
// self.presentSearch(activateOnDisplay: false)
|
let _ = cutoutAvailability(context: context).startStandalone()
|
||||||
// }
|
}
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
required init(coder aDecoder: NSCoder) {
|
required init(coder aDecoder: NSCoder) {
|
||||||
|
|||||||
@ -774,7 +774,7 @@ private func createGiveawayControllerEntries(
|
|||||||
if state.showPrizeDescription {
|
if state.showPrizeDescription {
|
||||||
entries.append(.prizeDescriptionText(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizesPlaceholder, state.prizeDescription, state.subscriptions))
|
entries.append(.prizeDescriptionText(presentationData.theme, presentationData.strings.BoostGift_AdditionalPrizesPlaceholder, state.prizeDescription, state.subscriptions))
|
||||||
|
|
||||||
let monthsString = presentationData.strings.BoostGift_AdditionalPrizesInfoForMonths(state.selectedMonths ?? 3)
|
let monthsString = presentationData.strings.BoostGift_AdditionalPrizesInfoForMonths(state.selectedMonths ?? 12)
|
||||||
if state.prizeDescription.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
|
if state.prizeDescription.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
|
||||||
let subscriptionsString = presentationData.strings.BoostGift_AdditionalPrizesInfoSubscriptions(state.subscriptions).replacingOccurrences(of: "\(state.subscriptions) ", with: "")
|
let subscriptionsString = presentationData.strings.BoostGift_AdditionalPrizesInfoSubscriptions(state.subscriptions).replacingOccurrences(of: "\(state.subscriptions) ", with: "")
|
||||||
prizeDescriptionInfoText = presentationData.strings.BoostGift_AdditionalPrizesInfoOn("\(state.subscriptions)", subscriptionsString, monthsString).string
|
prizeDescriptionInfoText = presentationData.strings.BoostGift_AdditionalPrizesInfoOn("\(state.subscriptions)", subscriptionsString, monthsString).string
|
||||||
|
|||||||
@ -621,7 +621,7 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent {
|
|||||||
let _ = (signal
|
let _ = (signal
|
||||||
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak controller] c, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak controller] c, arguments in
|
||||||
controller?.push(c)
|
controller?.push(c)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -2704,7 +2704,7 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent {
|
|||||||
let _ = (signal
|
let _ = (signal
|
||||||
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak controller] c, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak controller] c, arguments in
|
||||||
controller?.push(c)
|
controller?.push(c)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -915,10 +915,11 @@ private final class QrCodeScanScreenNode: ViewControllerTracingNode, ASScrollVie
|
|||||||
navigationController.setViewControllers(viewControllers, animated: false)
|
navigationController.setViewControllers(viewControllers, animated: false)
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}, sendFile: nil,
|
},
|
||||||
sendSticker: { _, _, _ in
|
sendFile: nil,
|
||||||
return false
|
sendSticker: nil,
|
||||||
}, requestMessageActionUrlAuth: nil,
|
sendEmoji: nil,
|
||||||
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: { peerId, invite, call in
|
joinVoiceChat: { peerId, invite, call in
|
||||||
}, present: { [weak self] c, a in
|
}, present: { [weak self] c, a in
|
||||||
self?.controller?.present(c, in: .window(.root), with: a)
|
self?.controller?.present(c, in: .window(.root), with: a)
|
||||||
|
|||||||
@ -126,6 +126,12 @@ public final class ReactionNode: ASDisplayNode, ReactionItemNode {
|
|||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
if item.stillAnimation.isCustomTemplateEmoji {
|
||||||
|
if let animationNode = self.staticAnimationNode as? DefaultAnimatedStickerNodeImpl {
|
||||||
|
animationNode.dynamicColor = theme.chat.inputPanel.panelControlAccentColor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let animateInAnimationNode = self.animateInAnimationNode {
|
if let animateInAnimationNode = self.animateInAnimationNode {
|
||||||
self.addSubnode(animateInAnimationNode)
|
self.addSubnode(animateInAnimationNode)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -316,7 +316,7 @@ public func deleteAccountOptionsController(context: AccountContext, navigationCo
|
|||||||
dismissImpl?()
|
dismissImpl?()
|
||||||
|
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
||||||
pushControllerImpl?(controller)
|
pushControllerImpl?(controller)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
@ -357,7 +357,7 @@ public func deleteAccountOptionsController(context: AccountContext, navigationCo
|
|||||||
dismissImpl?()
|
dismissImpl?()
|
||||||
|
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
||||||
pushControllerImpl?(controller)
|
pushControllerImpl?(controller)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -223,7 +223,7 @@ public func logoutOptionsController(context: AccountContext, navigationControlle
|
|||||||
dismissImpl?()
|
dismissImpl?()
|
||||||
|
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
||||||
pushControllerImpl?(controller)
|
pushControllerImpl?(controller)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1069,7 +1069,7 @@ func settingsSearchableItems(context: AccountContext, notificationExceptionsList
|
|||||||
let _ = (cachedFaqInstantPage(context: context)
|
let _ = (cachedFaqInstantPage(context: context)
|
||||||
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
|> deliverOnMainQueue).start(next: { resolvedUrl in
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { controller, arguments in
|
||||||
present(.push, controller)
|
present(.push, controller)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -952,15 +952,13 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let content = StickerPreviewPeekContent(context: context, theme: presentationData.theme, strings: presentationData.strings, item: .pack(file), isLocked: isLocked, menu: menuItems, openPremiumIntro: { [weak self] in
|
let content = StickerPreviewPeekContent(context: context, theme: presentationData.theme, strings: presentationData.strings, item: .pack(file), isLocked: isLocked, menu: menuItems, openPremiumIntro: { [weak self] in
|
||||||
guard let self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
guard let controller = self.controller else {
|
let controller = PremiumIntroScreen(context: strongSelf.context, source: .stickers)
|
||||||
return
|
let navigationController = strongSelf.controller?.parentNavigationController
|
||||||
}
|
strongSelf.controller?.dismiss(animated: false, completion: nil)
|
||||||
|
navigationController?.pushViewController(controller)
|
||||||
let premiumController = PremiumIntroScreen(context: context, source: .stickers)
|
|
||||||
controller.push(premiumController)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return (strongSelf.view, itemLayer.convert(itemLayer.bounds, to: strongSelf.view.layer), content)
|
return (strongSelf.view, itemLayer.convert(itemLayer.bounds, to: strongSelf.view.layer), content)
|
||||||
@ -1986,7 +1984,7 @@ private final class StickerPackContainer: ASDisplayNode {
|
|||||||
actionAreaBottomInset = 2.0
|
actionAreaBottomInset = 2.0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let (info, _, isInstalled) = self.currentStickerPack, isInstalled, (!info.flags.contains(.isCreator) && !info.flags.contains(.isEmoji)) {
|
if let (info, _, isInstalled) = self.currentStickerPack, isInstalled, (!info.flags.contains(.isCreator) || info.flags.contains(.isEmoji)) {
|
||||||
buttonHeight = 42.0
|
buttonHeight = 42.0
|
||||||
actionAreaTopInset = 1.0
|
actionAreaTopInset = 1.0
|
||||||
actionAreaBottomInset = 2.0
|
actionAreaBottomInset = 2.0
|
||||||
|
|||||||
@ -1232,8 +1232,10 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
|
|||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.openPeer(peer: peer)
|
strongSelf.openPeer(peer: peer)
|
||||||
}
|
}
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { c, a in
|
present: { c, a in
|
||||||
|
|||||||
@ -20,6 +20,7 @@ public class LegacyMessageInputPanelNode: ASDisplayNode, TGCaptionPanelView {
|
|||||||
private let context: AccountContext
|
private let context: AccountContext
|
||||||
private let chatLocation: ChatLocation
|
private let chatLocation: ChatLocation
|
||||||
private let isScheduledMessages: Bool
|
private let isScheduledMessages: Bool
|
||||||
|
private let isFile: Bool
|
||||||
private let present: (ViewController) -> Void
|
private let present: (ViewController) -> Void
|
||||||
private let presentInGlobalOverlay: (ViewController) -> Void
|
private let presentInGlobalOverlay: (ViewController) -> Void
|
||||||
private let makeEntityInputView: () -> LegacyMessageInputPanelInputView?
|
private let makeEntityInputView: () -> LegacyMessageInputPanelInputView?
|
||||||
@ -44,6 +45,7 @@ public class LegacyMessageInputPanelNode: ASDisplayNode, TGCaptionPanelView {
|
|||||||
context: AccountContext,
|
context: AccountContext,
|
||||||
chatLocation: ChatLocation,
|
chatLocation: ChatLocation,
|
||||||
isScheduledMessages: Bool,
|
isScheduledMessages: Bool,
|
||||||
|
isFile: Bool,
|
||||||
present: @escaping (ViewController) -> Void,
|
present: @escaping (ViewController) -> Void,
|
||||||
presentInGlobalOverlay: @escaping (ViewController) -> Void,
|
presentInGlobalOverlay: @escaping (ViewController) -> Void,
|
||||||
makeEntityInputView: @escaping () -> LegacyMessageInputPanelInputView?
|
makeEntityInputView: @escaping () -> LegacyMessageInputPanelInputView?
|
||||||
@ -51,6 +53,7 @@ public class LegacyMessageInputPanelNode: ASDisplayNode, TGCaptionPanelView {
|
|||||||
self.context = context
|
self.context = context
|
||||||
self.chatLocation = chatLocation
|
self.chatLocation = chatLocation
|
||||||
self.isScheduledMessages = isScheduledMessages
|
self.isScheduledMessages = isScheduledMessages
|
||||||
|
self.isFile = isFile
|
||||||
self.present = present
|
self.present = present
|
||||||
self.presentInGlobalOverlay = presentInGlobalOverlay
|
self.presentInGlobalOverlay = presentInGlobalOverlay
|
||||||
self.makeEntityInputView = makeEntityInputView
|
self.makeEntityInputView = makeEntityInputView
|
||||||
@ -158,17 +161,21 @@ public class LegacyMessageInputPanelNode: ASDisplayNode, TGCaptionPanelView {
|
|||||||
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
|
||||||
let theme = defaultDarkColorPresentationTheme
|
let theme = defaultDarkColorPresentationTheme
|
||||||
|
|
||||||
var timeoutValue: String
|
var timeoutValue: String?
|
||||||
var timeoutSelected = false
|
var timeoutSelected = false
|
||||||
if let timeout = self.currentTimeout {
|
if self.isFile {
|
||||||
if timeout == viewOnceTimeout {
|
timeoutValue = nil
|
||||||
timeoutValue = "1"
|
|
||||||
} else {
|
|
||||||
timeoutValue = "\(timeout)"
|
|
||||||
}
|
|
||||||
timeoutSelected = true
|
|
||||||
} else {
|
} else {
|
||||||
timeoutValue = "1"
|
if let timeout = self.currentTimeout {
|
||||||
|
if timeout == viewOnceTimeout {
|
||||||
|
timeoutValue = "1"
|
||||||
|
} else {
|
||||||
|
timeoutValue = "\(timeout)"
|
||||||
|
}
|
||||||
|
timeoutSelected = true
|
||||||
|
} else {
|
||||||
|
timeoutValue = "1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxInputPanelHeight = maxHeight
|
var maxInputPanelHeight = maxHeight
|
||||||
|
|||||||
@ -38,11 +38,7 @@ public func cutoutAvailability(context: AccountContext) -> Signal<CutoutAvailabi
|
|||||||
return .single(.available)
|
return .single(.available)
|
||||||
} else if #available(iOS 14.0, *) {
|
} else if #available(iOS 14.0, *) {
|
||||||
let compiledModelPath = modelPath()
|
let compiledModelPath = modelPath()
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
// try? FileManager.default.removeItem(atPath: compiledModelPath)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if FileManager.default.fileExists(atPath: compiledModelPath) {
|
if FileManager.default.fileExists(atPath: compiledModelPath) {
|
||||||
return .single(.available)
|
return .single(.available)
|
||||||
}
|
}
|
||||||
@ -77,10 +73,10 @@ public func cutoutAvailability(context: AccountContext) -> Signal<CutoutAvailabi
|
|||||||
case progress(Float)
|
case progress(Float)
|
||||||
case failed
|
case failed
|
||||||
}
|
}
|
||||||
|
|
||||||
let fetchStatus = Signal<FetchStatus, NoError> { subscriber in
|
let fetchStatus = Signal<FetchStatus, NoError> { subscriber in
|
||||||
let fetchedDisposable = fetchedData.start()
|
let fetchedDisposable = fetchedData.start()
|
||||||
let thumbnailDisposable = context.account.postbox.mediaBox.resourceData(file.resource, attemptSynchronously: false).start(next: { next in
|
let resourceDataDisposable = context.account.postbox.mediaBox.resourceData(file.resource, attemptSynchronously: false).start(next: { next in
|
||||||
if next.complete {
|
if next.complete {
|
||||||
SSZipArchive.unzipFile(atPath: next.path, toDestination: NSTemporaryDirectory())
|
SSZipArchive.unzipFile(atPath: next.path, toDestination: NSTemporaryDirectory())
|
||||||
subscriber.putNext(.completed(compiledModelPath))
|
subscriber.putNext(.completed(compiledModelPath))
|
||||||
@ -97,15 +93,14 @@ public func cutoutAvailability(context: AccountContext) -> Signal<CutoutAvailabi
|
|||||||
})
|
})
|
||||||
return ActionDisposable {
|
return ActionDisposable {
|
||||||
fetchedDisposable.dispose()
|
fetchedDisposable.dispose()
|
||||||
thumbnailDisposable.dispose()
|
resourceDataDisposable.dispose()
|
||||||
progressDisposable.dispose()
|
progressDisposable.dispose()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fetchStatus
|
return fetchStatus
|
||||||
|> mapToSignal { status -> Signal<CutoutAvailability, NoError> in
|
|> mapToSignal { status -> Signal<CutoutAvailability, NoError> in
|
||||||
switch status {
|
switch status {
|
||||||
case let .completed(path):
|
case .completed:
|
||||||
let _ = path
|
|
||||||
return .single(.available)
|
return .single(.available)
|
||||||
case let .progress(progress):
|
case let .progress(progress):
|
||||||
return .single(.progress(progress))
|
return .single(.progress(progress))
|
||||||
|
|||||||
@ -5031,27 +5031,28 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
switch navigation {
|
switch navigation {
|
||||||
case let .chat(inputState, subject, peekData):
|
case let .chat(inputState, subject, peekData):
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), subject: subject, updateTextInputState: inputState, activateInput: inputState != nil ? .text : nil, keepStack: .always, peekData: peekData))
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), subject: subject, updateTextInputState: inputState, activateInput: inputState != nil ? .text : nil, keepStack: .always, peekData: peekData))
|
||||||
case .info:
|
case .info:
|
||||||
if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil {
|
if let strongSelf = self, peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil {
|
||||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
|
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) {
|
||||||
strongSelf.controller?.push(infoController)
|
strongSelf.controller?.push(infoController)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
case let .withBotStartPayload(startPayload):
|
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), botStart: startPayload, keepStack: .always))
|
|
||||||
case let .withAttachBot(attachBotStart):
|
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), attachBotStart: attachBotStart))
|
|
||||||
case let .withBotApp(botAppStart):
|
|
||||||
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), botAppStart: botAppStart))
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}, sendFile: nil,
|
case let .withBotStartPayload(startPayload):
|
||||||
sendSticker: { _, _, _ in
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), botStart: startPayload, keepStack: .always))
|
||||||
return false
|
case let .withAttachBot(attachBotStart):
|
||||||
}, requestMessageActionUrlAuth: nil,
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), attachBotStart: attachBotStart))
|
||||||
|
case let .withBotApp(botAppStart):
|
||||||
|
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: navigationController, context: strongSelf.context, chatLocation: .peer(peer), botAppStart: botAppStart))
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
},
|
||||||
|
sendFile: nil,
|
||||||
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: { peerId, invite, call in
|
joinVoiceChat: { peerId, invite, call in
|
||||||
|
|
||||||
}, present: { [weak self] c, a in
|
}, present: { [weak self] c, a in
|
||||||
@ -5076,6 +5077,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
commit()
|
commit()
|
||||||
}, sendFile: nil,
|
}, sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: { peerId, invite, call in
|
joinVoiceChat: { peerId, invite, call in
|
||||||
|
|
||||||
@ -5989,7 +5991,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -6196,7 +6198,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -6324,7 +6326,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
self.context.sharedContext.openResolvedUrl(.settings(.autoremoveMessages), context: self.context, urlContext: .generic, navigationController: self.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { _, _ in }, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { _, _ in }, dismissInput: { [weak self] in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -8135,8 +8137,10 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
self.context.sharedContext.openResolvedUrl(.groupBotStart(peerId: peerId, payload: "", adminRights: nil), context: self.context, urlContext: .generic, navigationController: controller.navigationController as? NavigationController, forceExternal: false, openPeer: { id, navigation in
|
self.context.sharedContext.openResolvedUrl(.groupBotStart(peerId: peerId, payload: "", adminRights: nil), context: self.context, urlContext: .generic, navigationController: controller.navigationController as? NavigationController, forceExternal: false, openPeer: { id, navigation in
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { [weak controller] c, a in
|
present: { [weak controller] c, a in
|
||||||
@ -9986,7 +9990,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, PeerInfoScreenNodePro
|
|||||||
resolvedUrl = .instantView(webPage, customAnchor)
|
resolvedUrl = .instantView(webPage, customAnchor)
|
||||||
}
|
}
|
||||||
strongSelf.context.sharedContext.openResolvedUrl(resolvedUrl, context: strongSelf.context, urlContext: .generic, navigationController: strongSelf.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { peer, navigation in
|
strongSelf.context.sharedContext.openResolvedUrl(resolvedUrl, context: strongSelf.context, urlContext: .generic, navigationController: strongSelf.controller?.navigationController as? NavigationController, forceExternal: false, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak self] controller, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak self] controller, arguments in
|
||||||
self?.controller?.push(controller)
|
self?.controller?.push(controller)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -101,13 +101,6 @@ public final class ThemeGridController: ViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if case .generic = mode {
|
|
||||||
self.searchContentNode = NavigationBarSearchContentNode(theme: self.presentationData.theme, placeholder: self.presentationData.strings.Wallpaper_Search, activate: { [weak self] in
|
|
||||||
self?.activateSearch()
|
|
||||||
})
|
|
||||||
self.navigationBar?.setContentNode(self.searchContentNode, animated: false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
required public init(coder aDecoder: NSCoder) {
|
required public init(coder aDecoder: NSCoder) {
|
||||||
|
|||||||
@ -4338,6 +4338,7 @@ public final class StoryItemSetContainerComponent: Component {
|
|||||||
},
|
},
|
||||||
sendFile: nil,
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { _, _ in
|
present: { _, _ in
|
||||||
|
|||||||
@ -2320,7 +2320,7 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
//TODO:self.presentationInterfaceState.customEmojiAvailable
|
//TODO:self.presentationInterfaceState.customEmojiAvailable
|
||||||
return component.context.sharedContext.makeGalleryCaptionPanelView(context: component.context, chatLocation: .peer(id: peer.id), isScheduledMessages: false, customEmojiAvailable: true, present: { [weak view] c in
|
return component.context.sharedContext.makeGalleryCaptionPanelView(context: component.context, chatLocation: .peer(id: peer.id), isScheduledMessages: false, isFile: false, customEmojiAvailable: true, present: { [weak view] c in
|
||||||
guard let view else {
|
guard let view else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -2717,6 +2717,7 @@ final class StoryItemSetContainerSendMessage {
|
|||||||
},
|
},
|
||||||
sendFile: nil,
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { [weak view] c, a in
|
present: { [weak view] c, a in
|
||||||
|
|||||||
@ -1315,7 +1315,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
legacyMediaEditor(context: strongSelf.context, peer: peer, threadTitle: strongSelf.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: NSAttributedString(), snapshots: snapshots, transitionCompletion: {
|
legacyMediaEditor(context: strongSelf.context, peer: peer, threadTitle: strongSelf.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: NSAttributedString(), snapshots: snapshots, transitionCompletion: {
|
||||||
transitionCompletion()
|
transitionCompletion()
|
||||||
}, getCaptionPanelView: { [weak self] in
|
}, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: false)
|
||||||
}, sendMessagesWithSignals: { [weak self] signals, _, _ in
|
}, sendMessagesWithSignals: { [weak self] signals, _, _ in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.enqueueMediaMessages(signals: signals, silentPosting: false)
|
strongSelf.enqueueMediaMessages(signals: signals, silentPosting: false)
|
||||||
@ -3304,7 +3304,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if let _ = strongSelf.presentationInterfaceState.interfaceState.mediaDraftState {
|
if let _ = strongSelf.presentationInterfaceState.interfaceState.mediaDraftState {
|
||||||
strongSelf.sendMediaRecording(scheduleTime: time)
|
strongSelf.sendMediaRecording(scheduleTime: time)
|
||||||
} else {
|
} else {
|
||||||
strongSelf.chatDisplayNode.sendCurrentMessage(scheduleTime: time) { [weak self] in
|
let silentPosting = strongSelf.presentationInterfaceState.interfaceState.silentPosting
|
||||||
|
strongSelf.chatDisplayNode.sendCurrentMessage(silentPosting: silentPosting, scheduleTime: time) { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, saveInterfaceState: strongSelf.presentationInterfaceState.subject != .scheduledMessages, {
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, saveInterfaceState: strongSelf.presentationInterfaceState.subject != .scheduledMessages, {
|
||||||
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedForwardMessageIds(nil).withUpdatedForwardOptionsState(nil).withUpdatedComposeInputState(ChatTextInputState(inputText: NSAttributedString(string: ""))) }
|
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedForwardMessageIds(nil).withUpdatedForwardOptionsState(nil).withUpdatedComposeInputState(ChatTextInputState(inputText: NSAttributedString(string: ""))) }
|
||||||
@ -3732,7 +3733,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] {
|
if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] {
|
||||||
let inputText = strongSelf.presentationInterfaceState.interfaceState.effectiveInputState.inputText
|
let inputText = strongSelf.presentationInterfaceState.interfaceState.effectiveInputState.inputText
|
||||||
legacyMediaEditor(context: strongSelf.context, peer: peer, threadTitle: strongSelf.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: inputText, snapshots: [], transitionCompletion: nil, getCaptionPanelView: { [weak self] in
|
legacyMediaEditor(context: strongSelf.context, peer: peer, threadTitle: strongSelf.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: inputText, snapshots: [], transitionCompletion: nil, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: true)
|
||||||
}, sendMessagesWithSignals: { [weak self] signals, _, _ in
|
}, sendMessagesWithSignals: { [weak self] signals, _, _ in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
strongSelf.interfaceInteraction?.setupEditMessage(messageId, { _ in })
|
strongSelf.interfaceInteraction?.setupEditMessage(messageId, { _ in })
|
||||||
@ -9740,9 +9741,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}, sendFile: nil, sendSticker: { [weak self] f, sourceView, sourceRect in
|
}, sendFile: nil,
|
||||||
|
sendSticker: { [weak self] f, sourceView, sourceRect in
|
||||||
return self?.interfaceInteraction?.sendSticker(f, true, sourceView, sourceRect, nil, []) ?? false
|
return self?.interfaceInteraction?.sendSticker(f, true, sourceView, sourceRect, nil, []) ?? false
|
||||||
}, requestMessageActionUrlAuth: { [weak self] subject in
|
}, sendEmoji: { [weak self] text, attribute in
|
||||||
|
guard let self, canSendMessagesToChat(self.presentationInterfaceState) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.controllerInteraction?.sendEmoji(text, attribute, false)
|
||||||
|
},
|
||||||
|
requestMessageActionUrlAuth: { [weak self] subject in
|
||||||
if case let .url(url) = subject {
|
if case let .url(url) = subject {
|
||||||
self?.controllerInteraction?.requestMessageActionUrlAuth(url, subject)
|
self?.controllerInteraction?.requestMessageActionUrlAuth(url, subject)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -878,7 +878,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, getCaptionPanelView: { [weak self] in
|
}, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: false)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, openFileGallery: {
|
}, openFileGallery: {
|
||||||
@ -965,7 +965,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, getCaptionPanelView: { [weak self] in
|
}, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: false)
|
||||||
}, present: { [weak self] c, a in
|
}, present: { [weak self] c, a in
|
||||||
self?.present(c, in: .window(.root), with: a)
|
self?.present(c, in: .window(.root), with: a)
|
||||||
})
|
})
|
||||||
@ -1208,7 +1208,7 @@ extension ChatControllerImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
controller.getCaptionPanelView = { [weak self] in
|
controller.getCaptionPanelView = { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: false)
|
||||||
}
|
}
|
||||||
controller.legacyCompletion = { signals, silently, scheduleTime, getAnimatedTransitionSource, sendCompletion in
|
controller.legacyCompletion = { signals, silently, scheduleTime, getAnimatedTransitionSource, sendCompletion in
|
||||||
completion(signals, silently, scheduleTime, getAnimatedTransitionSource, sendCompletion)
|
completion(signals, silently, scheduleTime, getAnimatedTransitionSource, sendCompletion)
|
||||||
@ -1274,7 +1274,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}))
|
}))
|
||||||
controller.getCaptionPanelView = { [weak self] in
|
controller.getCaptionPanelView = { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: fileMode)
|
||||||
}
|
}
|
||||||
strongSelf.effectiveNavigationController?.pushViewController(controller)
|
strongSelf.effectiveNavigationController?.pushViewController(controller)
|
||||||
}
|
}
|
||||||
@ -1309,7 +1309,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, getCaptionPanelView: { [weak self] in
|
}, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: fileMode)
|
||||||
})
|
})
|
||||||
controller.descriptionGenerator = legacyAssetPickerItemGenerator()
|
controller.descriptionGenerator = legacyAssetPickerItemGenerator()
|
||||||
controller.completionBlock = { [weak legacyController] signals, silentPosting, scheduleTime in
|
controller.completionBlock = { [weak legacyController] signals, silentPosting, scheduleTime in
|
||||||
@ -1437,7 +1437,7 @@ extension ChatControllerImpl {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
controller.getCaptionPanelView = { [weak strongSelf] in
|
controller.getCaptionPanelView = { [weak strongSelf] in
|
||||||
return strongSelf?.getCaptionPanelView()
|
return strongSelf?.getCaptionPanelView(isFile: false)
|
||||||
}
|
}
|
||||||
present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
present(controller, ViewControllerPresentationArguments(presentationAnimation: .modalSheet))
|
||||||
}
|
}
|
||||||
@ -1620,12 +1620,12 @@ extension ChatControllerImpl {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCaptionPanelView() -> TGCaptionPanelView? {
|
func getCaptionPanelView(isFile: Bool) -> TGCaptionPanelView? {
|
||||||
var isScheduledMessages = false
|
var isScheduledMessages = false
|
||||||
if case .scheduledMessages = self.presentationInterfaceState.subject {
|
if case .scheduledMessages = self.presentationInterfaceState.subject {
|
||||||
isScheduledMessages = true
|
isScheduledMessages = true
|
||||||
}
|
}
|
||||||
return self.context.sharedContext.makeGalleryCaptionPanelView(context: self.context, chatLocation: self.presentationInterfaceState.chatLocation, isScheduledMessages: isScheduledMessages, customEmojiAvailable: self.presentationInterfaceState.customEmojiAvailable, present: { [weak self] c in
|
return self.context.sharedContext.makeGalleryCaptionPanelView(context: self.context, chatLocation: self.presentationInterfaceState.chatLocation, isScheduledMessages: isScheduledMessages, isFile: isFile, customEmojiAvailable: self.presentationInterfaceState.customEmojiAvailable, present: { [weak self] c in
|
||||||
self?.present(c, in: .window(.root))
|
self?.present(c, in: .window(.root))
|
||||||
}, presentInGlobalOverlay: { [weak self] c in
|
}, presentInGlobalOverlay: { [weak self] c in
|
||||||
guard let self else {
|
guard let self else {
|
||||||
@ -1719,7 +1719,7 @@ extension ChatControllerImpl {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}, getCaptionPanelView: { [weak self] in
|
}, getCaptionPanelView: { [weak self] in
|
||||||
return self?.getCaptionPanelView()
|
return self?.getCaptionPanelView(isFile: false)
|
||||||
}, dismissedWithResult: { [weak self] in
|
}, dismissedWithResult: { [weak self] in
|
||||||
self?.attachmentController?.dismiss(animated: false, completion: nil)
|
self?.attachmentController?.dismiss(animated: false, completion: nil)
|
||||||
}, finishedTransitionIn: { [weak self] in
|
}, finishedTransitionIn: { [weak self] in
|
||||||
|
|||||||
@ -361,6 +361,7 @@ final class ChatManagingBotTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||||||
},
|
},
|
||||||
sendFile: nil,
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: { [weak chatController] c, a in
|
present: { [weak chatController] c, a in
|
||||||
|
|||||||
@ -3377,7 +3377,7 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch
|
|||||||
return (sourceView, sourceRect)
|
return (sourceView, sourceRect)
|
||||||
})
|
})
|
||||||
//strongSelf.peekController = controller
|
//strongSelf.peekController = controller
|
||||||
strongSelf.interfaceInteraction?.presentController(controller, nil)
|
strongSelf.interfaceInteraction?.presentGlobalOverlayController(controller, nil)
|
||||||
return controller
|
return controller
|
||||||
}, updateContent: { [weak self] content in
|
}, updateContent: { [weak self] content in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
|||||||
@ -60,6 +60,7 @@ func openResolvedUrlImpl(
|
|||||||
openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void,
|
openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void,
|
||||||
sendFile: ((FileMediaReference) -> Void)?,
|
sendFile: ((FileMediaReference) -> Void)?,
|
||||||
sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?,
|
sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?,
|
||||||
|
sendEmoji: ((String, ChatTextInputTextCustomEmojiAttribute) -> Void)?,
|
||||||
requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)? = nil,
|
requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)? = nil,
|
||||||
joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?,
|
joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?,
|
||||||
present: @escaping (ViewController, Any?) -> Void,
|
present: @escaping (ViewController, Any?) -> Void,
|
||||||
@ -220,7 +221,7 @@ func openResolvedUrlImpl(
|
|||||||
case let .stickerPack(name, _):
|
case let .stickerPack(name, _):
|
||||||
dismissInput()
|
dismissInput()
|
||||||
|
|
||||||
let controller = StickerPackScreen(context: context, updatedPresentationData: updatedPresentationData, mainStickerPack: .name(name), stickerPacks: [.name(name)], parentNavigationController: navigationController, sendSticker: sendSticker, actionPerformed: { actions in
|
let controller = StickerPackScreen(context: context, updatedPresentationData: updatedPresentationData, mainStickerPack: .name(name), stickerPacks: [.name(name)], parentNavigationController: navigationController, sendSticker: sendSticker, sendEmoji: sendEmoji, actionPerformed: { actions in
|
||||||
if actions.count > 1, let first = actions.first {
|
if actions.count > 1, let first = actions.first {
|
||||||
if case .add = first.2 {
|
if case .add = first.2 {
|
||||||
present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.EmojiPackActionInfo_AddedTitle, text: presentationData.strings.EmojiPackActionInfo_MultipleAddedText(Int32(actions.count)), undo: false, info: first.0, topItem: first.1.first, context: context), elevatedLayout: true, animateInAsReplacement: false, action: { _ in
|
present(UndoOverlayController(presentationData: presentationData, content: .stickersModified(title: presentationData.strings.EmojiPackActionInfo_AddedTitle, text: presentationData.strings.EmojiPackActionInfo_MultipleAddedText(Int32(actions.count)), undo: false, info: first.0, topItem: first.1.first, context: context), elevatedLayout: true, animateInAsReplacement: false, action: { _ in
|
||||||
|
|||||||
@ -227,8 +227,10 @@ func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, ur
|
|||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: { peerId, invite, call in
|
joinVoiceChat: { peerId, invite, call in
|
||||||
|
|
||||||
|
|||||||
@ -1594,8 +1594,8 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
|||||||
return resolveUrlImpl(context: context, peerId: peerId, url: url, skipUrlAuth: skipUrlAuth)
|
return resolveUrlImpl(context: context, peerId: peerId, url: url, skipUrlAuth: skipUrlAuth)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func openResolvedUrl(_ resolvedUrl: ResolvedUrl, context: AccountContext, urlContext: OpenURLContext, navigationController: NavigationController?, forceExternal: Bool, openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void, sendFile: ((FileMediaReference) -> Void)?, sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?, requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)?, joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?, present: @escaping (ViewController, Any?) -> Void, dismissInput: @escaping () -> Void, contentContext: Any?, progress: Promise<Bool>?, completion: (() -> Void)?) {
|
public func openResolvedUrl(_ resolvedUrl: ResolvedUrl, context: AccountContext, urlContext: OpenURLContext, navigationController: NavigationController?, forceExternal: Bool, openPeer: @escaping (EnginePeer, ChatControllerInteractionNavigateToPeer) -> Void, sendFile: ((FileMediaReference) -> Void)?, sendSticker: ((FileMediaReference, UIView, CGRect) -> Bool)?, sendEmoji: ((String, ChatTextInputTextCustomEmojiAttribute) -> Void)?, requestMessageActionUrlAuth: ((MessageActionUrlSubject) -> Void)?, joinVoiceChat: ((PeerId, String?, CachedChannelData.ActiveCall) -> Void)?, present: @escaping (ViewController, Any?) -> Void, dismissInput: @escaping () -> Void, contentContext: Any?, progress: Promise<Bool>?, completion: (() -> Void)?) {
|
||||||
openResolvedUrlImpl(resolvedUrl, context: context, urlContext: urlContext, navigationController: navigationController, forceExternal: forceExternal, openPeer: openPeer, sendFile: sendFile, sendSticker: sendSticker, requestMessageActionUrlAuth: requestMessageActionUrlAuth, joinVoiceChat: joinVoiceChat, present: present, dismissInput: dismissInput, contentContext: contentContext, progress: progress, completion: completion)
|
openResolvedUrlImpl(resolvedUrl, context: context, urlContext: urlContext, navigationController: navigationController, forceExternal: forceExternal, openPeer: openPeer, sendFile: sendFile, sendSticker: sendSticker, sendEmoji: sendEmoji, requestMessageActionUrlAuth: requestMessageActionUrlAuth, joinVoiceChat: joinVoiceChat, present: present, dismissInput: dismissInput, contentContext: contentContext, progress: progress, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeDeviceContactInfoController(context: AccountContext, subject: DeviceContactInfoSubject, completed: (() -> Void)?, cancelled: (() -> Void)?) -> ViewController {
|
public func makeDeviceContactInfoController(context: AccountContext, subject: DeviceContactInfoSubject, completed: (() -> Void)?, cancelled: (() -> Void)?) -> ViewController {
|
||||||
@ -1879,11 +1879,12 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
|||||||
return makeAttachmentFileControllerImpl(context: context, updatedPresentationData: updatedPresentationData, bannedSendMedia: bannedSendMedia, presentGallery: presentGallery, presentFiles: presentFiles, send: send)
|
return makeAttachmentFileControllerImpl(context: context, updatedPresentationData: updatedPresentationData, bannedSendMedia: bannedSendMedia, presentGallery: presentGallery, presentFiles: presentFiles, send: send)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeGalleryCaptionPanelView(context: AccountContext, chatLocation: ChatLocation, isScheduledMessages: Bool, customEmojiAvailable: Bool, present: @escaping (ViewController) -> Void, presentInGlobalOverlay: @escaping (ViewController) -> Void) -> NSObject? {
|
public func makeGalleryCaptionPanelView(context: AccountContext, chatLocation: ChatLocation, isScheduledMessages: Bool, isFile: Bool, customEmojiAvailable: Bool, present: @escaping (ViewController) -> Void, presentInGlobalOverlay: @escaping (ViewController) -> Void) -> NSObject? {
|
||||||
let inputPanelNode = LegacyMessageInputPanelNode(
|
let inputPanelNode = LegacyMessageInputPanelNode(
|
||||||
context: context,
|
context: context,
|
||||||
chatLocation: chatLocation,
|
chatLocation: chatLocation,
|
||||||
isScheduledMessages: isScheduledMessages,
|
isScheduledMessages: isScheduledMessages,
|
||||||
|
isFile: isFile,
|
||||||
present: present,
|
present: present,
|
||||||
presentInGlobalOverlay: presentInGlobalOverlay,
|
presentInGlobalOverlay: presentInGlobalOverlay,
|
||||||
makeEntityInputView: {
|
makeEntityInputView: {
|
||||||
|
|||||||
@ -50,8 +50,10 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: EnginePeer.Id?, n
|
|||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}, sendFile: nil,
|
},
|
||||||
|
sendFile: nil,
|
||||||
sendSticker: nil,
|
sendSticker: nil,
|
||||||
|
sendEmoji: nil,
|
||||||
requestMessageActionUrlAuth: nil,
|
requestMessageActionUrlAuth: nil,
|
||||||
joinVoiceChat: nil,
|
joinVoiceChat: nil,
|
||||||
present: presentImpl, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
present: presentImpl, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
@ -95,7 +97,7 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: EnginePeer.Id?, n
|
|||||||
if let navigationController = controller.navigationController as? NavigationController {
|
if let navigationController = controller.navigationController as? NavigationController {
|
||||||
openResolvedUrlImpl(result, context: context, urlContext: peerId.flatMap { .chat(peerId: $0, message: nil, updatedPresentationData: nil) } ?? .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigateToPeer in
|
openResolvedUrlImpl(result, context: context, urlContext: peerId.flatMap { .chat(peerId: $0, message: nil, updatedPresentationData: nil) } ?? .generic, navigationController: navigationController, forceExternal: false, openPeer: { peer, navigateToPeer in
|
||||||
openResolvedPeerImpl(peer, navigateToPeer)
|
openResolvedPeerImpl(peer, navigateToPeer)
|
||||||
}, sendFile: nil, sendSticker: nil, joinVoiceChat: nil, present: { c, a in }, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, joinVoiceChat: nil, present: { c, a in }, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
|
|||||||
@ -1966,7 +1966,7 @@ public final class WebAppController: ViewController, AttachmentContainable {
|
|||||||
let _ = (cachedWebAppTermsPage(context: context)
|
let _ = (cachedWebAppTermsPage(context: context)
|
||||||
|> deliverOnMainQueue).startStandalone(next: { resolvedUrl in
|
|> deliverOnMainQueue).startStandalone(next: { resolvedUrl in
|
||||||
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: true, openPeer: { peer, navigation in
|
context.sharedContext.openResolvedUrl(resolvedUrl, context: context, urlContext: .generic, navigationController: navigationController, forceExternal: true, openPeer: { peer, navigation in
|
||||||
}, sendFile: nil, sendSticker: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak self] c, arguments in
|
}, sendFile: nil, sendSticker: nil, sendEmoji: nil, requestMessageActionUrlAuth: nil, joinVoiceChat: nil, present: { [weak self] c, arguments in
|
||||||
self?.push(c)
|
self?.push(c)
|
||||||
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
}, dismissInput: {}, contentContext: nil, progress: nil, completion: nil)
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user