mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Refactor chat controller data management
This commit is contained in:
parent
cd3ffe902e
commit
4c3ad04015
24 changed files with 2901 additions and 2704 deletions
|
|
@ -1085,7 +1085,6 @@ final class AttachmentPanel: ASDisplayNode, ASScrollViewDelegate {
|
|||
})
|
||||
strongSelf.present(controller)
|
||||
}
|
||||
}, reportPeerIrrelevantGeoLocation: {
|
||||
}, displaySlowmodeTooltip: { _, _ in
|
||||
}, displaySendMessageOptions: { [weak self] node, gesture in
|
||||
guard let strongSelf = self, let textInputPanelNode = strongSelf.textInputPanelNode else {
|
||||
|
|
|
|||
|
|
@ -137,7 +137,6 @@ public final class ChatPanelInterfaceInteraction {
|
|||
public let updateInputLanguage: (@escaping (String?) -> String?) -> Void
|
||||
public let unarchiveChat: () -> Void
|
||||
public let openLinkEditing: () -> Void
|
||||
public let reportPeerIrrelevantGeoLocation: () -> Void
|
||||
public let displaySlowmodeTooltip: (UIView, CGRect) -> Void
|
||||
public let displaySendMessageOptions: (ASDisplayNode, ContextGesture) -> Void
|
||||
public let openScheduledMessages: () -> Void
|
||||
|
|
@ -257,7 +256,6 @@ public final class ChatPanelInterfaceInteraction {
|
|||
updateInputLanguage: @escaping ((String?) -> String?) -> Void,
|
||||
unarchiveChat: @escaping () -> Void,
|
||||
openLinkEditing: @escaping () -> Void,
|
||||
reportPeerIrrelevantGeoLocation: @escaping () -> Void,
|
||||
displaySlowmodeTooltip: @escaping (UIView, CGRect) -> Void,
|
||||
displaySendMessageOptions: @escaping (ASDisplayNode, ContextGesture) -> Void,
|
||||
openScheduledMessages: @escaping () -> Void,
|
||||
|
|
@ -376,7 +374,6 @@ public final class ChatPanelInterfaceInteraction {
|
|||
self.updateInputLanguage = updateInputLanguage
|
||||
self.unarchiveChat = unarchiveChat
|
||||
self.openLinkEditing = openLinkEditing
|
||||
self.reportPeerIrrelevantGeoLocation = reportPeerIrrelevantGeoLocation
|
||||
self.displaySlowmodeTooltip = displaySlowmodeTooltip
|
||||
self.displaySendMessageOptions = displaySendMessageOptions
|
||||
self.openScheduledMessages = openScheduledMessages
|
||||
|
|
@ -503,8 +500,8 @@ public final class ChatPanelInterfaceInteraction {
|
|||
}, requestStopPollInMessage: { _ in
|
||||
}, updateInputLanguage: { _ in
|
||||
}, unarchiveChat: {
|
||||
}, openLinkEditing: openLinkEditing, reportPeerIrrelevantGeoLocation: {
|
||||
}, displaySlowmodeTooltip: { _, _ in
|
||||
}, openLinkEditing: openLinkEditing,
|
||||
displaySlowmodeTooltip: { _, _ in
|
||||
}, displaySendMessageOptions: { _, _ in
|
||||
}, openScheduledMessages: {
|
||||
}, openPeersNearby: {
|
||||
|
|
|
|||
|
|
@ -266,14 +266,12 @@ public final class ChatManagingBot: Equatable {
|
|||
|
||||
public struct ChatContactStatus: Equatable {
|
||||
public var canAddContact: Bool
|
||||
public var canReportIrrelevantLocation: Bool
|
||||
public var peerStatusSettings: PeerStatusSettings?
|
||||
public var invitedBy: Peer?
|
||||
public var managingBot: ChatManagingBot?
|
||||
|
||||
public init(canAddContact: Bool, canReportIrrelevantLocation: Bool, peerStatusSettings: PeerStatusSettings?, invitedBy: Peer?, managingBot: ChatManagingBot?) {
|
||||
public init(canAddContact: Bool, peerStatusSettings: PeerStatusSettings?, invitedBy: Peer?, managingBot: ChatManagingBot?) {
|
||||
self.canAddContact = canAddContact
|
||||
self.canReportIrrelevantLocation = canReportIrrelevantLocation
|
||||
self.peerStatusSettings = peerStatusSettings
|
||||
self.invitedBy = invitedBy
|
||||
self.managingBot = managingBot
|
||||
|
|
@ -286,9 +284,6 @@ public struct ChatContactStatus: Equatable {
|
|||
if !self.canAddContact {
|
||||
peerStatusSettings.flags.remove(.canAddContact)
|
||||
}
|
||||
if !self.canReportIrrelevantLocation {
|
||||
peerStatusSettings.flags.remove(.canReportIrrelevantGeoLocation)
|
||||
}
|
||||
return peerStatusSettings.flags.isEmpty
|
||||
}
|
||||
|
||||
|
|
@ -296,9 +291,6 @@ public struct ChatContactStatus: Equatable {
|
|||
if lhs.canAddContact != rhs.canAddContact {
|
||||
return false
|
||||
}
|
||||
if lhs.canReportIrrelevantLocation != rhs.canReportIrrelevantLocation {
|
||||
return false
|
||||
}
|
||||
if lhs.peerStatusSettings != rhs.peerStatusSettings {
|
||||
return false
|
||||
}
|
||||
|
|
@ -454,6 +446,34 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
case side
|
||||
}
|
||||
|
||||
public final class ReportReasonData: Equatable {
|
||||
public let title: String
|
||||
public let option: Data
|
||||
public let message: String?
|
||||
|
||||
public init(title: String, option: Data, message: String?) {
|
||||
self.title = title
|
||||
self.option = option
|
||||
self.message = message
|
||||
}
|
||||
|
||||
public static func ==(lhs: ReportReasonData, rhs: ReportReasonData) -> Bool {
|
||||
if lhs === rhs {
|
||||
return true
|
||||
}
|
||||
if lhs.title != rhs.title {
|
||||
return false
|
||||
}
|
||||
if lhs.option != rhs.option {
|
||||
return false
|
||||
}
|
||||
if lhs.message != rhs.message {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
public let interfaceState: ChatInterfaceState
|
||||
public let chatLocation: ChatLocation
|
||||
public let renderedPeer: RenderedPeer?
|
||||
|
|
@ -505,7 +525,7 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
public let activeGroupCallInfo: ChatActiveGroupCallInfo?
|
||||
public let hasActiveGroupCall: Bool
|
||||
public let importState: ChatPresentationImportState?
|
||||
public let reportReason: (String, Data, String?)?
|
||||
public let reportReason: ReportReasonData?
|
||||
public let showCommands: Bool
|
||||
public let hasBotCommands: Bool
|
||||
public let showSendAsPeers: Bool
|
||||
|
|
@ -638,7 +658,7 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
self.topicListDisplayMode = nil
|
||||
}
|
||||
|
||||
public init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: ChatPinnedMessage?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: UrlPreview?, editingUrlPreview: UrlPreview?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, historyFilter: HistoryFilter?, displayHistoryFilterAsList: Bool, presentationReady: Bool, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, autoremoveTimeout: Int32?, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, greetingData: ChatGreetingData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool, importState: ChatPresentationImportState?, reportReason: (String, Data, String?)?, showCommands: Bool, hasBotCommands: Bool, showSendAsPeers: Bool, sendAsPeers: [SendAsPeer]?, botMenuButton: BotMenuButton, showWebView: Bool, currentSendAsPeerId: PeerId?, copyProtectionEnabled: Bool, hasAtLeast3Messages: Bool, hasPlentyOfMessages: Bool, isPremium: Bool, premiumGiftOptions: [CachedPremiumGiftOption], suggestPremiumGift: Bool, forceInputCommandsHidden: Bool, voiceMessagesAvailable: Bool, customEmojiAvailable: Bool, threadData: ThreadData?, forumTopicData: ThreadData?, isGeneralThreadClosed: Bool?, translationState: ChatPresentationTranslationState?, replyMessage: Message?, accountPeerColor: AccountPeerColor?, savedMessagesTopicPeer: EnginePeer?, hasSearchTags: Bool, isPremiumRequiredForMessaging: Bool, sendPaidMessageStars: StarsAmount?, acknowledgedPaidMessage: Bool, hasSavedChats: Bool, appliedBoosts: Int32?, boostsToUnrestrict: Int32?, businessIntro: TelegramBusinessIntro?, hasBirthdayToday: Bool, adMessage: Message?, peerVerification: PeerVerification?, starGiftsAvailable: Bool, alwaysShowGiftButton: Bool, disallowedGifts: TelegramDisallowedGifts?, topicListDisplayMode: TopicListDisplayMode?) {
|
||||
public init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, inputQueryResults: [ChatPresentationInputQueryKind: ChatPresentationInputQueryResult], inputMode: ChatInputMode, titlePanelContexts: [ChatTitlePanelContext], keyboardButtonsMessage: Message?, pinnedMessageId: MessageId?, pinnedMessage: ChatPinnedMessage?, peerIsBlocked: Bool, peerIsMuted: Bool, peerDiscussionId: PeerId?, peerGeoLocation: PeerGeoLocation?, callsAvailable: Bool, callsPrivate: Bool, slowmodeState: ChatSlowmodeState?, chatHistoryState: ChatHistoryNodeHistoryState?, botStartPayload: String?, urlPreview: UrlPreview?, editingUrlPreview: UrlPreview?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, historyFilter: HistoryFilter?, displayHistoryFilterAsList: Bool, presentationReady: Bool, chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, hasScheduledMessages: Bool, autoremoveTimeout: Int32?, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, greetingData: ChatGreetingData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool, importState: ChatPresentationImportState?, reportReason: ReportReasonData?, showCommands: Bool, hasBotCommands: Bool, showSendAsPeers: Bool, sendAsPeers: [SendAsPeer]?, botMenuButton: BotMenuButton, showWebView: Bool, currentSendAsPeerId: PeerId?, copyProtectionEnabled: Bool, hasAtLeast3Messages: Bool, hasPlentyOfMessages: Bool, isPremium: Bool, premiumGiftOptions: [CachedPremiumGiftOption], suggestPremiumGift: Bool, forceInputCommandsHidden: Bool, voiceMessagesAvailable: Bool, customEmojiAvailable: Bool, threadData: ThreadData?, forumTopicData: ThreadData?, isGeneralThreadClosed: Bool?, translationState: ChatPresentationTranslationState?, replyMessage: Message?, accountPeerColor: AccountPeerColor?, savedMessagesTopicPeer: EnginePeer?, hasSearchTags: Bool, isPremiumRequiredForMessaging: Bool, sendPaidMessageStars: StarsAmount?, acknowledgedPaidMessage: Bool, hasSavedChats: Bool, appliedBoosts: Int32?, boostsToUnrestrict: Int32?, businessIntro: TelegramBusinessIntro?, hasBirthdayToday: Bool, adMessage: Message?, peerVerification: PeerVerification?, starGiftsAvailable: Bool, alwaysShowGiftButton: Bool, disallowedGifts: TelegramDisallowedGifts?, topicListDisplayMode: TopicListDisplayMode?) {
|
||||
self.interfaceState = interfaceState
|
||||
self.chatLocation = chatLocation
|
||||
self.renderedPeer = renderedPeer
|
||||
|
|
@ -894,7 +914,7 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
if lhs.importState != rhs.importState {
|
||||
return false
|
||||
}
|
||||
if lhs.reportReason?.0 != rhs.reportReason?.0 || lhs.reportReason?.1 != rhs.reportReason?.1 || lhs.reportReason?.2 != rhs.reportReason?.2 {
|
||||
if lhs.reportReason != rhs.reportReason {
|
||||
return false
|
||||
}
|
||||
if lhs.showCommands != rhs.showCommands {
|
||||
|
|
@ -1207,7 +1227,7 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, historyFilter: self.historyFilter, displayHistoryFilterAsList: self.displayHistoryFilterAsList, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, subject: self.subject, peerNearbyData: self.peerNearbyData, greetingData: self.greetingData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: importState, reportReason: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasAtLeast3Messages: self.hasAtLeast3Messages, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, premiumGiftOptions: self.premiumGiftOptions, suggestPremiumGift: self.suggestPremiumGift, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, forumTopicData: self.forumTopicData, isGeneralThreadClosed: self.isGeneralThreadClosed, translationState: self.translationState, replyMessage: self.replyMessage, accountPeerColor: self.accountPeerColor, savedMessagesTopicPeer: self.savedMessagesTopicPeer, hasSearchTags: self.hasSearchTags, isPremiumRequiredForMessaging: self.isPremiumRequiredForMessaging, sendPaidMessageStars: self.sendPaidMessageStars, acknowledgedPaidMessage: self.acknowledgedPaidMessage, hasSavedChats: self.hasSavedChats, appliedBoosts: self.appliedBoosts, boostsToUnrestrict: self.boostsToUnrestrict, businessIntro: self.businessIntro, hasBirthdayToday: self.hasBirthdayToday, adMessage: self.adMessage, peerVerification: self.peerVerification, starGiftsAvailable: self.starGiftsAvailable, alwaysShowGiftButton: self.alwaysShowGiftButton, disallowedGifts: self.disallowedGifts, topicListDisplayMode: self.topicListDisplayMode)
|
||||
}
|
||||
|
||||
public func updatedReportReason(_ reportReason: (String, Data, String?)?) -> ChatPresentationInterfaceState {
|
||||
public func updatedReportReason(_ reportReason: ReportReasonData?) -> ChatPresentationInterfaceState {
|
||||
return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: self.peerIsMuted, peerDiscussionId: self.peerDiscussionId, peerGeoLocation: self.peerGeoLocation, callsAvailable: self.callsAvailable, callsPrivate: self.callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, historyFilter: self.historyFilter, displayHistoryFilterAsList: self.displayHistoryFilterAsList, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: self.dateTimeFormat, nameDisplayOrder: self.nameDisplayOrder, limitsConfiguration: self.limitsConfiguration, fontSize: self.fontSize, bubbleCorners: self.bubbleCorners, accountPeerId: self.accountPeerId, mode: self.mode, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, subject: self.subject, peerNearbyData: self.peerNearbyData, greetingData: self.greetingData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.importState, reportReason: reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasAtLeast3Messages: self.hasAtLeast3Messages, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, premiumGiftOptions: self.premiumGiftOptions, suggestPremiumGift: self.suggestPremiumGift, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, forumTopicData: self.forumTopicData, isGeneralThreadClosed: self.isGeneralThreadClosed, translationState: self.translationState, replyMessage: self.replyMessage, accountPeerColor: self.accountPeerColor, savedMessagesTopicPeer: self.savedMessagesTopicPeer, hasSearchTags: self.hasSearchTags, isPremiumRequiredForMessaging: self.isPremiumRequiredForMessaging, sendPaidMessageStars: self.sendPaidMessageStars, acknowledgedPaidMessage: self.acknowledgedPaidMessage, hasSavedChats: self.hasSavedChats, appliedBoosts: self.appliedBoosts, boostsToUnrestrict: self.boostsToUnrestrict, businessIntro: self.businessIntro, hasBirthdayToday: self.hasBirthdayToday, adMessage: self.adMessage, peerVerification: self.peerVerification, starGiftsAvailable: self.starGiftsAvailable, alwaysShowGiftButton: self.alwaysShowGiftButton, disallowedGifts: self.disallowedGifts, topicListDisplayMode: self.topicListDisplayMode)
|
||||
}
|
||||
|
||||
|
|
@ -1364,16 +1384,20 @@ public final class ChatPresentationInterfaceState: Equatable {
|
|||
}
|
||||
}
|
||||
|
||||
public func canBypassRestrictions(chatPresentationInterfaceState: ChatPresentationInterfaceState) -> Bool {
|
||||
guard let boostsToUnrestrict = chatPresentationInterfaceState.boostsToUnrestrict, boostsToUnrestrict > 0 else {
|
||||
public func canBypassRestrictions(boostsToUnrestrict: Int32?, appliedBoosts: Int32?) -> Bool {
|
||||
guard let boostsToUnrestrict, boostsToUnrestrict > 0 else {
|
||||
return false
|
||||
}
|
||||
if let appliedBoosts = chatPresentationInterfaceState.appliedBoosts, appliedBoosts >= boostsToUnrestrict {
|
||||
if let appliedBoosts, appliedBoosts >= boostsToUnrestrict {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
public func canBypassRestrictions(chatPresentationInterfaceState: ChatPresentationInterfaceState) -> Bool {
|
||||
return canBypassRestrictions(boostsToUnrestrict: chatPresentationInterfaceState.boostsToUnrestrict, appliedBoosts: chatPresentationInterfaceState.appliedBoosts)
|
||||
}
|
||||
|
||||
public func canSendMessagesToChat(_ state: ChatPresentationInterfaceState) -> Bool {
|
||||
if let peer = state.renderedPeer?.peer {
|
||||
let canBypassRestrictions = canBypassRestrictions(chatPresentationInterfaceState: state)
|
||||
|
|
|
|||
|
|
@ -23,9 +23,6 @@ extension PeerStatusSettings {
|
|||
if (flags & (1 << 4)) != 0 {
|
||||
result.insert(.addExceptionWhenAddingContact)
|
||||
}
|
||||
if (flags & (1 << 5)) != 0 {
|
||||
result.insert(.canReportIrrelevantGeoLocation)
|
||||
}
|
||||
if (flags & (1 << 7)) != 0 {
|
||||
result.insert(.autoArchived)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ public struct PeerStatusSettings: PostboxCoding, Equatable {
|
|||
public static let canBlock = Flags(rawValue: 1 << 3)
|
||||
public static let canAddContact = Flags(rawValue: 1 << 4)
|
||||
public static let addExceptionWhenAddingContact = Flags(rawValue: 1 << 5)
|
||||
public static let canReportIrrelevantGeoLocation = Flags(rawValue: 1 << 6)
|
||||
public static let autoArchived = Flags(rawValue: 1 << 7)
|
||||
public static let suggestAddMembers = Flags(rawValue: 1 << 8)
|
||||
|
||||
|
|
|
|||
|
|
@ -559,6 +559,7 @@ private class AdMessagesHistoryContextImpl {
|
|||
public class AdMessagesHistoryContext {
|
||||
private let queue = Queue()
|
||||
private let impl: QueueLocalObject<AdMessagesHistoryContextImpl>
|
||||
public let peerId: EnginePeer.Id
|
||||
|
||||
public var state: Signal<(interPostInterval: Int32?, messages: [Message]), NoError> {
|
||||
return Signal { subscriber in
|
||||
|
|
@ -576,6 +577,7 @@ public class AdMessagesHistoryContext {
|
|||
}
|
||||
|
||||
public init(account: Account, peerId: PeerId) {
|
||||
self.peerId = peerId
|
||||
let queue = self.queue
|
||||
self.impl = QueueLocalObject(queue: queue, generate: {
|
||||
return AdMessagesHistoryContextImpl(queue: queue, account: account, peerId: peerId)
|
||||
|
|
|
|||
|
|
@ -112,7 +112,6 @@ public enum EnginePeer: Equatable {
|
|||
public static let canBlock = Flags(rawValue: 1 << 3)
|
||||
public static let canAddContact = Flags(rawValue: 1 << 4)
|
||||
public static let addExceptionWhenAddingContact = Flags(rawValue: 1 << 5)
|
||||
public static let canReportIrrelevantGeoLocation = Flags(rawValue: 1 << 6)
|
||||
public static let autoArchived = Flags(rawValue: 1 << 7)
|
||||
public static let suggestAddMembers = Flags(rawValue: 1 << 8)
|
||||
|
||||
|
|
|
|||
|
|
@ -134,7 +134,6 @@ public final class ChatRecentActionsController: TelegramBaseController {
|
|||
}, updateInputLanguage: { _ in
|
||||
}, unarchiveChat: {
|
||||
}, openLinkEditing: {
|
||||
}, reportPeerIrrelevantGeoLocation: {
|
||||
}, displaySlowmodeTooltip: { _, _ in
|
||||
}, displaySendMessageOptions: { _, _ in
|
||||
}, openScheduledMessages: {
|
||||
|
|
|
|||
|
|
@ -398,7 +398,6 @@ final class PeerInfoSelectionPanelNode: ASDisplayNode {
|
|||
}, updateInputLanguage: { _ in
|
||||
}, unarchiveChat: {
|
||||
}, openLinkEditing: {
|
||||
}, reportPeerIrrelevantGeoLocation: {
|
||||
}, displaySlowmodeTooltip: { _, _ in
|
||||
}, displaySendMessageOptions: { _, _ in
|
||||
}, openScheduledMessages: {
|
||||
|
|
|
|||
|
|
@ -682,7 +682,6 @@ final class PeerSelectionControllerNode: ASDisplayNode {
|
|||
})
|
||||
strongSelf.present(controller, nil)
|
||||
}
|
||||
}, reportPeerIrrelevantGeoLocation: {
|
||||
}, displaySlowmodeTooltip: { _, _ in
|
||||
}, displaySendMessageOptions: { [weak self] node, gesture in
|
||||
guard let strongSelf = self else {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -384,8 +384,15 @@ extension ChatControllerImpl {
|
|||
})
|
||||
}
|
||||
case let .openChatInfo(expandAvatar, section):
|
||||
let _ = self.presentVoiceMessageDiscardAlert(action: {
|
||||
switch self.chatLocationInfoData {
|
||||
let _ = self.presentVoiceMessageDiscardAlert(action: { [weak self] in
|
||||
guard let self else {
|
||||
return
|
||||
}
|
||||
guard let contentData = self.contentData else {
|
||||
return
|
||||
}
|
||||
|
||||
switch contentData.chatLocationInfoData {
|
||||
case let .peer(peerView):
|
||||
self.navigationActionDisposable.set((peerView.get()
|
||||
|> take(1)
|
||||
|
|
@ -413,7 +420,7 @@ extension ChatControllerImpl {
|
|||
default:
|
||||
mode = .generic
|
||||
}
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: true, requestsContext: strongSelf.inviteRequestsContext) {
|
||||
if let infoController = strongSelf.context.sharedContext.makePeerInfoController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, peer: peer, mode: mode, avatarInitiallyExpanded: expandAvatar, fromChat: true, requestsContext: strongSelf.contentData?.inviteRequestsContext) {
|
||||
strongSelf.effectiveNavigationController?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
|
|
@ -444,7 +451,7 @@ extension ChatControllerImpl {
|
|||
}
|
||||
}
|
||||
} else if let channel = self.presentationInterfaceState.renderedPeer?.peer as? TelegramChannel, channel.isForumOrMonoForum, case let .replyThread(message) = self.chatLocation {
|
||||
if let infoController = self.context.sharedContext.makePeerInfoController(context: self.context, updatedPresentationData: self.updatedPresentationData, peer: channel, mode: .forumTopic(thread: message), avatarInitiallyExpanded: false, fromChat: true, requestsContext: self.inviteRequestsContext) {
|
||||
if let infoController = self.context.sharedContext.makePeerInfoController(context: self.context, updatedPresentationData: self.updatedPresentationData, peer: channel, mode: .forumTopic(thread: message), avatarInitiallyExpanded: false, fromChat: true, requestsContext: self.contentData?.inviteRequestsContext) {
|
||||
self.effectiveNavigationController?.pushViewController(infoController)
|
||||
}
|
||||
}
|
||||
|
|
@ -459,6 +466,10 @@ extension ChatControllerImpl {
|
|||
self.dismiss()
|
||||
}
|
||||
case .clearCache:
|
||||
guard let contentData = self.contentData else {
|
||||
return
|
||||
}
|
||||
|
||||
let controller = OverlayStatusController(theme: self.presentationData.theme, type: .loading(cancelled: nil))
|
||||
self.present(controller, in: .window(.root))
|
||||
|
||||
|
|
@ -470,7 +481,7 @@ extension ChatControllerImpl {
|
|||
self.clearCacheDisposable = disposable
|
||||
}
|
||||
|
||||
switch self.chatLocationInfoData {
|
||||
switch contentData.chatLocationInfoData {
|
||||
case let .peer(peerView):
|
||||
self.navigationActionDisposable.set((peerView.get()
|
||||
|> take(1)
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ extension ChatControllerImpl {
|
|||
presentationData = presentationData.withUpdated(theme: defaultDarkColorPresentationTheme)
|
||||
}
|
||||
var peer = peer
|
||||
if let peerDiscussionId = self.presentationInterfaceState.peerDiscussionId, let channel = self.peerView?.peers[peerDiscussionId] {
|
||||
if let peerDiscussionId = self.presentationInterfaceState.peerDiscussionId, let channel = self.contentData?.state.peerView?.peers[peerDiscussionId] {
|
||||
peer = EnginePeer(channel)
|
||||
}
|
||||
let controller = chatMessagePaymentAlertController(
|
||||
|
|
|
|||
|
|
@ -168,7 +168,7 @@ extension ChatControllerImpl {
|
|||
}
|
||||
|
||||
var canResetWallpaper = false
|
||||
if let cachedUserData = strongSelf.peerView?.cachedData as? CachedUserData {
|
||||
if let cachedUserData = strongSelf.contentData?.state.peerView?.cachedData as? CachedUserData {
|
||||
canResetWallpaper = cachedUserData.wallpaper != nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -137,11 +137,6 @@ import TelegramCallsUI
|
|||
import QuickShareScreen
|
||||
import PostSuggestionsSettingsScreen
|
||||
|
||||
public enum ChatControllerPeekActions {
|
||||
case standard
|
||||
case remove(() -> Void)
|
||||
}
|
||||
|
||||
public final class ChatControllerOverlayPresentationData {
|
||||
public let expandData: (ASDisplayNode?, () -> Void)
|
||||
public init(expandData: (ASDisplayNode?, () -> Void)) {
|
||||
|
|
@ -243,31 +238,31 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
let chatNavigationStack: [ChatNavigationStackItem]
|
||||
let customChatNavigationStack: [EnginePeer.Id]?
|
||||
|
||||
public var peekActions: ChatControllerPeekActions = .standard
|
||||
var didSetup3dTouch: Bool = false
|
||||
var didSetupDropToPaste: Bool = false
|
||||
|
||||
let context: AccountContext
|
||||
public internal(set) var chatLocation: ChatLocation
|
||||
public let subject: ChatControllerSubject?
|
||||
|
||||
var botStart: ChatControllerInitialBotStart?
|
||||
var attachBotStart: ChatControllerInitialAttachBotStart?
|
||||
var botAppStart: ChatControllerInitialBotAppStart?
|
||||
var mode: ChatControllerPresentationMode
|
||||
|
||||
let peerDisposable = MetaDisposable()
|
||||
let titleDisposable = MetaDisposable()
|
||||
var pendingContentData: (contentData: ChatControllerImpl.ContentData, historyNode: ChatHistoryListNodeImpl)?
|
||||
var contentData: ChatControllerImpl.ContentData?
|
||||
let contentDataReady = ValuePromise<Bool>(false, ignoreRepeated: true)
|
||||
var contentDataDisposable: Disposable?
|
||||
var didHandlePerformDismissAction: Bool = false
|
||||
|
||||
var accountPeerDisposable: Disposable?
|
||||
let navigationActionDisposable = MetaDisposable()
|
||||
var networkStateDisposable: Disposable?
|
||||
|
||||
let messageIndexDisposable = MetaDisposable()
|
||||
|
||||
let _chatLocationInfoReady = Promise<Bool>()
|
||||
var didSetChatLocationInfoReady = false
|
||||
var chatLocationInfoData: ChatLocationInfoData
|
||||
|
||||
let cachedDataReady = Promise<Bool>()
|
||||
var didSetCachedDataReady = false
|
||||
|
||||
let navigationActionDisposable = MetaDisposable()
|
||||
let messageIndexDisposable = MetaDisposable()
|
||||
var networkStateDisposable: Disposable?
|
||||
|
||||
let wallpaperReady = Promise<Bool>()
|
||||
let presentationReady = Promise<Bool>()
|
||||
|
|
@ -294,9 +289,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
var moreBarButton: MoreHeaderButton
|
||||
var moreInfoNavigationButton: ChatNavigationButton?
|
||||
|
||||
var peerView: PeerView?
|
||||
var threadInfo: EngineMessageHistoryThread.Info?
|
||||
|
||||
var historyStateDisposable: Disposable?
|
||||
|
||||
let galleryHiddenMesageAndMediaDisposable = MetaDisposable()
|
||||
|
|
@ -343,14 +335,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
var stateServiceTasks: [AnyHashable: Disposable] = [:]
|
||||
|
||||
var preloadHistoryPeerId: PeerId?
|
||||
let preloadHistoryPeerIdDisposable = MetaDisposable()
|
||||
|
||||
var preloadNextChatPeerId: PeerId?
|
||||
let preloadNextChatPeerIdDisposable = MetaDisposable()
|
||||
|
||||
var preloadSavedMessagesChatsDisposable: Disposable?
|
||||
|
||||
let botCallbackAlertMessage = Promise<String?>(nil)
|
||||
var botCallbackAlertMessageDisposable: Disposable?
|
||||
|
||||
|
|
@ -381,8 +365,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
var recorderDataDisposable = MetaDisposable()
|
||||
|
||||
var buttonKeyboardMessageDisposable: Disposable?
|
||||
var cachedDataDisposable: Disposable?
|
||||
var chatUnreadCountDisposable: Disposable?
|
||||
var buttonUnreadCountDisposable: Disposable?
|
||||
var chatUnreadMentionCountDisposable: Disposable?
|
||||
|
|
@ -411,8 +393,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
public let canReadHistory = ValuePromise<Bool>(true, ignoreRepeated: true)
|
||||
public let hasBrowserOrAppInFront = Promise<Bool>(false)
|
||||
var reminderActivity: NSUserActivity?
|
||||
var isReminderActivityEnabled: Bool = false
|
||||
|
||||
var canReadHistoryValue = false {
|
||||
didSet {
|
||||
|
|
@ -505,13 +485,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
weak var currentPinchSourceItemNode: ListViewItemNode?
|
||||
|
||||
var screenCaptureManager: ScreenCaptureDetectionManager?
|
||||
let chatAdditionalDataDisposable = MetaDisposable()
|
||||
|
||||
var reportIrrelvantGeoNoticePromise = Promise<Bool?>()
|
||||
var reportIrrelvantGeoNotice: Bool?
|
||||
var reportIrrelvantGeoDisposable: Disposable?
|
||||
|
||||
var hasScheduledMessages: Bool = false
|
||||
|
||||
var volumeButtonsListener: VolumeButtonsListener?
|
||||
|
||||
|
|
@ -536,7 +509,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
let selectAddMemberDisposable = MetaDisposable()
|
||||
let addMemberDisposable = MetaDisposable()
|
||||
let joinChannelDisposable = MetaDisposable()
|
||||
var premiumOrStarsRequiredDisposable: Disposable?
|
||||
|
||||
var shouldDisplayDownButton = false
|
||||
|
||||
|
|
@ -583,40 +555,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
public var isSelectingMessagesUpdated: ((Bool) -> Void)?
|
||||
|
||||
let scrolledToMessageId = ValuePromise<ScrolledToMessageId?>(nil, ignoreRepeated: true)
|
||||
var scrolledToMessageIdValue: ScrolledToMessageId? = nil {
|
||||
didSet {
|
||||
self.scrolledToMessageId.set(self.scrolledToMessageIdValue)
|
||||
}
|
||||
}
|
||||
|
||||
var translationStateDisposable: Disposable?
|
||||
var premiumGiftSuggestionDisposable: Disposable?
|
||||
|
||||
var nextChannelToReadDisposable: Disposable?
|
||||
var offerNextChannelToRead = false
|
||||
|
||||
var inviteRequestsContext: PeerInvitationImportersContext?
|
||||
var inviteRequestsDisposable = MetaDisposable()
|
||||
|
||||
var overlayTitle: String? {
|
||||
var title: String?
|
||||
if let threadInfo = self.threadInfo {
|
||||
title = threadInfo.title
|
||||
} else if let peerView = self.peerView {
|
||||
if let peer = peerViewMainPeer(peerView) {
|
||||
title = EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)
|
||||
}
|
||||
}
|
||||
return title
|
||||
}
|
||||
|
||||
var currentSpeechHolder: SpeechSynthesizerHolder?
|
||||
|
||||
var powerSavingMonitoringDisposable: Disposable?
|
||||
|
||||
var avatarNode: ChatAvatarNavigationNode?
|
||||
var storyStats: PeerStoryStats?
|
||||
|
||||
var performTextSelectionAction: ((Message?, Bool, NSAttributedString, TextSelectionAction) -> Void)?
|
||||
var performOpenURL: ((Message?, String, Promise<Bool>?) -> Void)?
|
||||
|
|
@ -728,27 +674,12 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
default:
|
||||
groupCallPanelSource = .none
|
||||
}
|
||||
self.chatLocationInfoData = .peer(Promise())
|
||||
case let .replyThread(replyThreadMessage):
|
||||
case .replyThread:
|
||||
locationBroadcastPanelSource = .none
|
||||
groupCallPanelSource = .none
|
||||
let promise = Promise<Message?>()
|
||||
if let effectiveMessageId = replyThreadMessage.effectiveMessageId {
|
||||
promise.set(context.engine.data.subscribe(TelegramEngine.EngineData.Item.Messages.Message(id: effectiveMessageId))
|
||||
|> map { message -> Message? in
|
||||
guard let message = message else {
|
||||
return nil
|
||||
}
|
||||
return message._asMessage()
|
||||
})
|
||||
} else {
|
||||
promise.set(.single(nil))
|
||||
}
|
||||
self.chatLocationInfoData = .replyThread(promise)
|
||||
case .customChatContents:
|
||||
locationBroadcastPanelSource = .none
|
||||
groupCallPanelSource = .none
|
||||
self.chatLocationInfoData = .customChatContents
|
||||
}
|
||||
|
||||
var presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
|
@ -1325,7 +1256,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
if let adAttribute = message.attributes.first(where: { $0 is AdMessageAttribute }) as? AdMessageAttribute {
|
||||
if let file = message.media.first(where: { $0 is TelegramMediaFile}) as? TelegramMediaFile, file.isVideo && !file.isAnimated {
|
||||
self.chatDisplayNode.historyNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: true, fullscreen: false)
|
||||
self.chatDisplayNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: true, fullscreen: false)
|
||||
} else {
|
||||
self.controllerInteraction?.activateAdAction(message.id, nil, true, false)
|
||||
return true
|
||||
|
|
@ -1495,7 +1426,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] {
|
||||
legacyMediaEditor(context: self.context, peer: peer, threadTitle: self.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: NSAttributedString(), snapshots: snapshots, transitionCompletion: {
|
||||
legacyMediaEditor(context: self.context, peer: peer, threadTitle: self.contentData?.state.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: NSAttributedString(), snapshots: snapshots, transitionCompletion: {
|
||||
transitionCompletion()
|
||||
}, getCaptionPanelView: { [weak self] in
|
||||
return self?.getCaptionPanelView(isFile: false)
|
||||
|
|
@ -2682,7 +2613,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
if let message, let adAttribute = message.attributes.first(where: { $0 is AdMessageAttribute }) as? AdMessageAttribute {
|
||||
strongSelf.chatDisplayNode.historyNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: false, fullscreen: false)
|
||||
strongSelf.chatDisplayNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: false, fullscreen: false)
|
||||
}
|
||||
|
||||
if let performOpenURL = strongSelf.performOpenURL {
|
||||
|
|
@ -2867,7 +2798,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
return
|
||||
}
|
||||
|
||||
if let cachedUserData = strongSelf.peerView?.cachedData as? CachedUserData, cachedUserData.callsPrivate {
|
||||
if let cachedUserData = strongSelf.contentData?.state.peerView?.cachedData as? CachedUserData, cachedUserData.callsPrivate {
|
||||
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
|
||||
|
||||
strongSelf.present(textAlertController(context: strongSelf.context, updatedPresentationData: strongSelf.updatedPresentationData, title: presentationData.strings.Call_ConnectionErrorTitle, text: presentationData.strings.Call_PrivacyErrorMessage(EnginePeer(peer).compactDisplayTitle).string, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||
|
|
@ -3887,7 +3818,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
if let mediaReference = mediaReference, let peer = message.peers[message.id.peerId] {
|
||||
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.contentData?.state.threadInfo?.title, media: mediaReference, mode: .draw, initialCaption: inputText, snapshots: [], transitionCompletion: nil, getCaptionPanelView: { [weak self] in
|
||||
return self?.getCaptionPanelView(isFile: true)
|
||||
}, sendMessagesWithSignals: { [weak self] signals, _, _, _ in
|
||||
if let strongSelf = self {
|
||||
|
|
@ -4051,7 +3982,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
}
|
||||
|
||||
self.chatDisplayNode.historyNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: media, fullscreen: fullscreen)
|
||||
self.chatDisplayNode.adMessagesContext?.markAction(opaqueId: adAttribute.opaqueId, media: media, fullscreen: fullscreen)
|
||||
self.controllerInteraction?.openUrl(ChatControllerInteraction.OpenUrl(url: adAttribute.url, concealed: false, external: true, progress: progress))
|
||||
}, adContextAction: { [weak self] message, sourceNode, gesture in
|
||||
guard let self else {
|
||||
|
|
@ -4642,7 +4573,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
let premiumOptions = giftOptions.filter { $0.users == 1 }.map { CachedPremiumGiftOption(months: $0.months, currency: $0.currency, amount: $0.amount, botUrl: "", storeProductId: $0.storeProductId) }
|
||||
|
||||
var hasBirthday = false
|
||||
if let cachedUserData = self.peerView?.cachedData as? CachedUserData {
|
||||
if let cachedUserData = self.contentData?.state.peerView?.cachedData as? CachedUserData {
|
||||
hasBirthday = hasBirthdayToday(cachedData: cachedUserData)
|
||||
}
|
||||
let controller = self.context.sharedContext.makeGiftOptionsController(context: context, peerId: peerId, premiumOptions: premiumOptions, hasBirthday: hasBirthday, completion: nil)
|
||||
|
|
@ -4862,7 +4793,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
self.navigationItem.titleView = self.chatTitleView
|
||||
self.chatTitleView?.longPressed = { [weak self] in
|
||||
if let strongSelf = self, let peerView = strongSelf.peerView, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
|
||||
if let strongSelf = self, let peerView = strongSelf.contentData?.state.peerView, let peer = peerView.peers[peerView.peerId], peer.restrictionText(platform: "ios", contentSettings: strongSelf.context.currentContentSettings.with { $0 }) == nil && !strongSelf.presentationInterfaceState.isNotAccessible {
|
||||
if case .standard(.previewing) = strongSelf.mode {
|
||||
} else {
|
||||
strongSelf.interfaceInteraction?.beginMessageSearch(.everything, "")
|
||||
|
|
@ -5299,7 +5230,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
})
|
||||
}
|
||||
|
||||
self.reloadChatLocation(chatLocation: self.chatLocation, isReady: nil)
|
||||
self.reloadChatLocation(chatLocation: self.chatLocation, chatLocationContextHolder: self.chatLocationContextHolder, historyNode: self.chatDisplayNode.historyNode, isReady: nil)
|
||||
|
||||
self.botCallbackAlertMessageDisposable = (self.botCallbackAlertMessage.get()
|
||||
|> deliverOnMainQueue).startStrict(next: { [weak self] message in
|
||||
|
|
@ -5778,8 +5709,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
if let strongSelf = self, strongSelf.canReadHistoryValue != value {
|
||||
strongSelf.canReadHistoryValue = value
|
||||
strongSelf.raiseToListen?.enabled = value
|
||||
strongSelf.isReminderActivityEnabled = value
|
||||
strongSelf.updateReminderActivity()
|
||||
}
|
||||
})
|
||||
|
||||
|
|
@ -5804,104 +5733,89 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
let _ = ChatControllerCount.modify { value in
|
||||
return value - 1
|
||||
}
|
||||
|
||||
let deallocate: () -> Void = {
|
||||
self.historyStateDisposable?.dispose()
|
||||
self.messageIndexDisposable.dispose()
|
||||
self.navigationActionDisposable.dispose()
|
||||
self.galleryHiddenMesageAndMediaDisposable.dispose()
|
||||
self.temporaryHiddenGalleryMediaDisposable.dispose()
|
||||
self.peerDisposable.dispose()
|
||||
self.accountPeerDisposable?.dispose()
|
||||
self.titleDisposable.dispose()
|
||||
self.messageContextDisposable.dispose()
|
||||
self.controllerNavigationDisposable.dispose()
|
||||
self.sentMessageEventsDisposable.dispose()
|
||||
self.failedMessageEventsDisposable.dispose()
|
||||
self.sentPeerMediaMessageEventsDisposable.dispose()
|
||||
self.messageActionCallbackDisposable.dispose()
|
||||
self.messageActionUrlAuthDisposable.dispose()
|
||||
self.editMessageDisposable.dispose()
|
||||
self.editMessageErrorsDisposable.dispose()
|
||||
self.enqueueMediaMessageDisposable.dispose()
|
||||
self.resolvePeerByNameDisposable?.dispose()
|
||||
self.shareStatusDisposable?.dispose()
|
||||
self.clearCacheDisposable?.dispose()
|
||||
self.bankCardDisposable?.dispose()
|
||||
self.botCallbackAlertMessageDisposable?.dispose()
|
||||
self.selectMessagePollOptionDisposables?.dispose()
|
||||
for (_, info) in self.contextQueryStates {
|
||||
info.1.dispose()
|
||||
}
|
||||
self.urlPreviewQueryState?.1.dispose()
|
||||
self.editingUrlPreviewQueryState?.1.dispose()
|
||||
self.replyMessageState?.1.dispose()
|
||||
self.audioRecorderDisposable?.dispose()
|
||||
self.audioRecorderStatusDisposable?.dispose()
|
||||
self.videoRecorderDisposable?.dispose()
|
||||
self.buttonKeyboardMessageDisposable?.dispose()
|
||||
self.cachedDataDisposable?.dispose()
|
||||
self.resolveUrlDisposable?.dispose()
|
||||
self.chatUnreadCountDisposable?.dispose()
|
||||
self.buttonUnreadCountDisposable?.dispose()
|
||||
self.chatUnreadMentionCountDisposable?.dispose()
|
||||
self.peerInputActivitiesDisposable?.dispose()
|
||||
self.interactiveEmojiSyncDisposable.dispose()
|
||||
self.recentlyUsedInlineBotsDisposable?.dispose()
|
||||
self.unpinMessageDisposable?.dispose()
|
||||
self.inputActivityDisposable?.dispose()
|
||||
self.recordingActivityDisposable?.dispose()
|
||||
self.acquiredRecordingActivityDisposable?.dispose()
|
||||
self.presentationDataDisposable?.dispose()
|
||||
self.searchDisposable?.dispose()
|
||||
self.applicationInForegroundDisposable?.dispose()
|
||||
self.applicationInFocusDisposable?.dispose()
|
||||
self.canReadHistoryDisposable?.dispose()
|
||||
self.networkStateDisposable?.dispose()
|
||||
self.chatAdditionalDataDisposable.dispose()
|
||||
self.shareStatusDisposable?.dispose()
|
||||
self.context.sharedContext.mediaManager.galleryHiddenMediaManager.removeTarget(self)
|
||||
self.preloadHistoryPeerIdDisposable.dispose()
|
||||
self.preloadNextChatPeerIdDisposable.dispose()
|
||||
self.reportIrrelvantGeoDisposable?.dispose()
|
||||
self.reminderActivity?.invalidate()
|
||||
self.updateSlowmodeStatusDisposable.dispose()
|
||||
self.keepPeerInfoScreenDataHotDisposable.dispose()
|
||||
self.preloadAvatarDisposable.dispose()
|
||||
self.peekTimerDisposable.dispose()
|
||||
self.hasActiveGroupCallDisposable?.dispose()
|
||||
self.createVoiceChatDisposable.dispose()
|
||||
self.checksTooltipDisposable.dispose()
|
||||
self.peerSuggestionsDisposable.dispose()
|
||||
self.peerSuggestionsDismissDisposable.dispose()
|
||||
self.selectAddMemberDisposable.dispose()
|
||||
self.addMemberDisposable.dispose()
|
||||
self.joinChannelDisposable.dispose()
|
||||
self.nextChannelToReadDisposable?.dispose()
|
||||
self.inviteRequestsDisposable.dispose()
|
||||
self.sendAsPeersDisposable?.dispose()
|
||||
self.preloadAttachBotIconsDisposables?.dispose()
|
||||
self.keepMessageCountersSyncrhonizedDisposable?.dispose()
|
||||
self.keepSavedMessagesSyncrhonizedDisposable?.dispose()
|
||||
self.translationStateDisposable?.dispose()
|
||||
self.premiumGiftSuggestionDisposable?.dispose()
|
||||
self.powerSavingMonitoringDisposable?.dispose()
|
||||
self.saveMediaDisposable?.dispose()
|
||||
self.giveawayStatusDisposable?.dispose()
|
||||
self.nameColorDisposable?.dispose()
|
||||
self.choosingStickerActivityDisposable?.dispose()
|
||||
self.automaticMediaDownloadSettingsDisposable?.dispose()
|
||||
self.stickerSettingsDisposable?.dispose()
|
||||
self.searchQuerySuggestionState?.1.dispose()
|
||||
self.preloadSavedMessagesChatsDisposable?.dispose()
|
||||
self.recorderDataDisposable.dispose()
|
||||
self.displaySendWhenOnlineTipDisposable.dispose()
|
||||
self.networkSpeedEventsDisposable?.dispose()
|
||||
self.postedScheduledMessagesEventsDisposable?.dispose()
|
||||
self.premiumOrStarsRequiredDisposable?.dispose()
|
||||
self.updateChatLocationThreadDisposable?.dispose()
|
||||
|
||||
self.historyStateDisposable?.dispose()
|
||||
self.messageIndexDisposable.dispose()
|
||||
self.navigationActionDisposable.dispose()
|
||||
self.galleryHiddenMesageAndMediaDisposable.dispose()
|
||||
self.temporaryHiddenGalleryMediaDisposable.dispose()
|
||||
self.messageContextDisposable.dispose()
|
||||
self.controllerNavigationDisposable.dispose()
|
||||
self.sentMessageEventsDisposable.dispose()
|
||||
self.failedMessageEventsDisposable.dispose()
|
||||
self.sentPeerMediaMessageEventsDisposable.dispose()
|
||||
self.messageActionCallbackDisposable.dispose()
|
||||
self.messageActionUrlAuthDisposable.dispose()
|
||||
self.editMessageDisposable.dispose()
|
||||
self.editMessageErrorsDisposable.dispose()
|
||||
self.enqueueMediaMessageDisposable.dispose()
|
||||
self.resolvePeerByNameDisposable?.dispose()
|
||||
self.shareStatusDisposable?.dispose()
|
||||
self.clearCacheDisposable?.dispose()
|
||||
self.bankCardDisposable?.dispose()
|
||||
self.botCallbackAlertMessageDisposable?.dispose()
|
||||
self.selectMessagePollOptionDisposables?.dispose()
|
||||
for (_, info) in self.contextQueryStates {
|
||||
info.1.dispose()
|
||||
}
|
||||
deallocate()
|
||||
self.urlPreviewQueryState?.1.dispose()
|
||||
self.editingUrlPreviewQueryState?.1.dispose()
|
||||
self.replyMessageState?.1.dispose()
|
||||
self.audioRecorderDisposable?.dispose()
|
||||
self.audioRecorderStatusDisposable?.dispose()
|
||||
self.videoRecorderDisposable?.dispose()
|
||||
self.resolveUrlDisposable?.dispose()
|
||||
self.chatUnreadCountDisposable?.dispose()
|
||||
self.buttonUnreadCountDisposable?.dispose()
|
||||
self.chatUnreadMentionCountDisposable?.dispose()
|
||||
self.peerInputActivitiesDisposable?.dispose()
|
||||
self.interactiveEmojiSyncDisposable.dispose()
|
||||
self.recentlyUsedInlineBotsDisposable?.dispose()
|
||||
self.unpinMessageDisposable?.dispose()
|
||||
self.inputActivityDisposable?.dispose()
|
||||
self.recordingActivityDisposable?.dispose()
|
||||
self.acquiredRecordingActivityDisposable?.dispose()
|
||||
self.presentationDataDisposable?.dispose()
|
||||
self.searchDisposable?.dispose()
|
||||
self.applicationInForegroundDisposable?.dispose()
|
||||
self.applicationInFocusDisposable?.dispose()
|
||||
self.canReadHistoryDisposable?.dispose()
|
||||
self.networkStateDisposable?.dispose()
|
||||
self.shareStatusDisposable?.dispose()
|
||||
self.context.sharedContext.mediaManager.galleryHiddenMediaManager.removeTarget(self)
|
||||
self.updateSlowmodeStatusDisposable.dispose()
|
||||
self.keepPeerInfoScreenDataHotDisposable.dispose()
|
||||
self.preloadAvatarDisposable.dispose()
|
||||
self.peekTimerDisposable.dispose()
|
||||
self.hasActiveGroupCallDisposable?.dispose()
|
||||
self.createVoiceChatDisposable.dispose()
|
||||
self.checksTooltipDisposable.dispose()
|
||||
self.peerSuggestionsDisposable.dispose()
|
||||
self.peerSuggestionsDismissDisposable.dispose()
|
||||
self.selectAddMemberDisposable.dispose()
|
||||
self.addMemberDisposable.dispose()
|
||||
self.joinChannelDisposable.dispose()
|
||||
self.sendAsPeersDisposable?.dispose()
|
||||
self.preloadAttachBotIconsDisposables?.dispose()
|
||||
self.keepMessageCountersSyncrhonizedDisposable?.dispose()
|
||||
self.keepSavedMessagesSyncrhonizedDisposable?.dispose()
|
||||
self.translationStateDisposable?.dispose()
|
||||
self.premiumGiftSuggestionDisposable?.dispose()
|
||||
self.powerSavingMonitoringDisposable?.dispose()
|
||||
self.saveMediaDisposable?.dispose()
|
||||
self.giveawayStatusDisposable?.dispose()
|
||||
self.nameColorDisposable?.dispose()
|
||||
self.choosingStickerActivityDisposable?.dispose()
|
||||
self.automaticMediaDownloadSettingsDisposable?.dispose()
|
||||
self.stickerSettingsDisposable?.dispose()
|
||||
self.searchQuerySuggestionState?.1.dispose()
|
||||
self.recorderDataDisposable.dispose()
|
||||
self.displaySendWhenOnlineTipDisposable.dispose()
|
||||
self.networkSpeedEventsDisposable?.dispose()
|
||||
self.postedScheduledMessagesEventsDisposable?.dispose()
|
||||
self.updateChatLocationThreadDisposable?.dispose()
|
||||
self.accountPeerDisposable?.dispose()
|
||||
self.contentDataDisposable?.dispose()
|
||||
}
|
||||
|
||||
public func updatePresentationMode(_ mode: ChatControllerPresentationMode) {
|
||||
|
|
@ -6035,10 +5949,48 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
self.chatTitleView?.updateThemeAndStrings(theme: presentationTheme, strings: self.presentationData.strings, hasEmbeddedTitleContent: self.hasEmbeddedTitleContent)
|
||||
}
|
||||
|
||||
func topPinnedMessageSignal(latest: Bool) -> Signal<ChatPinnedMessage?, NoError> {
|
||||
var pinnedPeerId: EnginePeer.Id?
|
||||
let threadId = self.chatLocation.threadId
|
||||
let loadState: Signal<Bool, NoError> = self.chatDisplayNode.historyNode.historyState.get()
|
||||
enum PinnedReferenceMessage {
|
||||
struct Loaded {
|
||||
var id: MessageId
|
||||
var minId: MessageId
|
||||
var isScrolled: Bool
|
||||
}
|
||||
|
||||
case ready(Loaded)
|
||||
case loading
|
||||
}
|
||||
|
||||
static func topPinnedScrollReferenceMessage(historyNode: ChatHistoryListNodeImpl, scrolledToMessageId: Signal<ScrolledToMessageId?, NoError>) -> Signal<PinnedReferenceMessage?, NoError> {
|
||||
return combineLatest(queue: Queue.mainQueue(),
|
||||
scrolledToMessageId,
|
||||
historyNode.topVisibleMessageRange.get()
|
||||
)
|
||||
|> map { scrolledToMessageId, topVisibleMessageRange -> PinnedReferenceMessage? in
|
||||
if let topVisibleMessageRange, topVisibleMessageRange.isLoading {
|
||||
return .loading
|
||||
}
|
||||
|
||||
let bottomVisibleMessage = topVisibleMessageRange?.lowerBound.id
|
||||
let topVisibleMessage = topVisibleMessageRange?.upperBound.id
|
||||
|
||||
if let scrolledToMessageId = scrolledToMessageId {
|
||||
if let topVisibleMessage, let bottomVisibleMessage {
|
||||
if scrolledToMessageId.allowedReplacementDirection.contains(.up) && topVisibleMessage < scrolledToMessageId.id {
|
||||
return .ready(PinnedReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||
}
|
||||
}
|
||||
return .ready(PinnedReferenceMessage.Loaded(id: scrolledToMessageId.id, minId: scrolledToMessageId.id, isScrolled: true))
|
||||
} else if let topVisibleMessage, let bottomVisibleMessage {
|
||||
return .ready(PinnedReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static func topPinnedScrollMessage(context: AccountContext, chatLocation: ChatLocation, historyNode: ChatHistoryListNodeImpl, scrolledToMessageId: Signal<ScrolledToMessageId?, NoError>) -> Signal<ChatPinnedMessage?, NoError> {
|
||||
//TODO:release move to ContentData
|
||||
let loadState: Signal<Bool, NoError> = historyNode.historyState.get()
|
||||
|> map { state -> Bool in
|
||||
switch state {
|
||||
case .loading:
|
||||
|
|
@ -6049,12 +6001,28 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|> distinctUntilChanged
|
||||
|
||||
switch self.chatLocation {
|
||||
let referenceMessage = self.topPinnedScrollReferenceMessage(historyNode: historyNode, scrolledToMessageId: scrolledToMessageId)
|
||||
|
||||
return loadState
|
||||
|> mapToSignal { loadState in
|
||||
if !loadState {
|
||||
return .single(nil)
|
||||
} else {
|
||||
return ChatControllerImpl.topPinnedMessageSignal(context: context, chatLocation: chatLocation, referenceMessage: referenceMessage)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static func topPinnedMessageSignal(context: AccountContext, chatLocation: ChatLocation, referenceMessage: Signal<PinnedReferenceMessage?, NoError>?) -> Signal<ChatPinnedMessage?, NoError> {
|
||||
var pinnedPeerId: EnginePeer.Id?
|
||||
let threadId = chatLocation.threadId
|
||||
|
||||
switch chatLocation {
|
||||
case let .peer(id):
|
||||
pinnedPeerId = id
|
||||
case let .replyThread(message):
|
||||
if message.isForumPost {
|
||||
pinnedPeerId = self.chatLocation.peerId
|
||||
pinnedPeerId = chatLocation.peerId
|
||||
}
|
||||
default:
|
||||
break
|
||||
|
|
@ -6063,51 +6031,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
if let peerId = pinnedPeerId {
|
||||
let topPinnedMessage: Signal<ChatPinnedMessage?, NoError>
|
||||
|
||||
enum ReferenceMessage {
|
||||
struct Loaded {
|
||||
var id: MessageId
|
||||
var minId: MessageId
|
||||
var isScrolled: Bool
|
||||
}
|
||||
|
||||
case ready(Loaded)
|
||||
case loading
|
||||
}
|
||||
|
||||
let referenceMessage: Signal<ReferenceMessage?, NoError>
|
||||
if latest {
|
||||
referenceMessage = .single(nil)
|
||||
} else {
|
||||
referenceMessage = combineLatest(
|
||||
queue: Queue.mainQueue(),
|
||||
self.scrolledToMessageId.get(),
|
||||
self.chatDisplayNode.historyNode.topVisibleMessageRange.get()
|
||||
)
|
||||
|> map { scrolledToMessageId, topVisibleMessageRange -> ReferenceMessage? in
|
||||
if let topVisibleMessageRange = topVisibleMessageRange, topVisibleMessageRange.isLoading {
|
||||
return .loading
|
||||
}
|
||||
|
||||
let bottomVisibleMessage = topVisibleMessageRange?.lowerBound.id
|
||||
let topVisibleMessage = topVisibleMessageRange?.upperBound.id
|
||||
|
||||
if let scrolledToMessageId = scrolledToMessageId {
|
||||
if let topVisibleMessage, let bottomVisibleMessage {
|
||||
if scrolledToMessageId.allowedReplacementDirection.contains(.up) && topVisibleMessage < scrolledToMessageId.id {
|
||||
return .ready(ReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||
}
|
||||
}
|
||||
return .ready(ReferenceMessage.Loaded(id: scrolledToMessageId.id, minId: scrolledToMessageId.id, isScrolled: true))
|
||||
} else if let topVisibleMessage, let bottomVisibleMessage {
|
||||
return .ready(ReferenceMessage.Loaded(id: topVisibleMessage, minId: bottomVisibleMessage, isScrolled: false))
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let context = self.context
|
||||
|
||||
func pinnedHistorySignal(anchorMessageId: MessageId?, count: Int) -> Signal<ChatHistoryViewUpdate, NoError> {
|
||||
let location: ChatHistoryLocation
|
||||
if let anchorMessageId = anchorMessageId {
|
||||
|
|
@ -6183,36 +6106,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
let adjustedReplyHistory: Signal<PinnedHistory, NoError>
|
||||
if latest {
|
||||
adjustedReplyHistory = pinnedHistorySignal(anchorMessageId: nil, count: loadCount)
|
||||
|> map { view -> PinnedHistory in
|
||||
switch view {
|
||||
case .Loading:
|
||||
return PinnedHistory(messages: [], totalCount: 0)
|
||||
case let .HistoryView(viewValue, _, _, _, _, _, _):
|
||||
var messages: [PinnedHistory.PinnedMessage] = []
|
||||
var totalCount = viewValue.entries.count
|
||||
for i in 0 ..< viewValue.entries.count {
|
||||
let index: Int
|
||||
if !viewValue.holeEarlier && viewValue.earlierId == nil {
|
||||
index = i
|
||||
} else if let location = viewValue.entries[i].location {
|
||||
index = location.index
|
||||
totalCount = location.count
|
||||
} else {
|
||||
index = i
|
||||
}
|
||||
messages.append(PinnedHistory.PinnedMessage(
|
||||
message: viewValue.entries[i].message,
|
||||
index: index
|
||||
))
|
||||
}
|
||||
return PinnedHistory(messages: messages, totalCount: totalCount)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if let referenceMessage {
|
||||
adjustedReplyHistory = (Signal<PinnedHistory, NoError> { subscriber in
|
||||
var referenceMessageValue: ReferenceMessage?
|
||||
var referenceMessageValue: PinnedReferenceMessage?
|
||||
var view: ChatHistoryViewUpdate?
|
||||
|
||||
let updateState: () -> Void = {
|
||||
|
|
@ -6294,19 +6190,41 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|> runOn(.mainQueue()))
|
||||
|> restart
|
||||
} else {
|
||||
adjustedReplyHistory = pinnedHistorySignal(anchorMessageId: nil, count: loadCount)
|
||||
|> map { view -> PinnedHistory in
|
||||
switch view {
|
||||
case .Loading:
|
||||
return PinnedHistory(messages: [], totalCount: 0)
|
||||
case let .HistoryView(viewValue, _, _, _, _, _, _):
|
||||
var messages: [PinnedHistory.PinnedMessage] = []
|
||||
var totalCount = viewValue.entries.count
|
||||
for i in 0 ..< viewValue.entries.count {
|
||||
let index: Int
|
||||
if !viewValue.holeEarlier && viewValue.earlierId == nil {
|
||||
index = i
|
||||
} else if let location = viewValue.entries[i].location {
|
||||
index = location.index
|
||||
totalCount = location.count
|
||||
} else {
|
||||
index = i
|
||||
}
|
||||
messages.append(PinnedHistory.PinnedMessage(
|
||||
message: viewValue.entries[i].message,
|
||||
index: index
|
||||
))
|
||||
}
|
||||
return PinnedHistory(messages: messages, totalCount: totalCount)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
topPinnedMessage = combineLatest(queue: .mainQueue(),
|
||||
adjustedReplyHistory,
|
||||
topMessage,
|
||||
referenceMessage,
|
||||
loadState
|
||||
referenceMessage ?? .single(nil)
|
||||
)
|
||||
|> map { pinnedMessages, topMessage, referenceMessage, loadState -> ChatPinnedMessage? in
|
||||
if !loadState {
|
||||
return nil
|
||||
}
|
||||
|
||||
|> map { pinnedMessages, topMessage, referenceMessage -> ChatPinnedMessage? in
|
||||
var message: ChatPinnedMessage?
|
||||
|
||||
let topMessageId: MessageId
|
||||
|
|
@ -6580,12 +6498,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
})
|
||||
}
|
||||
|
||||
if !self.didSetup3dTouch {
|
||||
self.didSetup3dTouch = true
|
||||
if #available(iOSApplicationExtension 11.0, iOS 11.0, *) {
|
||||
let dropInteraction = UIDropInteraction(delegate: self)
|
||||
self.chatDisplayNode.view.addInteraction(dropInteraction)
|
||||
}
|
||||
if !self.didSetupDropToPaste {
|
||||
self.didSetupDropToPaste = true
|
||||
let dropInteraction = UIDropInteraction(delegate: self)
|
||||
self.chatDisplayNode.view.addInteraction(dropInteraction)
|
||||
}
|
||||
|
||||
if !self.checkedPeerChatServiceActions {
|
||||
|
|
@ -7220,7 +7136,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
if let button = self.rightNavigationButton {
|
||||
if case .standard(.previewing) = self.mode {
|
||||
self.navigationButtonAction(button.action)
|
||||
} else if case let .peer(peerId) = self.chatLocation, case .openChatInfo(expandAvatar: true, _) = button.action, let storyStats = self.storyStats, storyStats.unseenCount != 0, let avatarNode = self.avatarNode {
|
||||
} else if case let .peer(peerId) = self.chatLocation, case .openChatInfo(expandAvatar: true, _) = button.action, let storyStats = self.contentData?.state.storyStats, storyStats.unseenCount != 0, let avatarNode = self.avatarNode {
|
||||
self.openStories(peerId: peerId, avatarHeaderNode: nil, avatarNode: avatarNode.avatarNode)
|
||||
} else {
|
||||
self.navigationButtonAction(button.action)
|
||||
|
|
@ -8725,7 +8641,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
guard let self else {
|
||||
return
|
||||
}
|
||||
let disposable = openUserGeneratedUrl(context: self.context, peerId: self.peerView?.peerId, url: url, concealed: concealed, skipUrlAuth: skipUrlAuth, skipConcealedAlert: skipConcealedAlert, present: { [weak self] c in
|
||||
let disposable = openUserGeneratedUrl(context: self.context, peerId: self.contentData?.state.peerView?.peerId, url: url, concealed: concealed, skipUrlAuth: skipUrlAuth, skipConcealedAlert: skipConcealedAlert, present: { [weak self] c in
|
||||
self?.present(c, in: .window(.root))
|
||||
}, openResolved: { [weak self] resolved in
|
||||
self?.openResolved(result: resolved, sourceMessageId: message?.id, progress: progress, forceExternal: forceExternal, concealed: concealed, commit: commit)
|
||||
|
|
@ -8805,7 +8721,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
public func beginReportSelection(reason: NavigateToChatControllerParams.ReportReason) {
|
||||
self.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedReportReason((reason.title, reason.option, reason.message)).updatedInterfaceState { $0.withUpdatedSelectedMessages([]) } })
|
||||
self.updateChatPresentationInterfaceState(animated: true, interactive: true, { $0.updatedReportReason(ChatPresentationInterfaceState.ReportReasonData(title: reason.title, option: reason.option, message: reason.message)).updatedInterfaceState { $0.withUpdatedSelectedMessages([]) } })
|
||||
}
|
||||
|
||||
func displayMediaRecordingTooltip() {
|
||||
|
|
@ -8983,7 +8899,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
guard let rect = self.chatDisplayNode.frameForEmojiButton(), self.effectiveNavigationController?.topViewController === self else {
|
||||
return
|
||||
}
|
||||
guard let peerId = self.chatLocation.peerId, let emojiPack = (self.peerView?.cachedData as? CachedChannelData)?.emojiPack, let thumbnailFileId = emojiPack.thumbnailFileId else {
|
||||
guard let peerId = self.chatLocation.peerId, let emojiPack = (self.contentData?.state.peerView?.cachedData as? CachedChannelData)?.emojiPack, let thumbnailFileId = emojiPack.thumbnailFileId else {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -9038,7 +8954,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
guard !self.didDisplayBirthdayTooltip else {
|
||||
return
|
||||
}
|
||||
if let birthday = (self.peerView?.cachedData as? CachedUserData)?.birthday {
|
||||
if let birthday = (self.contentData?.state.peerView?.cachedData as? CachedUserData)?.birthday {
|
||||
PeerInfoScreenImpl.preloadBirthdayAnimations(context: self.context, birthday: birthday)
|
||||
}
|
||||
guard let rect = self.chatDisplayNode.frameForGiftButton(), self.effectiveNavigationController?.topViewController === self, let peer = self.presentationInterfaceState.renderedPeer?.peer.flatMap({ EnginePeer($0) }) else {
|
||||
|
|
@ -9282,34 +9198,6 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
})
|
||||
}
|
||||
|
||||
func updateReminderActivity() {
|
||||
if self.isReminderActivityEnabled && false {
|
||||
if #available(iOS 9.0, *) {
|
||||
if self.reminderActivity == nil, case let .peer(peerId) = self.chatLocation, let peer = self.presentationInterfaceState.renderedPeer?.chatMainPeer {
|
||||
let reminderActivity = NSUserActivity(activityType: "RemindAboutChatIntent")
|
||||
self.reminderActivity = reminderActivity
|
||||
if peer is TelegramGroup {
|
||||
reminderActivity.title = self.presentationData.strings.Activity_RemindAboutGroup(EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)).string
|
||||
} else if let channel = peer as? TelegramChannel {
|
||||
if case .broadcast = channel.info {
|
||||
reminderActivity.title = self.presentationData.strings.Activity_RemindAboutChannel(EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)).string
|
||||
} else {
|
||||
reminderActivity.title = self.presentationData.strings.Activity_RemindAboutGroup(EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)).string
|
||||
}
|
||||
} else {
|
||||
reminderActivity.title = self.presentationData.strings.Activity_RemindAboutUser(EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)).string
|
||||
}
|
||||
reminderActivity.userInfo = ["peerId": peerId.toInt64(), "peerTitle": EnginePeer(peer).displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder)]
|
||||
reminderActivity.isEligibleForHandoff = true
|
||||
reminderActivity.becomeCurrent()
|
||||
}
|
||||
}
|
||||
} else if let reminderActivity = self.reminderActivity {
|
||||
self.reminderActivity = nil
|
||||
reminderActivity.invalidate()
|
||||
}
|
||||
}
|
||||
|
||||
func updateSlowmodeStatus() {
|
||||
if let slowmodeState = self.presentationInterfaceState.slowmodeState, case let .timestamp(slowmodeActiveUntilTimestamp) = slowmodeState.variant {
|
||||
let timestamp = Int32(Date().timeIntervalSince1970)
|
||||
|
|
@ -9779,7 +9667,10 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
func updateNextChannelToReadVisibility() {
|
||||
self.chatDisplayNode.historyNode.offerNextChannelToRead = self.offerNextChannelToRead && self.presentationInterfaceState.interfaceState.selectionState == nil
|
||||
guard let contentData = self.contentData else {
|
||||
return
|
||||
}
|
||||
self.chatDisplayNode.historyNode.offerNextChannelToRead = contentData.state.offerNextChannelToRead && self.presentationInterfaceState.interfaceState.selectionState == nil
|
||||
}
|
||||
|
||||
func displayGiveawayStatusInfo(messageId: EngineMessage.Id, giveawayInfo: PremiumGiveawayInfo) {
|
||||
|
|
@ -9816,7 +9707,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
var currentChatSwitchDirection: ChatControllerAnimateInnerChatSwitchDirection?
|
||||
|
||||
public func updateChatLocationThread(threadId: Int64?, animationDirection: ChatControllerAnimateInnerChatSwitchDirection? = nil) {
|
||||
if self.isUpdatingChatLocationThread {
|
||||
/*if self.isUpdatingChatLocationThread {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
@ -9832,6 +9723,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
|
||||
let navigationSnapshot = self.chatTitleView?.prepareSnapshotState()
|
||||
|
||||
//let historyNode = self.chatDisplayNode.createHistoryNodeForChatLocation(chatLocation: self.chatLocation, chatLocationContextHolder: )
|
||||
|
||||
let rightBarButtonItemSnapshots: [(UIView, CGRect)] = (self.navigationItem.rightBarButtonItems ?? []).compactMap { item -> (UIView, CGRect)? in
|
||||
guard let view = item.customDisplayNode?.view, let snapshotView = view.snapshotView(afterScreenUpdates: false) else {
|
||||
return nil
|
||||
|
|
@ -9866,7 +9759,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
let isReady = Promise<Bool>()
|
||||
self.reloadChatLocation(chatLocation: updatedChatLocation, isReady: isReady)
|
||||
let chatLocationContextHolder = Atomic<ChatLocationContextHolder?>(value: nil)
|
||||
self.reloadChatLocation(chatLocation: updatedChatLocation, chatLocationContextHolder: chatLocationContextHolder, historyNode: historyNode, isReady: isReady)
|
||||
|
||||
self.isUpdatingChatLocationThread = true
|
||||
self.updateChatLocationThreadDisposable?.dispose()
|
||||
|
|
@ -9924,7 +9818,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
}
|
||||
|
||||
self.currentChatSwitchDirection = nil
|
||||
})
|
||||
})*/
|
||||
}
|
||||
|
||||
public var contentContainerNode: ASDisplayNode {
|
||||
|
|
|
|||
2197
submodules/TelegramUI/Sources/ChatControllerContentData.swift
Normal file
2197
submodules/TelegramUI/Sources/ChatControllerContentData.swift
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -314,6 +314,8 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
|
||||
private var loadMoreSearchResultsDisposable: Disposable?
|
||||
|
||||
let adMessagesContext: AdMessagesHistoryContext?
|
||||
|
||||
private var isLoadingValue: Bool = false
|
||||
private var isLoadingEarlier: Bool = false
|
||||
private func updateIsLoading(isLoading: Bool, earlier: Bool, animated: Bool) {
|
||||
|
|
@ -667,9 +669,26 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
}
|
||||
|
||||
self.controllerInteraction.chatIsRotated = historyNodeRotated
|
||||
|
||||
var displayAdPeer: PeerId?
|
||||
if !isChatPreview {
|
||||
switch subject {
|
||||
case .none, .message:
|
||||
if case let .peer(peerId) = chatLocation {
|
||||
displayAdPeer = peerId
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
if let displayAdPeer {
|
||||
self.adMessagesContext = context.engine.messages.adMessages(peerId: displayAdPeer)
|
||||
} else {
|
||||
self.adMessagesContext = nil
|
||||
}
|
||||
|
||||
var getMessageTransitionNode: (() -> ChatMessageTransitionNodeImpl?)?
|
||||
self.historyNode = ChatHistoryListNodeImpl(context: context, updatedPresentationData: controller?.updatedPresentationData ?? (context.sharedContext.currentPresentationData.with({ $0 }), context.sharedContext.presentationData), chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, tag: nil, source: source, subject: subject, controllerInteraction: controllerInteraction, selectedMessages: self.selectedMessagesPromise.get(), rotated: historyNodeRotated, isChatPreview: isChatPreview, messageTransitionNode: {
|
||||
self.historyNode = ChatHistoryListNodeImpl(context: context, updatedPresentationData: controller?.updatedPresentationData ?? (context.sharedContext.currentPresentationData.with({ $0 }), context.sharedContext.presentationData), chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, adMessagesContext: self.adMessagesContext, tag: nil, source: source, subject: subject, controllerInteraction: controllerInteraction, selectedMessages: self.selectedMessagesPromise.get(), rotated: historyNodeRotated, isChatPreview: isChatPreview, messageTransitionNode: {
|
||||
return getMessageTransitionNode?()
|
||||
})
|
||||
|
||||
|
|
@ -1371,11 +1390,11 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
/*#if DEBUG
|
||||
if "".isEmpty {
|
||||
hasTranslationPanel = true
|
||||
}
|
||||
#endif
|
||||
#endif*/
|
||||
|
||||
if hasTranslationPanel {
|
||||
let translationPanelNode: ChatTranslationPanelNode
|
||||
|
|
@ -4330,7 +4349,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
|
||||
let effectiveInputText = expandedInputStateAttributedString(effectivePresentationInterfaceState.interfaceState.composeInputState.inputText)
|
||||
|
||||
let peerSpecificEmojiPack = (self.controller?.peerView?.cachedData as? CachedChannelData)?.emojiPack
|
||||
let peerSpecificEmojiPack = (self.controller?.contentData?.state.peerView?.cachedData as? CachedChannelData)?.emojiPack
|
||||
|
||||
var inlineStickers: [MediaId: Media] = [:]
|
||||
var firstLockedPremiumEmoji: TelegramMediaFile?
|
||||
|
|
@ -5041,6 +5060,27 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
return leftIndex < rightIndex
|
||||
}
|
||||
|
||||
func createHistoryNodeForChatLocation(chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>) -> ChatHistoryListNodeImpl {
|
||||
let historyNode = ChatHistoryListNodeImpl(
|
||||
context: self.context,
|
||||
updatedPresentationData: self.controller?.updatedPresentationData ?? (self.context.sharedContext.currentPresentationData.with({ $0 }), self.context.sharedContext.presentationData),
|
||||
chatLocation: chatLocation,
|
||||
chatLocationContextHolder: chatLocationContextHolder,
|
||||
adMessagesContext: self.adMessagesContext,
|
||||
tag: nil,
|
||||
source: .default,
|
||||
subject: nil,
|
||||
controllerInteraction: self.controllerInteraction,
|
||||
selectedMessages: self.selectedMessagesPromise.get(),
|
||||
rotated: self.controllerInteraction.chatIsRotated,
|
||||
isChatPreview: false,
|
||||
messageTransitionNode: {
|
||||
return nil
|
||||
}
|
||||
)
|
||||
return historyNode
|
||||
}
|
||||
|
||||
func updateChatLocation(chatLocation: ChatLocation, transition: ContainedViewLayoutTransition, tabSwitchDirection: ChatControllerAnimateInnerChatSwitchDirection?) {
|
||||
if chatLocation == self.chatLocation {
|
||||
return
|
||||
|
|
@ -5053,6 +5093,7 @@ class ChatControllerNode: ASDisplayNode, ASScrollViewDelegate {
|
|||
updatedPresentationData: self.controller?.updatedPresentationData ?? (self.context.sharedContext.currentPresentationData.with({ $0 }), self.context.sharedContext.presentationData),
|
||||
chatLocation: chatLocation,
|
||||
chatLocationContextHolder: self.chatLocationContextHolder,
|
||||
adMessagesContext: self.adMessagesContext,
|
||||
tag: nil,
|
||||
source: .default,
|
||||
subject: nil,
|
||||
|
|
|
|||
|
|
@ -850,7 +850,7 @@ extension ChatControllerImpl {
|
|||
let controller = legacyAttachmentMenu(
|
||||
context: strongSelf.context,
|
||||
peer: strongSelf.presentationInterfaceState.renderedPeer?.peer,
|
||||
threadTitle: strongSelf.threadInfo?.title, chatLocation: strongSelf.chatLocation,
|
||||
threadTitle: strongSelf.contentData?.state.threadInfo?.title, chatLocation: strongSelf.chatLocation,
|
||||
editMediaOptions: menuEditMediaOptions,
|
||||
addingMedia: editMediaOptions == nil,
|
||||
saveEditedPhotos: settings.storeEditedPhotos,
|
||||
|
|
@ -1203,14 +1203,14 @@ extension ChatControllerImpl {
|
|||
isScheduledMessages = true
|
||||
}
|
||||
var paidMediaAllowed = false
|
||||
if let cachedData = self.peerView?.cachedData as? CachedChannelData, cachedData.flags.contains(.paidMediaAllowed) {
|
||||
if let cachedData = self.contentData?.state.peerView?.cachedData as? CachedChannelData, cachedData.flags.contains(.paidMediaAllowed) {
|
||||
paidMediaAllowed = true
|
||||
}
|
||||
let controller = MediaPickerScreenImpl(
|
||||
context: self.context,
|
||||
updatedPresentationData: self.updatedPresentationData,
|
||||
peer: (self.presentationInterfaceState.renderedPeer?.peer).flatMap(EnginePeer.init),
|
||||
threadTitle: self.threadInfo?.title,
|
||||
threadTitle: self.contentData?.state.threadInfo?.title,
|
||||
chatLocation: self.chatLocation,
|
||||
isScheduledMessages: isScheduledMessages,
|
||||
bannedSendPhotos: bannedSendPhotos,
|
||||
|
|
@ -1369,7 +1369,7 @@ extension ChatControllerImpl {
|
|||
slowModeEnabled = true
|
||||
}
|
||||
|
||||
let _ = legacyAssetPicker(context: strongSelf.context, presentationData: strongSelf.presentationData, editingMedia: editingMedia, fileMode: fileMode, peer: peer, threadTitle: strongSelf.threadInfo?.title, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, selectionLimit: selectionLimit).startStandalone(next: { generator in
|
||||
let _ = legacyAssetPicker(context: strongSelf.context, presentationData: strongSelf.presentationData, editingMedia: editingMedia, fileMode: fileMode, peer: peer, threadTitle: strongSelf.contentData?.state.threadInfo?.title, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, selectionLimit: selectionLimit).startStandalone(next: { generator in
|
||||
if let strongSelf = self {
|
||||
let legacyController = LegacyController(presentation: fileMode ? .navigation : .custom, theme: strongSelf.presentationData.theme, initialLayout: strongSelf.validLayout)
|
||||
legacyController.navigationPresentation = .modal
|
||||
|
|
|
|||
|
|
@ -20,6 +20,6 @@ public extension ChatControllerImpl {
|
|||
if let foundItemNode, let message = foundItemNode.item?.message {
|
||||
self.chatDisplayNode.historyNode.setCurrentDeleteAnimationCorrelationIds(Set([message.stableId]))
|
||||
}
|
||||
self.chatDisplayNode.historyNode.adMessagesContext?.remove(opaqueId: opaqueId)
|
||||
self.chatDisplayNode.adMessagesContext?.remove(opaqueId: opaqueId)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
|||
private(set) var tag: HistoryViewInputTag?
|
||||
private let controllerInteraction: ChatControllerInteraction
|
||||
private let selectedMessages: Signal<Set<MessageId>?, NoError>
|
||||
private let messageTransitionNode: () -> ChatMessageTransitionNodeImpl?
|
||||
var messageTransitionNode: () -> ChatMessageTransitionNodeImpl?
|
||||
private let mode: ChatHistoryListMode
|
||||
|
||||
private var enableUnreadAlignment: Bool = true
|
||||
|
|
@ -707,7 +707,7 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
|||
var openNextChannelToRead: ((EnginePeer, (id: Int64, data: MessageHistoryThreadData)?, TelegramEngine.NextUnreadChannelLocation) -> Void)?
|
||||
private var contentInsetAnimator: DisplayLinkAnimator?
|
||||
|
||||
let adMessagesContext: AdMessagesHistoryContext?
|
||||
private let adMessagesContext: AdMessagesHistoryContext?
|
||||
private var adMessagesDisposable: Disposable?
|
||||
private var preloadAdPeerName: String?
|
||||
private let preloadAdPeerDisposable = MetaDisposable()
|
||||
|
|
@ -753,7 +753,7 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
|||
|
||||
private let initTimestamp: Double
|
||||
|
||||
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tag: HistoryViewInputTag?, source: ChatHistoryListSource, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles, rotated: Bool = false, isChatPreview: Bool, messageTransitionNode: @escaping () -> ChatMessageTransitionNodeImpl?) {
|
||||
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, adMessagesContext: AdMessagesHistoryContext?, tag: HistoryViewInputTag?, source: ChatHistoryListSource, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles, rotated: Bool = false, isChatPreview: Bool, messageTransitionNode: @escaping () -> ChatMessageTransitionNodeImpl?) {
|
||||
self.initTimestamp = CFAbsoluteTimeGetCurrent()
|
||||
|
||||
var tag = tag
|
||||
|
|
@ -788,21 +788,10 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
|||
|
||||
self.prefetchManager = InChatPrefetchManager(context: context)
|
||||
|
||||
var displayAdPeer: PeerId?
|
||||
if !isChatPreview {
|
||||
switch subject {
|
||||
case .none, .message:
|
||||
if case let .peer(peerId) = chatLocation {
|
||||
displayAdPeer = peerId
|
||||
}
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
self.adMessagesContext = adMessagesContext
|
||||
var adMessages: Signal<(interPostInterval: Int32?, messages: [Message]), NoError>
|
||||
if case .bubbles = mode, let peerId = displayAdPeer {
|
||||
let adMessagesContext = context.engine.messages.adMessages(peerId: peerId)
|
||||
self.adMessagesContext = adMessagesContext
|
||||
if case .bubbles = mode, let adMessagesContext {
|
||||
let peerId = adMessagesContext.peerId
|
||||
if peerId.namespace == Namespaces.Peer.CloudUser {
|
||||
adMessages = .single((nil, []))
|
||||
} else {
|
||||
|
|
@ -891,7 +880,6 @@ public final class ChatHistoryListNodeImpl: ListView, ChatHistoryNode, ChatHisto
|
|||
}
|
||||
}
|
||||
} else {
|
||||
self.adMessagesContext = nil
|
||||
adMessages = .single((nil, []))
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -153,8 +153,6 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat
|
|||
displayActionsPanel = true
|
||||
} else if peerStatusSettings.contains(.canShareContact) {
|
||||
displayActionsPanel = true
|
||||
} else if contactStatus.canReportIrrelevantLocation && peerStatusSettings.contains(.canReportIrrelevantGeoLocation) {
|
||||
displayActionsPanel = true
|
||||
} else if peerStatusSettings.contains(.suggestAddMembers) {
|
||||
displayActionsPanel = true
|
||||
}
|
||||
|
|
@ -232,6 +230,10 @@ func titlePanelForChatPresentationInterfaceState(_ chatPresentationInterfaceStat
|
|||
}
|
||||
|
||||
func titleTopicsPanelForChatPresentationInterfaceState(_ chatPresentationInterfaceState: ChatPresentationInterfaceState, context: AccountContext, currentPanel: ChatTitleAccessoryPanelNode?, controllerInteraction: ChatControllerInteraction?, interfaceInteraction: ChatPanelInterfaceInteraction?, force: Bool) -> ChatTopicListTitleAccessoryPanelNode? {
|
||||
//TODO:release
|
||||
if "".isEmpty {
|
||||
return nil
|
||||
}
|
||||
if let channel = chatPresentationInterfaceState.renderedPeer?.peer as? TelegramChannel, channel.isForumOrMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = chatPresentationInterfaceState.renderedPeer?.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.adminRights != nil, chatPresentationInterfaceState.search == nil {
|
||||
let topicListDisplayMode = chatPresentationInterfaceState.topicListDisplayMode ?? .top
|
||||
if case .top = topicListDisplayMode, let peerId = chatPresentationInterfaceState.chatLocation.peerId {
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ private enum ChatReportPeerTitleButton: Equatable {
|
|||
case shareMyPhoneNumber
|
||||
case reportSpam
|
||||
case reportUserSpam
|
||||
case reportIrrelevantGeoLocation
|
||||
case unarchive
|
||||
case addMembers
|
||||
case restartTopic
|
||||
|
|
@ -48,8 +47,6 @@ private enum ChatReportPeerTitleButton: Equatable {
|
|||
return strings.Conversation_ReportSpamAndLeave
|
||||
case .reportUserSpam:
|
||||
return strings.Conversation_ReportSpam
|
||||
case .reportIrrelevantGeoLocation:
|
||||
return strings.Conversation_ReportGroupLocation
|
||||
case .unarchive:
|
||||
return strings.Conversation_Unarchive
|
||||
case .addMembers:
|
||||
|
|
@ -125,8 +122,6 @@ private func peerButtons(_ state: ChatPresentationInterfaceState) -> [ChatReport
|
|||
if case .peer = state.chatLocation {
|
||||
if let contactStatus = state.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.suggestAddMembers) {
|
||||
buttons.append(.addMembers)
|
||||
} else if let contactStatus = state.contactStatus, contactStatus.canReportIrrelevantLocation, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.canReportIrrelevantGeoLocation) {
|
||||
buttons.append(.reportIrrelevantGeoLocation)
|
||||
} else if let contactStatus = state.contactStatus, let peerStatusSettings = contactStatus.peerStatusSettings, peerStatusSettings.contains(.autoArchived) {
|
||||
buttons.append(.reportUserSpam)
|
||||
buttons.append(.unarchive)
|
||||
|
|
@ -791,8 +786,6 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
|
|||
self.interfaceInteraction?.presentInviteMembers()
|
||||
case .addContact:
|
||||
self.interfaceInteraction?.presentPeerContact()
|
||||
case .reportIrrelevantGeoLocation:
|
||||
self.interfaceInteraction?.reportPeerIrrelevantGeoLocation()
|
||||
case .restartTopic:
|
||||
self.interfaceInteraction?.restartTopic()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, ASGestu
|
|||
self.isGlobalSearch = false
|
||||
}
|
||||
|
||||
self.historyNode = ChatHistoryListNodeImpl(context: context, updatedPresentationData: (context.sharedContext.currentPresentationData.with({ $0 }), context.sharedContext.presentationData), chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, tag: .tag(tagMask), source: source, subject: .message(id: .id(initialMessageId), highlight: ChatControllerSubject.MessageHighlight(quote: nil), timecode: nil, setupReply: false), controllerInteraction: self.controllerInteraction, selectedMessages: .single(nil), mode: .list(search: false, reversed: self.currentIsReversed, reverseGroups: !self.currentIsReversed, displayHeaders: .none, hintLinks: false, isGlobalSearch: self.isGlobalSearch), isChatPreview: false, messageTransitionNode: { return nil })
|
||||
self.historyNode = ChatHistoryListNodeImpl(context: context, updatedPresentationData: (context.sharedContext.currentPresentationData.with({ $0 }), context.sharedContext.presentationData), chatLocation: chatLocation, chatLocationContextHolder: chatLocationContextHolder, adMessagesContext: nil, tag: .tag(tagMask), source: source, subject: .message(id: .id(initialMessageId), highlight: ChatControllerSubject.MessageHighlight(quote: nil), timecode: nil, setupReply: false), controllerInteraction: self.controllerInteraction, selectedMessages: .single(nil), mode: .list(search: false, reversed: self.currentIsReversed, reverseGroups: !self.currentIsReversed, displayHeaders: .none, hintLinks: false, isGlobalSearch: self.isGlobalSearch), isChatPreview: false, messageTransitionNode: { return nil })
|
||||
self.historyNode.clipsToBounds = true
|
||||
|
||||
super.init()
|
||||
|
|
@ -576,7 +576,7 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, ASGestu
|
|||
}
|
||||
|
||||
let chatLocationContextHolder = Atomic<ChatLocationContextHolder?>(value: nil)
|
||||
let historyNode = ChatHistoryListNodeImpl(context: self.context, updatedPresentationData: (self.context.sharedContext.currentPresentationData.with({ $0 }), self.context.sharedContext.presentationData), chatLocation: self.chatLocation, chatLocationContextHolder: chatLocationContextHolder, tag: .tag(tagMask), source: .default, subject: .message(id: .id(messageId), highlight: ChatControllerSubject.MessageHighlight(quote: nil), timecode: nil, setupReply: false), controllerInteraction: self.controllerInteraction, selectedMessages: .single(nil), mode: .list(search: false, reversed: self.currentIsReversed, reverseGroups: !self.currentIsReversed, displayHeaders: .none, hintLinks: false, isGlobalSearch: self.isGlobalSearch), isChatPreview: false, messageTransitionNode: { return nil })
|
||||
let historyNode = ChatHistoryListNodeImpl(context: self.context, updatedPresentationData: (self.context.sharedContext.currentPresentationData.with({ $0 }), self.context.sharedContext.presentationData), chatLocation: self.chatLocation, chatLocationContextHolder: chatLocationContextHolder, adMessagesContext: nil, tag: .tag(tagMask), source: .default, subject: .message(id: .id(messageId), highlight: ChatControllerSubject.MessageHighlight(quote: nil), timecode: nil, setupReply: false), controllerInteraction: self.controllerInteraction, selectedMessages: .single(nil), mode: .list(search: false, reversed: self.currentIsReversed, reverseGroups: !self.currentIsReversed, displayHeaders: .none, hintLinks: false, isGlobalSearch: self.isGlobalSearch), isChatPreview: false, messageTransitionNode: { return nil })
|
||||
historyNode.clipsToBounds = true
|
||||
historyNode.preloadPages = true
|
||||
historyNode.stackFromBottom = true
|
||||
|
|
|
|||
|
|
@ -2227,6 +2227,7 @@ public final class SharedAccountContextImpl: SharedAccountContext {
|
|||
updatedPresentationData: updatedPresentationData,
|
||||
chatLocation: chatLocation,
|
||||
chatLocationContextHolder: chatLocationContextHolder,
|
||||
adMessagesContext: nil,
|
||||
tag: tag,
|
||||
source: source,
|
||||
subject: subject,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue