mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various fixes
This commit is contained in:
parent
371ec63cc7
commit
c8fe12cb8e
@ -1158,7 +1158,7 @@ open class InteractiveTextNode: ASDisplayNode, TextNodeProtocol, UIGestureRecogn
|
|||||||
public func textRangeRects(in range: NSRange) -> (rects: [CGRect], start: TextRangeRectEdge, end: TextRangeRectEdge)? {
|
public func textRangeRects(in range: NSRange) -> (rects: [CGRect], start: TextRangeRectEdge, end: TextRangeRectEdge)? {
|
||||||
return self.cachedLayout?.rangeRects(in: range)
|
return self.cachedLayout?.rangeRects(in: range)
|
||||||
}
|
}
|
||||||
|
|
||||||
override public init() {
|
override public init() {
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
@ -1946,7 +1946,7 @@ open class InteractiveTextNode: ASDisplayNode, TextNodeProtocol, UIGestureRecogn
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
contentItemAnimation = .None
|
contentItemAnimation = .None
|
||||||
contentItemLayer = TextContentItemLayer()
|
contentItemLayer = TextContentItemLayer(displaysAsynchronously: self.displaysAsynchronously)
|
||||||
self.contentItemLayers[contentItem.id] = contentItemLayer
|
self.contentItemLayers[contentItem.id] = contentItemLayer
|
||||||
self.layer.addSublayer(contentItemLayer)
|
self.layer.addSublayer(contentItemLayer)
|
||||||
}
|
}
|
||||||
@ -2461,8 +2461,9 @@ final class TextContentItemLayer: SimpleLayer {
|
|||||||
private var isAnimating: Bool = false
|
private var isAnimating: Bool = false
|
||||||
private var currentContentMask: RenderMask?
|
private var currentContentMask: RenderMask?
|
||||||
|
|
||||||
override init() {
|
init(displaysAsynchronously: Bool) {
|
||||||
self.renderNode = RenderNode()
|
self.renderNode = RenderNode()
|
||||||
|
self.renderNode.displaysAsynchronously = displaysAsynchronously
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
@ -112,11 +112,14 @@ public final class DrawingMessageRenderer {
|
|||||||
self.wallpaperColor = wallpaperColor
|
self.wallpaperColor = wallpaperColor
|
||||||
|
|
||||||
self.messagesContainerNode = ASDisplayNode()
|
self.messagesContainerNode = ASDisplayNode()
|
||||||
|
self.messagesContainerNode.displaysAsynchronously = false
|
||||||
self.messagesContainerNode.clipsToBounds = true
|
self.messagesContainerNode.clipsToBounds = true
|
||||||
self.messagesContainerNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0)
|
self.messagesContainerNode.transform = CATransform3DMakeScale(1.0, -1.0, 1.0)
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
|
self.displaysAsynchronously = false
|
||||||
|
|
||||||
self.addSubnode(self.messagesContainerNode)
|
self.addSubnode(self.messagesContainerNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,17 +50,22 @@ extension ChatControllerImpl {
|
|||||||
func enqueueGifData(_ data: Data) {
|
func enqueueGifData(_ data: Data) {
|
||||||
self.enqueueMediaMessageDisposable.set((legacyEnqueueGifMessage(account: self.context.account, data: data) |> deliverOnMainQueue).startStrict(next: { [weak self] message in
|
self.enqueueMediaMessageDisposable.set((legacyEnqueueGifMessage(account: self.context.account, data: data) |> deliverOnMainQueue).startStrict(next: { [weak self] message in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
strongSelf.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
|
||||||
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
guard let strongSelf = self else {
|
||||||
if let strongSelf = self {
|
return
|
||||||
strongSelf.chatDisplayNode.collapseInput()
|
|
||||||
|
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
|
||||||
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}, nil)
|
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
||||||
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.chatDisplayNode.collapseInput()
|
||||||
|
|
||||||
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
||||||
|
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -68,17 +73,22 @@ extension ChatControllerImpl {
|
|||||||
func enqueueVideoData(_ data: Data) {
|
func enqueueVideoData(_ data: Data) {
|
||||||
self.enqueueMediaMessageDisposable.set((legacyEnqueueGifMessage(account: self.context.account, data: data) |> deliverOnMainQueue).startStrict(next: { [weak self] message in
|
self.enqueueMediaMessageDisposable.set((legacyEnqueueGifMessage(account: self.context.account, data: data) |> deliverOnMainQueue).startStrict(next: { [weak self] message in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
strongSelf.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
|
||||||
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
guard let strongSelf = self else {
|
||||||
if let strongSelf = self {
|
return
|
||||||
strongSelf.chatDisplayNode.collapseInput()
|
|
||||||
|
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
|
||||||
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}, nil)
|
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
||||||
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.chatDisplayNode.collapseInput()
|
||||||
|
|
||||||
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
||||||
|
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -98,17 +108,22 @@ extension ChatControllerImpl {
|
|||||||
let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: Int64.random(in: Int64.min ... Int64.max)), partialReference: nil, resource: resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/webp", size: Int64(data.count), attributes: fileAttributes, alternativeRepresentations: [])
|
let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: Int64.random(in: Int64.min ... Int64.max)), partialReference: nil, resource: resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "image/webp", size: Int64(data.count), attributes: fileAttributes, alternativeRepresentations: [])
|
||||||
let message = EnqueueMessage.message(text: "", attributes: [], inlineStickers: [:], mediaReference: .standalone(media: media), threadId: strongSelf.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])
|
let message = EnqueueMessage.message(text: "", attributes: [], inlineStickers: [:], mediaReference: .standalone(media: media), threadId: strongSelf.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])
|
||||||
|
|
||||||
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
strongSelf.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
|
||||||
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
guard let strongSelf = self else {
|
||||||
if let strongSelf = self {
|
return
|
||||||
strongSelf.chatDisplayNode.collapseInput()
|
|
||||||
|
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
|
||||||
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}, nil)
|
let replyMessageSubject = strongSelf.presentationInterfaceState.interfaceState.replyMessageSubject
|
||||||
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
strongSelf.chatDisplayNode.setupSendActionOnViewUpdate({
|
||||||
|
if let strongSelf = self {
|
||||||
|
strongSelf.chatDisplayNode.collapseInput()
|
||||||
|
|
||||||
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
||||||
|
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
strongSelf.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) }, postpone: postpone)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -116,23 +131,28 @@ extension ChatControllerImpl {
|
|||||||
func enqueueStickerFile(_ file: TelegramMediaFile) {
|
func enqueueStickerFile(_ file: TelegramMediaFile) {
|
||||||
let message = EnqueueMessage.message(text: "", attributes: [], inlineStickers: [:], mediaReference: .standalone(media: file), threadId: self.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])
|
let message = EnqueueMessage.message(text: "", attributes: [], inlineStickers: [:], mediaReference: .standalone(media: file), threadId: self.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])
|
||||||
|
|
||||||
let replyMessageSubject = self.presentationInterfaceState.interfaceState.replyMessageSubject
|
self.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
|
||||||
self.chatDisplayNode.setupSendActionOnViewUpdate({ [weak self] in
|
guard let self else {
|
||||||
if let strongSelf = self {
|
return
|
||||||
strongSelf.chatDisplayNode.collapseInput()
|
|
||||||
|
|
||||||
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
|
||||||
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}, nil)
|
let replyMessageSubject = self.presentationInterfaceState.interfaceState.replyMessageSubject
|
||||||
self.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
self.chatDisplayNode.setupSendActionOnViewUpdate({ [weak self] in
|
||||||
|
if let strongSelf = self {
|
||||||
Queue.mainQueue().after(3.0) {
|
strongSelf.chatDisplayNode.collapseInput()
|
||||||
if let message = self.chatDisplayNode.historyNode.lastVisbleMesssage(), let file = message.media.first(where: { $0 is TelegramMediaFile }) as? TelegramMediaFile, file.isSticker {
|
|
||||||
self.context.engine.stickers.addRecentlyUsedSticker(fileReference: .message(message: MessageReference(message), media: file))
|
strongSelf.updateChatPresentationInterfaceState(animated: true, interactive: false, {
|
||||||
|
$0.updatedInterfaceState { $0.withUpdatedReplyMessageSubject(nil).withUpdatedSendMessageEffect(nil) }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
self.sendMessages([message].map { $0.withUpdatedReplyToMessageId(replyMessageSubject?.subjectModel) })
|
||||||
|
|
||||||
|
Queue.mainQueue().after(3.0) {
|
||||||
|
if let message = self.chatDisplayNode.historyNode.lastVisbleMesssage(), let file = message.media.first(where: { $0 is TelegramMediaFile }) as? TelegramMediaFile, file.isSticker {
|
||||||
|
self.context.engine.stickers.addRecentlyUsedSticker(fileReference: .message(message: MessageReference(message), media: file))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func enqueueAnimatedStickerData(_ data: Data) {
|
func enqueueAnimatedStickerData(_ data: Data) {
|
||||||
@ -223,9 +243,7 @@ extension ChatControllerImpl {
|
|||||||
fileAttributes.append(.Video(duration: animatedImage.duration, size: PixelDimensions(width: 512, height: 512), flags: [], preloadSize: nil, coverTime: nil, videoCodec: nil))
|
fileAttributes.append(.Video(duration: animatedImage.duration, size: PixelDimensions(width: 512, height: 512), flags: [], preloadSize: nil, coverTime: nil, videoCodec: nil))
|
||||||
|
|
||||||
let previewRepresentations: [TelegramMediaImageRepresentation] = []
|
let previewRepresentations: [TelegramMediaImageRepresentation] = []
|
||||||
// if let thumbnailResource {
|
|
||||||
// previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: dimensions, resource: thumbnailResource, progressiveSizes: [], immediateThumbnailData: nil))
|
|
||||||
// }
|
|
||||||
let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max))
|
let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max))
|
||||||
self.context.account.postbox.mediaBox.copyResourceData(resource.id, fromTempPath: path)
|
self.context.account.postbox.mediaBox.copyResourceData(resource.id, fromTempPath: path)
|
||||||
|
|
||||||
@ -235,7 +253,5 @@ extension ChatControllerImpl {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// self.stickerVideoExport = videoExport
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9253,8 +9253,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
if let value = value {
|
if let value = value {
|
||||||
self.present(UndoOverlayController(presentationData: self.presentationData, content: .dice(dice: dice, context: self.context, text: value, action: canSendMessagesToChat(self.presentationInterfaceState) ? self.presentationData.strings.Conversation_SendDice : nil), elevatedLayout: false, action: { [weak self] action in
|
self.present(UndoOverlayController(presentationData: self.presentationData, content: .dice(dice: dice, context: self.context, text: value, action: canSendMessagesToChat(self.presentationInterfaceState) ? self.presentationData.strings.Conversation_SendDice : nil), elevatedLayout: false, action: { [weak self] action in
|
||||||
if let strongSelf = self, canSendMessagesToChat(strongSelf.presentationInterfaceState), action == .undo {
|
if let self, canSendMessagesToChat(self.presentationInterfaceState), action == .undo {
|
||||||
strongSelf.sendMessages([.message(text: "", attributes: [], inlineStickers: [:], mediaReference: AnyMediaReference.standalone(media: TelegramMediaDice(emoji: dice.emoji)), threadId: strongSelf.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])])
|
self.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
|
||||||
|
guard let self else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
self.sendMessages([.message(text: "", attributes: [], inlineStickers: [:], mediaReference: AnyMediaReference.standalone(media: TelegramMediaDice(emoji: dice.emoji)), threadId: self.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])], postpone: postpone)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}), in: .current)
|
}), in: .current)
|
||||||
|
@ -173,23 +173,7 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte
|
|||||||
var accessoryItems: [ChatTextInputAccessoryItem] = []
|
var accessoryItems: [ChatTextInputAccessoryItem] = []
|
||||||
let isTextEmpty = chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0
|
let isTextEmpty = chatPresentationInterfaceState.interfaceState.composeInputState.inputText.length == 0
|
||||||
let hasForward = chatPresentationInterfaceState.interfaceState.forwardMessageIds != nil
|
let hasForward = chatPresentationInterfaceState.interfaceState.forwardMessageIds != nil
|
||||||
|
|
||||||
if case .scheduledMessages = chatPresentationInterfaceState.subject {
|
|
||||||
} else {
|
|
||||||
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
|
||||||
var showPremiumGift = false
|
|
||||||
if !premiumConfiguration.isPremiumDisabled {
|
|
||||||
if chatPresentationInterfaceState.hasBirthdayToday {
|
|
||||||
showPremiumGift = true
|
|
||||||
} else if premiumConfiguration.showPremiumGiftInAttachMenu && premiumConfiguration.showPremiumGiftInTextField {
|
|
||||||
showPremiumGift = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if isTextEmpty, showPremiumGift, let peer = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, !peer.isDeleted && peer.botInfo == nil && !peer.flags.contains(.isSupport) && chatPresentationInterfaceState.suggestPremiumGift {
|
|
||||||
accessoryItems.append(.gift)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var extendedSearchLayout = false
|
var extendedSearchLayout = false
|
||||||
loop: for (_, result) in chatPresentationInterfaceState.inputQueryResults {
|
loop: for (_, result) in chatPresentationInterfaceState.inputQueryResults {
|
||||||
if case let .contextRequestResult(peer, _) = result, peer != nil {
|
if case let .contextRequestResult(peer, _) = result, peer != nil {
|
||||||
@ -207,6 +191,22 @@ func inputTextPanelStateForChatPresentationInterfaceState(_ chatPresentationInte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if case .scheduledMessages = chatPresentationInterfaceState.subject {
|
||||||
|
} else {
|
||||||
|
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
||||||
|
var showPremiumGift = false
|
||||||
|
if !premiumConfiguration.isPremiumDisabled {
|
||||||
|
if chatPresentationInterfaceState.hasBirthdayToday {
|
||||||
|
showPremiumGift = true
|
||||||
|
} else if premiumConfiguration.showPremiumGiftInAttachMenu && premiumConfiguration.showPremiumGiftInTextField {
|
||||||
|
showPremiumGift = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isTextEmpty, showPremiumGift, let peer = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramUser, !peer.isDeleted && peer.botInfo == nil && !peer.flags.contains(.isSupport) && chatPresentationInterfaceState.suggestPremiumGift {
|
||||||
|
accessoryItems.append(.gift)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if isTextEmpty && chatPresentationInterfaceState.hasScheduledMessages && !hasForward {
|
if isTextEmpty && chatPresentationInterfaceState.hasScheduledMessages && !hasForward {
|
||||||
accessoryItems.append(.scheduledMessages)
|
accessoryItems.append(.scheduledMessages)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user