diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageFactCheckBubbleContentNode/Sources/ChatMessageFactCheckBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageFactCheckBubbleContentNode/Sources/ChatMessageFactCheckBubbleContentNode.swift index 4d42893c8b..62c4f1e610 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageFactCheckBubbleContentNode/Sources/ChatMessageFactCheckBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageFactCheckBubbleContentNode/Sources/ChatMessageFactCheckBubbleContentNode.swift @@ -314,7 +314,15 @@ public class ChatMessageFactCheckBubbleContentNode: ChatMessageBubbleContentNode } } - let dateText = stringForMessageTimestampStatus(accountPeerId: item.context.account.peerId, message: item.message, dateTimeFormat: item.presentationData.dateTimeFormat, nameDisplayOrder: item.presentationData.nameDisplayOrder, strings: item.presentationData.strings, associatedData: item.associatedData) + let dateFormat: MessageTimestampStatusFormat + if item.presentationData.isPreview { + dateFormat = .full + } else if let subject = item.associatedData.subject, case .messageOptions = subject { + dateFormat = .minimal + } else { + dateFormat = .regular + } + let dateText = stringForMessageTimestampStatus(accountPeerId: item.context.account.peerId, message: item.message, dateTimeFormat: item.presentationData.dateTimeFormat, nameDisplayOrder: item.presentationData.nameDisplayOrder, strings: item.presentationData.strings, format: dateFormat, associatedData: item.associatedData) let statusType: ChatMessageDateAndStatusType? if case .customChatContents = item.associatedData.subject { @@ -425,11 +433,11 @@ public class ChatMessageFactCheckBubbleContentNode: ChatMessageBubbleContentNode statusSuggestedWidthAndContinue = statusLayout(ChatMessageDateAndStatusNode.Arguments( context: item.context, presentationData: item.presentationData, - edited: edited, - impressionCount: viewCount, + edited: edited && !item.presentationData.isPreview, + impressionCount: !item.presentationData.isPreview ? viewCount : nil, dateText: dateText, type: statusType, - layoutInput: .trailingContent(contentWidth: nil, reactionSettings: ChatMessageDateAndStatusNode.TrailingReactionSettings(displayInline: shouldDisplayInlineDateReactions(message: message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions), preferAdditionalInset: false)), + layoutInput: .trailingContent(contentWidth: nil, reactionSettings: item.presentationData.isPreview ? nil : ChatMessageDateAndStatusNode.TrailingReactionSettings(displayInline: shouldDisplayInlineDateReactions(message: message, isPremium: item.associatedData.isPremium, forceInline: item.associatedData.forceInlineReactions), preferAdditionalInset: false)), constrainedSize: textConstrainedSize, availableReactions: item.associatedData.availableReactions, savedMessageTags: item.associatedData.savedMessageTags, @@ -596,6 +604,9 @@ public class ChatMessageFactCheckBubbleContentNode: ChatMessageBubbleContentNode strongSelf.addSubnode(titleBadgeButton) } + titleBadgeButton.isHidden = item.presentationData.isPreview + strongSelf.titleBadgeLabel.isHidden = item.presentationData.isPreview + if themeUpdated || titleBadgeButton.backgroundImage(for: .normal) == nil { titleBadgeButton.setBackgroundImage(generateFilledCircleImage(diameter: badgeBackgroundFrame.height, color: mainColor.withMultipliedAlpha(0.1))?.stretchableImage(withLeftCapWidth: Int(badgeBackgroundFrame.height / 2), topCapHeight: Int(badgeBackgroundFrame.height / 2)), for: .normal) } diff --git a/submodules/TelegramUI/Components/MediaEditor/Sources/DrawingMessageRenderer.swift b/submodules/TelegramUI/Components/MediaEditor/Sources/DrawingMessageRenderer.swift index 9a37d1bb59..085b757790 100644 --- a/submodules/TelegramUI/Components/MediaEditor/Sources/DrawingMessageRenderer.swift +++ b/submodules/TelegramUI/Components/MediaEditor/Sources/DrawingMessageRenderer.swift @@ -81,7 +81,7 @@ public final class DrawingWallpaperRenderer { } public final class DrawingMessageRenderer { - class ContainerNode: ASDisplayNode { + final class ContainerNode: ASDisplayNode { private let context: AccountContext private let messages: [Message] private let isNight: Bool @@ -115,8 +115,9 @@ public final class DrawingMessageRenderer { let layout = ContainerViewLayout(size: CGSize(width: 360.0, height: 640.0), metrics: LayoutMetrics(widthClass: .compact, heightClass: .compact, orientation: .portrait), deviceMetrics: .iPhoneX, intrinsicInsets: .zero, safeInsets: .zero, additionalInsets: .zero, statusBarHeight: 0.0, inputHeight: nil, inputHeightIsInteractivellyChanging: false, inVoiceOver: false) let size = self.updateMessagesLayout(layout: layout, presentationData: mockPresentationData) + let _ = self.updateMessagesLayout(layout: layout, presentationData: mockPresentationData) - Queue.mainQueue().after(0.05, { + Queue.mainQueue().after(0.2, { var mediaRect: CGRect? if let messageNode = self.messageNodes?.first { if self.isOverlay { @@ -157,6 +158,7 @@ public final class DrawingMessageRenderer { } } } + self.generate(size: size) { image in completion(size, image, mediaRect) } @@ -304,64 +306,74 @@ public final class DrawingMessageRenderer { private let nightContainerNode: ContainerNode private let overlayContainerNode: ContainerNode - public init(context: AccountContext, messages: [Message]) { + public init(context: AccountContext, messages: [Message], parentView: UIView) { self.context = context self.messages = messages self.dayContainerNode = ContainerNode(context: context, messages: messages) self.nightContainerNode = ContainerNode(context: context, messages: messages, isNight: true) self.overlayContainerNode = ContainerNode(context: context, messages: messages, isOverlay: true) + + parentView.addSubview(self.dayContainerNode.view) + parentView.addSubview(self.nightContainerNode.view) + parentView.addSubview(self.overlayContainerNode.view) } public func render(completion: @escaping (Result) -> Void) { - let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } - let defaultPresentationData = defaultPresentationData() + Queue.mainQueue().after(0.1) { + let presentationData = self.context.sharedContext.currentPresentationData.with { $0 } + let defaultPresentationData = defaultPresentationData() + + let mockPresentationData = PresentationData( + strings: presentationData.strings, + theme: defaultPresentationTheme, + autoNightModeTriggered: false, + chatWallpaper: presentationData.chatWallpaper, + chatFontSize: defaultPresentationData.chatFontSize, + chatBubbleCorners: defaultPresentationData.chatBubbleCorners, + listsFontSize: defaultPresentationData.listsFontSize, + dateTimeFormat: presentationData.dateTimeFormat, + nameDisplayOrder: presentationData.nameDisplayOrder, + nameSortOrder: presentationData.nameSortOrder, + reduceMotion: false, + largeEmoji: true + ) + + var finalSize: CGSize = .zero + var dayImage: UIImage? + var nightImage: UIImage? + var overlayImage: UIImage? + var mediaRect: CGRect? + + let completeIfReady = { + if let dayImage, let nightImage, let overlayImage { + var cornerRadius: CGFloat = defaultPresentationData.chatBubbleCorners.mainRadius + if let mediaRect, mediaRect.width == mediaRect.height, mediaRect.width == 240.0 { + cornerRadius = mediaRect.width / 2.0 + } else if let rect = mediaRect { + mediaRect = CGRect(x: rect.minX + 4.0, y: rect.minY, width: rect.width - 6.0, height: rect.height - 1.0) + } + completion(Result(size: finalSize, dayImage: dayImage, nightImage: nightImage, overlayImage: overlayImage, mediaFrame: mediaRect.flatMap { Result.MediaFrame(rect: $0, cornerRadius: cornerRadius) })) - let mockPresentationData = PresentationData( - strings: presentationData.strings, - theme: defaultPresentationTheme, - autoNightModeTriggered: false, - chatWallpaper: presentationData.chatWallpaper, - chatFontSize: defaultPresentationData.chatFontSize, - chatBubbleCorners: defaultPresentationData.chatBubbleCorners, - listsFontSize: defaultPresentationData.listsFontSize, - dateTimeFormat: presentationData.dateTimeFormat, - nameDisplayOrder: presentationData.nameDisplayOrder, - nameSortOrder: presentationData.nameSortOrder, - reduceMotion: false, - largeEmoji: true - ) - - var finalSize: CGSize = .zero - var dayImage: UIImage? - var nightImage: UIImage? - var overlayImage: UIImage? - var mediaRect: CGRect? - - let completeIfReady = { - if let dayImage, let nightImage, let overlayImage { - var cornerRadius: CGFloat = defaultPresentationData.chatBubbleCorners.mainRadius - if let mediaRect, mediaRect.width == mediaRect.height, mediaRect.width == 240.0 { - cornerRadius = mediaRect.width / 2.0 - } else if let rect = mediaRect { - mediaRect = CGRect(x: rect.minX + 4.0, y: rect.minY, width: rect.width - 6.0, height: rect.height - 1.0) + self.dayContainerNode.view.removeFromSuperview() + self.nightContainerNode.view.removeFromSuperview() + self.overlayContainerNode.view.removeFromSuperview() } - completion(Result(size: finalSize, dayImage: dayImage, nightImage: nightImage, overlayImage: overlayImage, mediaFrame: mediaRect.flatMap { Result.MediaFrame(rect: $0, cornerRadius: cornerRadius) })) } - } - self.dayContainerNode.render(presentationData: mockPresentationData) { size, image, rect in - finalSize = size - dayImage = image - mediaRect = rect - completeIfReady() - } - self.nightContainerNode.render(presentationData: mockPresentationData) { size, image, _ in - nightImage = image - completeIfReady() - } - self.overlayContainerNode.render(presentationData: mockPresentationData) { size, image, _ in - overlayImage = image - completeIfReady() + self.dayContainerNode.render(presentationData: mockPresentationData) { size, image, rect in + finalSize = size + dayImage = image + mediaRect = rect + completeIfReady() + } + self.nightContainerNode.render(presentationData: mockPresentationData) { size, image, _ in + nightImage = image + completeIfReady() + } + self.overlayContainerNode.render(presentationData: mockPresentationData) { size, image, _ in + overlayImage = image + completeIfReady() + } } } } diff --git a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift index f941bd725f..1f7551ba8b 100644 --- a/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift +++ b/submodules/TelegramUI/Components/MediaEditorScreen/Sources/MediaEditorScreen.swift @@ -3039,7 +3039,7 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate messageFile = nil } - let renderer = DrawingMessageRenderer(context: self.context, messages: messages) + let renderer = DrawingMessageRenderer(context: self.context, messages: messages, parentView: self.view) renderer.render(completion: { result in if case .draft = subject, let existingEntityView = self.entitiesView.getView(where: { entityView in if let stickerEntityView = entityView as? DrawingStickerEntityView, case .message = (stickerEntityView.entity as! DrawingStickerEntity).content { diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift index edc487f092..e96d78080e 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift @@ -319,9 +319,10 @@ final class StarsTransactionsListPanelComponent: Component { let bottomOffset = max(0.0, self.scrollView.contentSize.height - self.scrollView.contentOffset.y - self.scrollView.frame.height) let loadMore = bottomOffset < 100.0 - if environment.isCurrent, loadMore, let lastTransaction = self.items.last { - if lastTransaction.id != self.currentLoadMoreId { - self.currentLoadMoreId = lastTransaction.id + if environment.isCurrent, loadMore { + let lastId = self.items.last?.id + if lastId != self.currentLoadMoreId || lastId == nil { + self.currentLoadMoreId = lastId component.transactionsContext.loadMore() } }