From 58f9896a10ae27069a842ea3b23a2b5743758fc8 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 26 Nov 2022 16:16:37 +0400 Subject: [PATCH] Various fixes --- .../Telegram-iOS/Resources/IntroFragment.tgs | Bin 0 -> 64686 bytes Telegram/Telegram-iOS/Resources/QrLoading.tgs | Bin 0 -> 29817 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 11 + .../Sources/AccountContext.swift | 1 + .../Sources/CountriesConfiguration.swift | 26 +++ .../Sources/AttachmentPanel.swift | 2 +- ...orizationSequenceCodeEntryController.swift | 7 + ...ationSequenceCodeEntryControllerNode.swift | 44 +++- .../AuthorizationSequenceController.swift | 5 + ...tionSequenceEmailEntryControllerNode.swift | 8 +- ...tionSequencePhoneEntryControllerNode.swift | 15 +- .../Sources/AuthorizationOptionText.swift | 13 ++ .../Sources/ChatListSearchContainerNode.swift | 2 +- .../ChatListSearchFiltersContainerNode.swift | 2 +- .../Sources/Node/ChatListNodeEntries.swift | 6 +- .../ChatPresentationInterfaceState.swift | 128 ++++++----- ...quenceCountrySelectionControllerNode.swift | 17 +- .../Sources/CountryList.swift | 4 +- .../Display/Source/TextAlertController.swift | 4 +- .../Items/UniversalVideoGalleryItem.swift | 37 ++-- submodules/LocalizedPeerData/BUILD | 1 - .../LocalizedPeerData/Sources/PeerTitle.swift | 10 +- .../Sources/PhoneInputNode.swift | 17 +- submodules/PhoneNumberFormat/BUILD | 2 + .../Sources/PhoneNumbers.swift | 102 +++++++-- .../ChangePhoneNumberCodeController.swift | 6 +- .../Sources/ChangePhoneNumberController.swift | 4 +- .../ChangePhoneNumberControllerNode.swift | 4 +- .../ChangePhoneNumberIntroController.swift | 2 +- .../ConfirmPhoneNumberController.swift | 15 +- .../Sources/SolidRoundedButtonNode.swift | 24 +- submodules/TelegramApi/Sources/Api0.swift | 9 +- submodules/TelegramApi/Sources/Api11.swift | 22 +- submodules/TelegramApi/Sources/Api23.swift | 122 +++------- submodules/TelegramApi/Sources/Api24.swift | 208 ++++++++---------- submodules/TelegramApi/Sources/Api25.swift | 122 ++++++++++ submodules/TelegramApi/Sources/Api29.swift | 30 +++ submodules/TelegramApi/Sources/Api4.swift | 18 +- submodules/TelegramApi/Sources/Api5.swift | 158 ++++--------- submodules/TelegramApi/Sources/Api6.swift | 118 ++++++++++ .../Sources/PresentationCall.swift | 2 +- .../Sources/PresentationCallManager.swift | 2 +- .../ApiUtils/TelegramMediaAction.swift | 2 +- .../Sources/State/AccountState.swift | 4 + .../State/AccountStateManagementUtils.swift | 6 +- .../Sources/State/FetchChatList.swift | 2 +- ...anagedConsumePersonalMessagesActions.swift | 4 +- ...agedSynchronizePinnedChatsOperations.swift | 2 +- .../State/SynchronizePeerReadState.swift | 2 +- .../Sources/State/UpdatesApiUtils.swift | 2 +- .../SyncCore_UnauthorizedAccountState.swift | 69 +++--- .../Peers/ChatListFiltering.swift | 2 +- .../TelegramEngine/Peers/ContactToken.swift | 4 + .../ChatTitleView/Sources/ChatTitleView.swift | 2 +- .../EmojiStatusSelectionComponent.swift | 1 + .../Sources/EmojiPagerContentComponent.swift | 6 + .../Sources/EntityKeyboard.swift | 9 +- .../EntitySearchContentComponent.swift | 11 +- .../Sources/ForumCreateTopicScreen.swift | 8 +- .../Resources/Animations/anim_fragment.json | 1 + .../TelegramUI/Sources/AccountContext.swift | 78 ++++++- .../TelegramUI/Sources/AppDelegate.swift | 6 +- .../TelegramUI/Sources/ChatController.swift | 64 ++++-- .../Sources/ChatEntityKeyboardInputNode.swift | 4 +- .../ChatInterfaceStateInputPanels.swift | 26 ++- .../ChatMessageContactBubbleContentNode.swift | 6 +- .../TelegramUI/Sources/ChatQrCodeScreen.swift | 63 ++++-- .../Sources/CreateGroupController.swift | 2 +- submodules/TelegramUI/Sources/OpenUrl.swift | 7 + .../Sources/PeerInfo/PeerInfoHeaderNode.swift | 4 +- .../Sources/PeerInfo/PeerInfoScreen.swift | 100 +++++---- .../Sources/PeerSelectionControllerNode.swift | 2 +- .../Sources/SharedAccountContext.swift | 2 +- .../WebUI/Sources/WebAppController.swift | 33 --- 74 files changed, 1185 insertions(+), 679 deletions(-) create mode 100644 Telegram/Telegram-iOS/Resources/IntroFragment.tgs create mode 100644 Telegram/Telegram-iOS/Resources/QrLoading.tgs create mode 100644 submodules/AccountContext/Sources/CountriesConfiguration.swift create mode 100644 submodules/TelegramCore/Sources/TelegramEngine/Peers/ContactToken.swift create mode 100644 submodules/TelegramUI/Resources/Animations/anim_fragment.json diff --git a/Telegram/Telegram-iOS/Resources/IntroFragment.tgs b/Telegram/Telegram-iOS/Resources/IntroFragment.tgs new file mode 100644 index 0000000000000000000000000000000000000000..f88338c363f466b1e42b5de6007f24a09ff6aeac GIT binary patch literal 64686 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 BrWpVL literal 0 HcmV?d00001 diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index afcfc75bc9..4ab1393e6b 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -8317,3 +8317,14 @@ Sorry for the inconvenience."; "Stickers.EmojiPackInfoText" = "This message contains **%@** emoji."; "PeerInfo.TopicIconInfoText" = "This topic's icon is from **%@**."; + +"Login.EnterCodeFragmentTitle" = "Enter Code"; +"Login.EnterCodeFragmentText" = "Check the Anonymous Numbers section on **Fragment** to get the code."; +"Login.OpenFragment" = "Open Fragment"; + +"Login.AnonymousNumbers" = "Anonymous Numbers"; + +"Conversation.CantPhoneCallAnonymousNumberError" = "You can't call this phone number."; + +"UserInfo.AnonymousNumberLabel" = "anonymous number"; +"UserInfo.AnonymousNumberInfo" = "This number is not tied to a SIM card and was acquired on [Fragment]()."; diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 82819a11d6..e0f213f3da 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -879,6 +879,7 @@ public protocol AccountContext: AnyObject { var currentLimitsConfiguration: Atomic { get } var currentContentSettings: Atomic { get } var currentAppConfiguration: Atomic { get } + var currentCountriesConfiguration: Atomic { get } var cachedGroupCallContexts: AccountGroupCallContextCache { get } var meshAnimationCache: MeshAnimationCache { get } diff --git a/submodules/AccountContext/Sources/CountriesConfiguration.swift b/submodules/AccountContext/Sources/CountriesConfiguration.swift new file mode 100644 index 0000000000..811304b3a3 --- /dev/null +++ b/submodules/AccountContext/Sources/CountriesConfiguration.swift @@ -0,0 +1,26 @@ +import Foundation +import TelegramCore + +public class CountriesConfiguration { + public let countries: [Country] + public let countriesByPrefix: [String: (Country, Country.CountryCode)] + + public init(countries: [Country]) { + self.countries = countries + + var countriesByPrefix: [String: (Country, Country.CountryCode)] = [:] + for country in countries { + for code in country.countryCodes { + if !code.prefixes.isEmpty { + for prefix in code.prefixes { + countriesByPrefix["\(code.code)\(prefix)"] = (country, code) + } + } else { + countriesByPrefix[code.code] = (country, code) + } + } + } + + self.countriesByPrefix = countriesByPrefix + } +} diff --git a/submodules/AttachmentUI/Sources/AttachmentPanel.swift b/submodules/AttachmentUI/Sources/AttachmentPanel.swift index 9215a25832..2e6b673402 100644 --- a/submodules/AttachmentUI/Sources/AttachmentPanel.swift +++ b/submodules/AttachmentUI/Sources/AttachmentPanel.swift @@ -510,7 +510,7 @@ final class AttachmentPanel: ASDisplayNode, UIScrollViewDelegate { self.makeEntityInputView = makeEntityInputView - self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: chatLocation, subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil) + self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: chatLocation, subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil, isGeneralThreadClosed: nil) self.containerNode = ASDisplayNode() self.containerNode.clipsToBounds = true diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryController.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryController.swift index 8155c2aa82..b769887bd8 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryController.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryController.swift @@ -19,6 +19,7 @@ public final class AuthorizationSequenceCodeEntryController: ViewController { public var loginWithCode: ((String) -> Void)? public var signInWithApple: (() -> Void)? + public var openFragment: ((String) -> Void)? var reset: (() -> Void)? var requestNextOption: (() -> Void)? @@ -93,6 +94,10 @@ public final class AuthorizationSequenceCodeEntryController: ViewController { self?.signInWithApple?() } + self.controllerNode.openFragment = { [weak self] url in + self?.openFragment?(url) + } + self.controllerNode.requestNextOption = { [weak self] in self?.requestNextOption?() } @@ -194,6 +199,8 @@ public final class AuthorizationSequenceCodeEntryController: ViewController { minimalCodeLength = Int(length) case let .email(_, length, _, _, _): minimalCodeLength = Int(length) + case let .fragment(_, length): + minimalCodeLength = Int(length) case .flashCall, .emailSetupRequired: break } diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift index dbab899570..6f12e27e79 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequenceCodeEntryControllerNode.swift @@ -31,6 +31,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF private let dividerNode: AuthorizationDividerNode private var signInWithAppleButton: UIControl? + private let proceedNode: SolidRoundedButtonNode private let codeInputView: CodeInputView private let errorTextNode: ImmediateTextNode @@ -62,6 +63,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF var loginWithCode: ((String) -> Void)? var signInWithApple: (() -> Void)? + var openFragment: ((String) -> Void)? var requestNextOption: (() -> Void)? var requestAnotherOption: (() -> Void)? @@ -134,6 +136,11 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF self.signInWithAppleButton?.isHidden = true (self.signInWithAppleButton as? ASAuthorizationAppleIDButton)?.cornerRadius = 11 } + self.proceedNode = SolidRoundedButtonNode(title: self.strings.Login_OpenFragment, theme: SolidRoundedButtonTheme(backgroundColor: UIColor(rgb: 0x37475a), foregroundColor: .white), height: 50.0, cornerRadius: 11.0, gloss: false) + self.proceedNode.progressType = .embedded + self.proceedNode.isHidden = true + self.proceedNode.iconSpacing = 4.0 + self.proceedNode.animationSize = CGSize(width: 36.0, height: 36.0) super.init() @@ -152,6 +159,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF self.addSubnode(self.animationNode) self.addSubnode(self.dividerNode) self.addSubnode(self.errorTextNode) + self.addSubnode(self.proceedNode) self.codeInputView.updated = { [weak self] in guard let strongSelf = self else { @@ -161,6 +169,9 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF } self.nextOptionButtonNode.addTarget(self, action: #selector(self.nextOptionNodePressed), forControlEvents: .touchUpInside) + self.proceedNode.pressed = { [weak self] in + self?.proceedPressed() + } self.signInWithAppleButton?.addTarget(self, action: #selector(self.signInWithApplePressed), for: .touchUpInside) } @@ -265,6 +276,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF insets.top = layout.statusBarHeight ?? 20.0 var animationName = "IntroMessage" + var animationPlaybackMode: AnimatedStickerPlaybackMode = .once if let codeType = self.codeType { switch codeType { case .missedCall: @@ -274,6 +286,11 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF animationName = "IntroLetter" case .sms: self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_EnterCodeSMSTitle, font: Font.semibold(28.0), textColor: self.theme.list.itemPrimaryTextColor) + case .fragment: + self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_EnterCodeFragmentTitle, font: Font.semibold(28.0), textColor: self.theme.list.itemPrimaryTextColor) + animationName = "IntroFragment" + animationPlaybackMode = .count(3) + self.proceedNode.animation = "anim_fragment" default: self.titleNode.attributedText = NSAttributedString(string: self.strings.Login_EnterCodeTelegramTitle, font: Font.semibold(28.0), textColor: self.theme.list.itemPrimaryTextColor) } @@ -284,13 +301,15 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF if let inputHeight = layout.inputHeight { if let codeType = self.codeType, case .email = codeType { insets.bottom = max(inputHeight, insets.bottom) + } else if let codeType = self.codeType, case .fragment = codeType { + insets.bottom = max(inputHeight, insets.bottom) } else { insets.bottom = max(inputHeight, layout.standardInputHeight) } } if !self.animationNode.visibility { - self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: animationName), width: 256, height: 256, playbackMode: .once, mode: .direct(cachePathPrefix: nil)) + self.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: animationName), width: 256, height: 256, playbackMode: animationPlaybackMode, mode: .direct(cachePathPrefix: nil)) self.animationNode.visibility = true } @@ -301,6 +320,9 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF let currentOptionInfoSize = self.currentOptionInfoNode.measure(CGSize(width: layout.size.width - 48.0, height: CGFloat.greatestFiniteMagnitude)) let nextOptionSize = self.nextOptionTitleNode.updateLayout(CGSize(width: layout.size.width, height: CGFloat.greatestFiniteMagnitude)) + let proceedHeight = self.proceedNode.updateLayout(width: layout.size.width - 48.0, transition: transition) + let proceedSize = CGSize(width: layout.size.width - 48.0, height: proceedHeight) + let codeLength: Int var codePrefix: String = "" switch self.codeType { @@ -321,6 +343,8 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF codeLength = Int(length) case let .email(_, length, _, _, _): codeLength = Int(length) + case let .fragment(_, length): + codeLength = Int(length) case .emailSetupRequired: codeLength = 6 case .none: @@ -390,13 +414,18 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF items.append(AuthorizationLayoutItem(node: self.codeInputView, size: codeFieldSize, spacingBefore: AuthorizationLayoutItemSpacing(weight: 30.0, maxValue: 30.0), spacingAfter: AuthorizationLayoutItemSpacing(weight: 104.0, maxValue: 104.0))) - if self.appleSignInAllowed, let signInWithAppleButton = self.signInWithAppleButton { + let inset: CGFloat = 24.0 + if case .fragment = codeType { + self.proceedNode.isHidden = false + let buttonFrame = CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - proceedSize.width) / 2.0), y: layout.size.height - insets.bottom - proceedSize.height - inset), size: proceedSize) + transition.updateFrame(node: self.proceedNode, frame: buttonFrame) + } else if self.appleSignInAllowed, let signInWithAppleButton = self.signInWithAppleButton { additionalBottomInset = 80.0 self.nextOptionButtonNode.isHidden = true signInWithAppleButton.isHidden = false + self.proceedNode.isHidden = true - let inset: CGFloat = 24.0 let buttonSize = CGSize(width: layout.size.width - inset * 2.0, height: 50.0) transition.updateFrame(view: signInWithAppleButton, frame: CGRect(origin: CGPoint(x: floorToScreenPixels((layout.size.width - buttonSize.width) / 2.0), y: layout.size.height - insets.bottom - buttonSize.height - inset), size: buttonSize)) @@ -405,6 +434,7 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF } else { self.signInWithAppleButton?.isHidden = true self.dividerNode.isHidden = true + self.proceedNode.isHidden = true if case .email = codeType { self.nextOptionButtonNode.isHidden = true @@ -501,6 +531,8 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF codeLength = length case let .email(_, length, _, _, _): codeLength = length + case let .fragment(_, length): + codeLength = length default: break } @@ -535,6 +567,12 @@ final class AuthorizationSequenceCodeEntryControllerNode: ASDisplayNode, UITextF self.requestAnotherOption?() } + @objc func proceedPressed() { + if case let .fragment(url, _) = self.codeType { + self.openFragment?(url) + } + } + @objc func signInWithApplePressed() { self.signInWithApple?() } diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequenceController.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequenceController.swift index aba53912c3..2bd3097765 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequenceController.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequenceController.swift @@ -513,6 +513,11 @@ public final class AuthorizationSequenceController: NavigationController, MFMail authorizationController.performRequests() } } + controller.openFragment = { [weak self] url in + if let strongSelf = self { + strongSelf.sharedContext.applicationBindings.openUrl(url) + } + } controller.updateData(number: formatPhoneNumber(number), email: email, codeType: type, nextType: nextType, timeout: timeout, termsOfService: termsOfService) return controller } diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequenceEmailEntryControllerNode.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequenceEmailEntryControllerNode.swift index 9e70cec9f9..d6814dacf2 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequenceEmailEntryControllerNode.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequenceEmailEntryControllerNode.swift @@ -176,17 +176,13 @@ final class AuthorizationSequenceEmailEntryControllerNode: ASDisplayNode, UIText private func updateButtonsVisibility(transition: ContainedViewLayoutTransition) { if self.currentEmail.isEmpty && self.appleSignInAllowed { transition.updateAlpha(node: self.proceedNode, alpha: 0.0) -// if self.proceedNode.isHidden { - transition.updateAlpha(node: self.dividerNode, alpha: 1.0) -// } + transition.updateAlpha(node: self.dividerNode, alpha: 1.0) if let signInWithAppleButton = self.signInWithAppleButton { transition.updateAlpha(layer: signInWithAppleButton.layer, alpha: 1.0) } } else { transition.updateAlpha(node: self.proceedNode, alpha: 1.0) -// if self.proceedNode.isHidden { - transition.updateAlpha(node: self.dividerNode, alpha: 0.0) -// } + transition.updateAlpha(node: self.dividerNode, alpha: 0.0) if let signInWithAppleButton = self.signInWithAppleButton { transition.updateAlpha(layer: signInWithAppleButton.layer, alpha: 0.0) } diff --git a/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift b/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift index 1f0358fdf0..b0ce85923f 100644 --- a/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift +++ b/submodules/AuthorizationUI/Sources/AuthorizationSequencePhoneEntryControllerNode.swift @@ -125,7 +125,10 @@ private final class PhoneAndCountryNode: ASDisplayNode { } if let (country, _) = AuthorizationSequenceCountrySelectionController.lookupCountryIdByNumber(number, preferredCountries: strongSelf.preferredCountryIdForCode) { let flagString = emojiFlagForISOCountryCode(country.id) - let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(country.id, strings: strongSelf.strings) ?? country.name + var localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(country.id, strings: strongSelf.strings) ?? country.name + if country.id == "FT" { + localizedName = strongSelf.strings.Login_AnonymousNumbers + } strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.list.itemAccentColor, for: []) strongSelf.hasCountry = true @@ -164,7 +167,10 @@ private final class PhoneAndCountryNode: ASDisplayNode { if processNumberChange(strongSelf.phoneInputNode.number) { } else if let code = Int(code), let name = name, let countryName = countryCodeAndIdToName[CountryCodeAndId(code: code, id: name)] { let flagString = emojiFlagForISOCountryCode(name) - let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(name, strings: strongSelf.strings) ?? countryName + var localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(name, strings: strongSelf.strings) ?? countryName + if name == "FT" { + localizedName = strongSelf.strings.Login_AnonymousNumbers + } strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.list.itemAccentColor, for: []) strongSelf.hasCountry = true @@ -173,7 +179,10 @@ private final class PhoneAndCountryNode: ASDisplayNode { } } else if let code = Int(code), let (countryId, countryName) = countryCodeToIdAndName[code] { let flagString = emojiFlagForISOCountryCode(countryId) - let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(countryId, strings: strongSelf.strings) ?? countryName + var localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(countryId, strings: strongSelf.strings) ?? countryName + if countryId == "FT" { + localizedName = strongSelf.strings.Login_AnonymousNumbers + } strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(20.0), with: theme.list.itemAccentColor, for: []) strongSelf.hasCountry = true diff --git a/submodules/AuthorizationUtils/Sources/AuthorizationOptionText.swift b/submodules/AuthorizationUtils/Sources/AuthorizationOptionText.swift index 2545b68c86..f7dafe0666 100644 --- a/submodules/AuthorizationUtils/Sources/AuthorizationOptionText.swift +++ b/submodules/AuthorizationUtils/Sources/AuthorizationOptionText.swift @@ -41,6 +41,8 @@ public func authorizationCurrentOptionText(_ type: SentAuthorizationCodeType, ph } return mutableString + case .fragment: + return parseMarkdownIntoAttributedString(strings.Login_EnterCodeFragmentText, attributes: attributes, textAlignment: .center) } } @@ -68,6 +70,13 @@ public func authorizationNextOptionText(currentType: SentAuthorizationCodeType, } else { return (NSAttributedString(string: String(format: strings.ChangePhoneNumberCode_CallTimer(String(format: "%d:%.2d", minutes, seconds)).string, minutes, seconds), font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false) } + case .fragment: + if timeout <= 0 { + return (NSAttributedString(string: strings.Login_CodeSentSms, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false) + } else { + let timeString = NSString(format: "%d:%.02d", Int(minutes), Int(seconds)) + return (NSAttributedString(string: strings.Login_WillSendSms(timeString as String).string, font: Font.regular(16.0), textColor: primaryColor, paragraphAlignment: .center), false) + } } } else { switch currentType { @@ -79,6 +88,8 @@ public func authorizationNextOptionText(currentType: SentAuthorizationCodeType, return (NSAttributedString(string: strings.Login_SendCodeViaCall, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) case .flashCall, .missedCall: return (NSAttributedString(string: strings.Login_SendCodeViaFlashCall, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) + case .fragment: + return (NSAttributedString(string: "Send code via fragment", font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) case .none: return (NSAttributedString(string: strings.Login_HaveNotReceivedCodeInternal, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) } @@ -90,6 +101,8 @@ public func authorizationNextOptionText(currentType: SentAuthorizationCodeType, return (NSAttributedString(string: strings.Login_SendCodeViaCall, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) case .flashCall, .missedCall: return (NSAttributedString(string: strings.Login_SendCodeViaFlashCall, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) + case .fragment: + return (NSAttributedString(string: "Send code via fragment", font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) case .none: return (NSAttributedString(string: strings.Login_HaveNotReceivedCodeInternal, font: Font.regular(16.0), textColor: accentColor, paragraphAlignment: .center), true) } diff --git a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift index 9c546a906e..dc61b1acc4 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchContainerNode.swift @@ -167,7 +167,7 @@ public final class ChatListSearchContainerNode: SearchDisplayControllerContentNo self.backgroundColor = filter.contains(.excludeRecent) ? nil : self.presentationData.theme.chatList.backgroundColor - self.addSubnode(self.dimNode) +// self.addSubnode(self.dimNode) self.addSubnode(self.paneContainerNode) let interaction = ChatListSearchInteraction(openPeer: { peer, chatPeer, threadId, value in diff --git a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift index 716c17da9b..88e68b7335 100644 --- a/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift +++ b/submodules/ChatListUI/Sources/ChatListSearchFiltersContainerNode.swift @@ -82,7 +82,7 @@ private final class ItemNode: ASDisplayNode { title = presentationData.strings.ChatList_Search_FilterChats icon = nil case .topics: - title = presentationData.strings.ChatList_Search_FilterTopics + title = presentationData.strings.ChatList_Search_FilterChats icon = nil case .media: title = presentationData.strings.ChatList_Search_FilterMedia diff --git a/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift b/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift index 0356bf510c..05d92c9edf 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift @@ -422,7 +422,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState isContact: entry.isContact, forumTopicData: entry.forumTopicData, topForumTopicItems: entry.topForumTopicItems, - revealed: threadId == 1 && state.hiddenItemShouldBeTemporaryRevealed + revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing) )) } if !view.hasLater { @@ -516,7 +516,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState default: break } - + result.append(.PeerEntry( index: .chatList(EngineChatList.Item.Index.ChatList(pinningIndex: pinningIndex, messageIndex: index.messageIndex)), presentationData: state.presentationData, @@ -538,7 +538,7 @@ func chatListNodeEntriesForView(_ view: EngineChatList, state: ChatListNodeState isContact: item.item.isContact, forumTopicData: item.item.forumTopicData, topForumTopicItems: item.item.topForumTopicItems, - revealed: threadId == 1 && state.hiddenItemShouldBeTemporaryRevealed + revealed: threadId == 1 && (state.hiddenItemShouldBeTemporaryRevealed || state.editing) )) if pinningIndex != 0 { pinningIndex -= 1 diff --git a/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift b/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift index d6e9ccc707..b14d1f9a62 100644 --- a/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift +++ b/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift @@ -422,8 +422,9 @@ public final class ChatPresentationInterfaceState: Equatable { public let voiceMessagesAvailable: Bool public let customEmojiAvailable: Bool public let threadData: ThreadData? + public let isGeneralThreadClosed: Bool? - public init(chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, chatLocation: ChatLocation, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, greetingData: ChatGreetingData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool, importState: ChatPresentationImportState?, threadData: ThreadData?) { + public init(chatWallpaper: TelegramWallpaper, theme: PresentationTheme, strings: PresentationStrings, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, limitsConfiguration: LimitsConfiguration, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, accountPeerId: PeerId, mode: ChatControllerPresentationMode, chatLocation: ChatLocation, subject: ChatControllerSubject?, peerNearbyData: ChatPeerNearbyData?, greetingData: ChatGreetingData?, pendingUnpinnedAllMessages: Bool, activeGroupCallInfo: ChatActiveGroupCallInfo?, hasActiveGroupCall: Bool, importState: ChatPresentationImportState?, threadData: ThreadData?, isGeneralThreadClosed: Bool?) { self.interfaceState = ChatInterfaceState() self.inputTextPanelState = ChatTextInputPanelState() self.editMessageState = nil @@ -489,9 +490,10 @@ public final class ChatPresentationInterfaceState: Equatable { self.voiceMessagesAvailable = true self.customEmojiAvailable = true self.threadData = nil + self.isGeneralThreadClosed = nil } - public init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, 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: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, 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: ReportReason?, showCommands: Bool, hasBotCommands: Bool, showSendAsPeers: Bool, sendAsPeers: [SendAsPeer]?, botMenuButton: BotMenuButton, showWebView: Bool, currentSendAsPeerId: PeerId?, copyProtectionEnabled: Bool, hasPlentyOfMessages: Bool, isPremium: Bool, forceInputCommandsHidden: Bool, voiceMessagesAvailable: Bool, customEmojiAvailable: Bool, threadData: ThreadData?) { + public init(interfaceState: ChatInterfaceState, chatLocation: ChatLocation, renderedPeer: RenderedPeer?, isNotAccessible: Bool, explicitelyCanPinMessages: Bool, contactStatus: ChatContactStatus?, hasBots: Bool, isArchived: Bool, inputTextPanelState: ChatTextInputPanelState, editMessageState: ChatEditInterfaceMessageState?, recordedMediaPreview: ChatRecordedMediaPreview?, 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: (String, TelegramMediaWebpage)?, editingUrlPreview: (String, TelegramMediaWebpage)?, search: ChatSearchData?, searchQuerySuggestionResult: ChatPresentationInputQueryResult?, 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: ReportReason?, showCommands: Bool, hasBotCommands: Bool, showSendAsPeers: Bool, sendAsPeers: [SendAsPeer]?, botMenuButton: BotMenuButton, showWebView: Bool, currentSendAsPeerId: PeerId?, copyProtectionEnabled: Bool, hasPlentyOfMessages: Bool, isPremium: Bool, forceInputCommandsHidden: Bool, voiceMessagesAvailable: Bool, customEmojiAvailable: Bool, threadData: ThreadData?, isGeneralThreadClosed: Bool?) { self.interfaceState = interfaceState self.chatLocation = chatLocation self.renderedPeer = renderedPeer @@ -557,6 +559,7 @@ public final class ChatPresentationInterfaceState: Equatable { self.voiceMessagesAvailable = voiceMessagesAvailable self.customEmojiAvailable = customEmojiAvailable self.threadData = threadData + self.isGeneralThreadClosed = isGeneralThreadClosed } public static func ==(lhs: ChatPresentationInterfaceState, rhs: ChatPresentationInterfaceState) -> Bool { @@ -767,35 +770,38 @@ public final class ChatPresentationInterfaceState: Equatable { if lhs.threadData != rhs.threadData { return false } + if lhs.isGeneralThreadClosed != rhs.isGeneralThreadClosed { + return false + } return true } public func updatedInterfaceState(_ f: (ChatInterfaceState) -> ChatInterfaceState) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: f(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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: f(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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPeer(_ f: (RenderedPeer?) -> RenderedPeer?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: f(self.renderedPeer), isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedIsNotAccessible(_ isNotAccessible: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedExplicitelyCanPinMessages(_ explicitelyCanPinMessages: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedContactStatus(_ contactStatus: ChatContactStatus?) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: contactStatus, hasBots: self.hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedHasBots(_ hasBots: Bool) -> ChatPresentationInterfaceState { - return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: hasBots, isArchived: self.isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedIsArchived(_ isArchived: Bool) -> 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: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + return ChatPresentationInterfaceState(interfaceState: self.interfaceState, chatLocation: self.chatLocation, renderedPeer: self.renderedPeer, isNotAccessible: self.isNotAccessible, explicitelyCanPinMessages: self.explicitelyCanPinMessages, contactStatus: self.contactStatus, hasBots: self.hasBots, isArchived: isArchived, inputTextPanelState: self.inputTextPanelState, editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedInputQueryResult(queryKind: ChatPresentationInputQueryKind, _ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> ChatPresentationInterfaceState { @@ -807,203 +813,207 @@ public final class ChatPresentationInterfaceState: Equatable { inputQueryResults.removeValue(forKey: queryKind) } - 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedInputTextPanelState(_ f: (ChatTextInputPanelState) -> ChatTextInputPanelState) -> 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: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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: f(self.inputTextPanelState), editMessageState: self.editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedEditMessageState(_ editMessageState: ChatEditInterfaceMessageState?) -> 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: editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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: editMessageState, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedRecordedMediaPreview(_ recordedMediaPreview: ChatRecordedMediaPreview?) -> 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, recordedMediaPreview: recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedInputMode(_ f: (ChatInputMode) -> ChatInputMode) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: f(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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedTitlePanelContext(_ f: ([ChatTitlePanelContext]) -> [ChatTitlePanelContext]) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: f(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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedKeyboardButtonsMessage(_ message: Message?) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: message, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPinnedMessage(_ pinnedMessage: ChatPinnedMessage?) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPeerIsBlocked(_ peerIsBlocked: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPeerIsMuted(_ peerIsMuted: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, inputQueryResults: self.inputQueryResults, inputMode: self.inputMode, titlePanelContexts: self.titlePanelContexts, keyboardButtonsMessage: self.keyboardButtonsMessage, pinnedMessageId: self.pinnedMessageId, pinnedMessage: self.pinnedMessage, peerIsBlocked: self.peerIsBlocked, peerIsMuted: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPeerDiscussionId(_ peerDiscussionId: PeerId?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPeerGeoLocation(_ peerGeoLocation: PeerGeoLocation?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedCallsAvailable(_ callsAvailable: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedCallsPrivate(_ callsPrivate: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: callsPrivate, slowmodeState: self.slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedSlowmodeState(_ slowmodeState: ChatSlowmodeState?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: slowmodeState, chatHistoryState: self.chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedBotStartPayload(_ botStartPayload: String?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedChatHistoryState(_ chatHistoryState: ChatHistoryNodeHistoryState?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: chatHistoryState, botStartPayload: self.botStartPayload, urlPreview: self.urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedUrlPreview(_ urlPreview: (String, TelegramMediaWebpage)?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: urlPreview, editingUrlPreview: self.editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedEditingUrlPreview(_ editingUrlPreview: (String, TelegramMediaWebpage)?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: editingUrlPreview, search: self.search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedSearch(_ search: ChatSearchData?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: search, searchQuerySuggestionResult: self.searchQuerySuggestionResult, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedSearchQuerySuggestionResult(_ f: (ChatPresentationInputQueryResult?) -> ChatPresentationInputQueryResult?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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: f(self.searchQuerySuggestionResult), 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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: f(self.searchQuerySuggestionResult), 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedMode(_ mode: ChatControllerPresentationMode) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPresentationReady(_ presentationReady: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedTheme(_ theme: PresentationTheme) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedStrings(_ strings: PresentationStrings) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedDateTimeFormat(_ dateTimeFormat: PresentationDateTimeFormat) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: self.chatWallpaper, theme: self.theme, strings: self.strings, dateTimeFormat: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedChatWallpaper(_ chatWallpaper: TelegramWallpaper) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, presentationReady: self.presentationReady, chatWallpaper: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedBubbleCorners(_ bubbleCorners: PresentationChatBubbleCorners) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedAutoremoveTimeout(_ autoremoveTimeout: Int32?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: autoremoveTimeout, subject: self.subject, peerNearbyData: self.peerNearbyData, greetingData: self.greetingData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: autoremoveTimeout, subject: self.subject, peerNearbyData: self.peerNearbyData, greetingData: self.greetingData, pendingUnpinnedAllMessages: self.pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedPendingUnpinnedAllMessages(_ pendingUnpinnedAllMessages: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: pendingUnpinnedAllMessages, activeGroupCallInfo: self.activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedActiveGroupCallInfo(_ activeGroupCallInfo: ChatActiveGroupCallInfo?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: activeGroupCallInfo, hasActiveGroupCall: self.hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedHasActiveGroupCall(_ hasActiveGroupCall: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: hasActiveGroupCall, importState: self.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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedImportState(_ importState: ChatPresentationImportState?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedReportReason(_ reportReason: ReportReason?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedShowCommands(_ showCommands: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedHasBotCommands(_ hasBotCommands: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedShowSendAsPeers(_ showSendAsPeers: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedSendAsPeers(_ sendAsPeers: [SendAsPeer]?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedCurrentSendAsPeerId(_ currentSendAsPeerId: PeerId?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedBotMenuButton(_ botMenuButton: BotMenuButton) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedShowWebView(_ showWebView: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: self.copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedCopyProtectionEnabled(_ copyProtectionEnabled: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: self.reportReason, showCommands: self.showCommands, hasBotCommands: self.hasBotCommands, showSendAsPeers: self.showSendAsPeers, sendAsPeers: self.sendAsPeers, botMenuButton: self.botMenuButton, showWebView: self.showWebView, currentSendAsPeerId: self.currentSendAsPeerId, copyProtectionEnabled: copyProtectionEnabled, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedHasPlentyOfMessages(_ hasPlentyOfMessages: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedIsPremium(_ isPremium: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedForceInputCommandsHidden(_ forceInputCommandsHidden: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedVoiceMessagesAvailable(_ voiceMessagesAvailable: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedCustomEmojiAvailable(_ customEmojiAvailable: Bool) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: customEmojiAvailable, threadData: self.threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) } public func updatedThreadData(_ threadData: ThreadData?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: threadData) + 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: threadData, isGeneralThreadClosed: self.isGeneralThreadClosed) + } + + public func updatedIsGeneralThreadClosed(_ isGeneralThreadClosed: Bool?) -> 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, recordedMediaPreview: self.recordedMediaPreview, 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, 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: 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, hasPlentyOfMessages: self.hasPlentyOfMessages, isPremium: self.isPremium, forceInputCommandsHidden: self.forceInputCommandsHidden, voiceMessagesAvailable: self.voiceMessagesAvailable, customEmojiAvailable: self.customEmojiAvailable, threadData: self.threadData, isGeneralThreadClosed: isGeneralThreadClosed) } } diff --git a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift index b814ac9176..ce30ca2f17 100644 --- a/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift +++ b/submodules/CountrySelectionUI/Sources/AuthorizationSequenceCountrySelectionControllerNode.swift @@ -210,6 +210,9 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode, self.needsSubtitle = strings.baseLanguageCode != "en" self.tableView = UITableView(frame: CGRect(), style: .plain) + if #available(iOS 15.0, *) { + self.tableView.sectionHeaderTopPadding = 0.0 + } self.searchTableView = UITableView(frame: CGRect(), style: .plain) self.searchTableView.isHidden = true @@ -322,8 +325,8 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode, } func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - (view as? UITableViewHeaderFooterView)?.tintColor = self.theme.list.plainBackgroundColor - (view as? UITableViewHeaderFooterView)?.textLabel?.textColor = self.theme.list.itemPrimaryTextColor + (view as? UITableViewHeaderFooterView)?.tintColor = self.theme.chatList.sectionHeaderFillColor + (view as? UITableViewHeaderFooterView)?.textLabel?.textColor = self.theme.chatList.sectionHeaderTextColor } func sectionIndexTitles(for tableView: UITableView) -> [String]? { @@ -353,30 +356,32 @@ final class AuthorizationSequenceCountrySelectionControllerNode: ASDisplayNode, } else { cell = UITableViewCell(style: self.needsSubtitle ? .subtitle : .default, reuseIdentifier: "CountryCell") let label = UILabel() - label.font = Font.medium(17.0) + label.font = Font.regular(17.0) cell.accessoryView = label cell.selectedBackgroundView = UIView() } - let countryName: String + var countryName: String let originalCountryName: String let code: String if tableView === self.tableView { countryName = self.sections[indexPath.section].1[indexPath.row].0.1 + countryName = "\(emojiFlagForISOCountryCode(self.sections[indexPath.section].1[indexPath.row].1)) \(countryName)" originalCountryName = self.sections[indexPath.section].1[indexPath.row].0.0 code = "+\(self.sections[indexPath.section].1[indexPath.row].2)" } else { countryName = self.searchResults[indexPath.row].0.1 + countryName = "\(emojiFlagForISOCountryCode(self.searchResults[indexPath.row].1)) \(countryName)" originalCountryName = self.searchResults[indexPath.row].0.0 code = "+\(self.searchResults[indexPath.row].2)" } - + cell.textLabel?.text = countryName cell.detailTextLabel?.text = originalCountryName if self.displayCodes, let label = cell.accessoryView as? UILabel { label.text = code label.sizeToFit() - label.textColor = self.theme.list.itemPrimaryTextColor + label.textColor = self.theme.list.itemSecondaryTextColor } cell.textLabel?.textColor = self.theme.list.itemPrimaryTextColor cell.detailTextLabel?.textColor = self.theme.list.itemPrimaryTextColor diff --git a/submodules/CountrySelectionUI/Sources/CountryList.swift b/submodules/CountrySelectionUI/Sources/CountryList.swift index 5333106467..5d2dd965c3 100644 --- a/submodules/CountrySelectionUI/Sources/CountryList.swift +++ b/submodules/CountrySelectionUI/Sources/CountryList.swift @@ -6,7 +6,9 @@ public func emojiFlagForISOCountryCode(_ countryCode: String) -> String { return "" } - if countryCode == "XG" { + if countryCode == "FT" { + return "🏴‍☠️" + } else if countryCode == "XG" { return "🛰️" } else if countryCode == "XV" { return "🌍" diff --git a/submodules/Display/Source/TextAlertController.swift b/submodules/Display/Source/TextAlertController.swift index 6c34171c13..1a56b9799e 100644 --- a/submodules/Display/Source/TextAlertController.swift +++ b/submodules/Display/Source/TextAlertController.swift @@ -446,8 +446,8 @@ public func standardTextAlertController(theme: AlertControllerTheme, title: Stri var dismissImpl: (() -> Void)? let attributedText: NSAttributedString if parseMarkdown { - let font = title == nil ? Font.semibold(theme.baseFontSize * 13.0 / 17.0) : Font.regular(floor(theme.baseFontSize * 13.0 / 17.0)) - let boldFont = title == nil ? Font.bold(theme.baseFontSize * 13.0 / 17.0) : Font.semibold(floor(theme.baseFontSize * 13.0 / 17.0)) + let font = title == nil ? Font.semibold(theme.baseFontSize) : Font.regular(floor(theme.baseFontSize * 13.0 / 17.0)) + let boldFont = title == nil ? Font.bold(theme.baseFontSize) : Font.semibold(floor(theme.baseFontSize * 13.0 / 17.0)) let body = MarkdownAttributeSet(font: font, textColor: theme.primaryColor) let bold = MarkdownAttributeSet(font: boldFont, textColor: theme.primaryColor) attributedText = parseMarkdownIntoAttributedString(text, attributes: MarkdownAttributes(body: body, bold: bold, link: body, linkAttribute: { _ in nil }), textAlignment: .center) diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index 8ecb9adaed..cac01d4d57 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -783,6 +783,8 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let hasExpandedCaptionPromise = Promise() private var hideControlsDisposable: Disposable? + private var scrubbing = false + var playbackCompleted: (() -> Void)? private var customUnembedWhenPortrait: ((OverlayMediaItemNode) -> Bool)? @@ -1062,21 +1064,28 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { strongSelf.isInteractingPromise.set(timecode != nil) - if let videoFramePreview = strongSelf.videoFramePreview { - if let timecode = timecode { - if !strongSelf.scrubbingFrames { - strongSelf.scrubbingFrames = true - strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames - |> map(Optional.init)) - } - videoFramePreview.generateFrame(at: timecode) - } else { - strongSelf.isInteractingPromise.set(false) - strongSelf.scrubbingFrame.set(.single(nil)) - videoFramePreview.cancelPendingFrames() - strongSelf.scrubbingFrames = false - } + if let timecode = timecode { + strongSelf.videoNode?.pause() + strongSelf.videoNode?.seek(timecode) + } else { + strongSelf.videoNode?.play() } + +// if let videoFramePreview = strongSelf.videoFramePreview { +// if let timecode = timecode { +// if !strongSelf.scrubbingFrames { +// strongSelf.scrubbingFrames = true +// strongSelf.scrubbingFrame.set(videoFramePreview.generatedFrames +// |> map(Optional.init)) +// } +// videoFramePreview.generateFrame(at: timecode) +// } else { +// strongSelf.isInteractingPromise.set(false) +// strongSelf.scrubbingFrame.set(.single(nil)) +// videoFramePreview.cancelPendingFrames() +// strongSelf.scrubbingFrames = false +// } +// } } self.footerContentNode.scrubberView = scrubberView diff --git a/submodules/LocalizedPeerData/BUILD b/submodules/LocalizedPeerData/BUILD index 7fe29f6078..14f8343c3c 100644 --- a/submodules/LocalizedPeerData/BUILD +++ b/submodules/LocalizedPeerData/BUILD @@ -13,7 +13,6 @@ swift_library( "//submodules/TelegramCore:TelegramCore", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/TelegramUIPreferences:TelegramUIPreferences", - "//submodules/PhoneNumberFormat:PhoneNumberFormat", ], visibility = [ "//visibility:public", diff --git a/submodules/LocalizedPeerData/Sources/PeerTitle.swift b/submodules/LocalizedPeerData/Sources/PeerTitle.swift index 0ada467530..341388e51a 100644 --- a/submodules/LocalizedPeerData/Sources/PeerTitle.swift +++ b/submodules/LocalizedPeerData/Sources/PeerTitle.swift @@ -2,7 +2,7 @@ import Foundation import TelegramCore import TelegramPresentationData import TelegramUIPreferences -import PhoneNumberFormat +//import PhoneNumberFormat public extension EnginePeer { var compactDisplayTitle: String { @@ -12,8 +12,8 @@ public extension EnginePeer { return firstName } else if let lastName = user.lastName, !lastName.isEmpty { return lastName - } else if let phone = user.phone { - return formatPhoneNumber("+\(phone)") + } else if let _ = user.phone { + return ""// formatPhoneNumber("+\(phone)") } else { return "" } @@ -45,8 +45,8 @@ public extension EnginePeer { } } else if let lastName = user.lastName, !lastName.isEmpty { return lastName - } else if let phone = user.phone { - return formatPhoneNumber("+\(phone)") + } else if let _ = user.phone { + return ""//formatPhoneNumber("+\(phone)") } else { return strings.User_DeletedAccount } diff --git a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift index 10aaaba5eb..6a51577401 100644 --- a/submodules/PhoneInputNode/Sources/PhoneInputNode.swift +++ b/submodules/PhoneInputNode/Sources/PhoneInputNode.swift @@ -76,21 +76,6 @@ private func cleanSuffix(_ text: String) -> String { return result } -extension String { - func applyPatternOnNumbers(pattern: String, replacementCharacter: Character) -> String { - let pattern = pattern.replacingOccurrences( of: "[0-9]", with: "X", options: .regularExpression) - var pureNumber = self.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression) - for index in 0 ..< pattern.count { - guard index < pureNumber.count else { return pureNumber } - let stringIndex = pattern.index(pattern.startIndex, offsetBy: index) - let patternCharacter = pattern[stringIndex] - guard patternCharacter != replacementCharacter else { continue } - pureNumber.insert(patternCharacter, at: stringIndex) - } - return pureNumber - } -} - public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { public let countryCodeField: TextFieldNode public let numberField: TextFieldNode @@ -304,7 +289,7 @@ public final class PhoneInputNode: ASDisplayNode, UITextFieldDelegate { } if let mask = self.mask { - numberText = numberText.applyPatternOnNumbers(pattern: mask.string, replacementCharacter: "X") + numberText = formatPhoneNumberToMask(numberText, mask: mask.string) } var focusOnNumber = false diff --git a/submodules/PhoneNumberFormat/BUILD b/submodules/PhoneNumberFormat/BUILD index 678a034679..7a4e9493b3 100644 --- a/submodules/PhoneNumberFormat/BUILD +++ b/submodules/PhoneNumberFormat/BUILD @@ -11,6 +11,8 @@ swift_library( ], deps = [ "//submodules/libphonenumber:libphonenumber", + "//submodules/AccountContext:AccountContext", + "//submodules/TelegramCore:TelegramCore", ], visibility = [ "//visibility:public", diff --git a/submodules/PhoneNumberFormat/Sources/PhoneNumbers.swift b/submodules/PhoneNumberFormat/Sources/PhoneNumbers.swift index fd0afc5e50..b5e4652045 100644 --- a/submodules/PhoneNumberFormat/Sources/PhoneNumbers.swift +++ b/submodules/PhoneNumberFormat/Sources/PhoneNumbers.swift @@ -1,5 +1,7 @@ import Foundation import libphonenumber +import AccountContext +import TelegramCore private let phoneNumberUtil = NBPhoneNumberUtil() @@ -12,31 +14,89 @@ public func formatPhoneNumber(_ string: String) -> String { } } -public func isViablePhoneNumber(_ string: String) -> Bool { - return phoneNumberUtil.isViablePhoneNumber(string) +public func formatPhoneNumber(context: AccountContext, number: String) -> String { + if let pattern = lookupPatternByNumber(number, configuration: context.currentCountriesConfiguration.with { $0 }) { + return "+\(formatPhoneNumberToMask(number, mask: pattern))" + } else { + do { + let number = try phoneNumberUtil.parse("+" + number, defaultRegion: nil) + return try phoneNumberUtil.format(number, numberFormat: .INTERNATIONAL) + } catch _ { + return number + } + } } -public class ParsedPhoneNumber: Equatable { - let rawPhoneNumber: NBPhoneNumber? - - public init?(string: String) { - if let number = try? phoneNumberUtil.parse(string, defaultRegion: NB_UNKNOWN_REGION) { - self.rawPhoneNumber = number +private func removePlus(_ text: String?) -> String { + var result = "" + if let text = text { + for c in text { + if c != "+" { + result += String(c) + } + } + } + return result +} + +private func lookupCountryIdByNumber(_ number: String, configuration: CountriesConfiguration) -> (Country, Country.CountryCode)? { + let number = removePlus(number) + var results: [(Country, Country.CountryCode)]? = nil + for i in 0 ..< number.count { + let prefix = String(number.prefix(number.count - i)) + if let country = configuration.countriesByPrefix[prefix] { + if var currentResults = results { + if let result = currentResults.first, result.1.code.count > country.1.code.count { + break + } else { + currentResults.append(country) + } + } else { + results = [country] + } + } + } + return results?.first +} + +private func lookupPatternByNumber(_ number: String, configuration: CountriesConfiguration) -> String? { + let number = removePlus(number) + if let (_, code) = lookupCountryIdByNumber(number, configuration: configuration), !code.patterns.isEmpty { + var prefixes: [String: String] = [:] + for pattern in code.patterns { + let cleanPattern = pattern.replacingOccurrences(of: " ", with: "").replacingOccurrences(of: "X", with: "") + let cleanPrefix = "\(code.code)\(cleanPattern)" + prefixes[cleanPrefix] = pattern + } + for i in 0.. Bool { - var error: NSError? - let result = phoneNumberUtil.isNumberMatch(lhs.rawPhoneNumber, second: rhs.rawPhoneNumber, error: &error) - if error != nil { - return false - } - if result != .NO_MATCH && result != .NOT_A_NUMBER { - return true - } else { - return false - } - } + return nil +} + +public func formatPhoneNumberToMask(_ string: String, mask: String) -> String { + let replacementCharacter: Character = "X" + let pattern = mask.replacingOccurrences( of: "[0-9]", with: "X", options: .regularExpression) + var pureNumber = string.replacingOccurrences( of: "[^0-9]", with: "", options: .regularExpression) + for index in 0 ..< pattern.count { + guard index < pureNumber.count else { return pureNumber } + let stringIndex = pattern.index(pattern.startIndex, offsetBy: index) + let patternCharacter = pattern[stringIndex] + guard patternCharacter != replacementCharacter else { continue } + pureNumber.insert(patternCharacter, at: stringIndex) + } + return pureNumber +} + +public func isViablePhoneNumber(_ string: String) -> Bool { + return phoneNumberUtil.isViablePhoneNumber(string) } diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift index 1f1707190a..9a31cad360 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberCodeController.swift @@ -88,8 +88,8 @@ private enum ChangePhoneNumberCodeEntry: ItemListNodeEntry { func item(presentationData: ItemListPresentationData, arguments: Any) -> ListViewItem { let arguments = arguments as! ChangePhoneNumberCodeControllerArguments switch self { - case let .codeEntry(_, _, title, text): - return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: title, textColor: .black), text: text, placeholder: "", type: .number, spacing: 10.0, tag: ChangePhoneNumberCodeTag.input, sectionId: self.section, textUpdated: { updatedText in + case let .codeEntry(theme, _, title, text): + return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: title, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, spacing: 10.0, tag: ChangePhoneNumberCodeTag.input, sectionId: self.section, textUpdated: { updatedText in arguments.updateEntryText(updatedText) }, action: { arguments.next() @@ -315,7 +315,7 @@ func changePhoneNumberCodeController(context: AccountContext, phoneNumber: Strin }) } - let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(formatPhoneNumber(phoneNumber)), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) + let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(formatPhoneNumber(context: context, number: phoneNumber)), leftNavigationButton: nil, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: changePhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, codeData: data, timeout: timeout, strings: presentationData.strings, phoneNumber: phoneNumber), style: .blocks, focusItemTag: ChangePhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false) return (controllerState, (listState, arguments)) diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift index 1c20235e74..d2317bdb4b 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberController.swift @@ -145,7 +145,7 @@ public final class ChangePhoneNumberController: ViewController, MFMailComposeVie text = presentationData.strings.Login_InvalidPhoneError actions.append(TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})) case .phoneNumberOccupied: - text = presentationData.strings.ChangePhone_ErrorOccupied(formatPhoneNumber(phoneNumber)).string + text = presentationData.strings.ChangePhone_ErrorOccupied(formatPhoneNumber(context: strongSelf.context, number: phoneNumber)).string actions.append(TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})) case .phoneBanned: text = presentationData.strings.Login_PhoneBannedError @@ -154,7 +154,7 @@ public final class ChangePhoneNumberController: ViewController, MFMailComposeVie guard let strongSelf = self else { return } - let formattedNumber = formatPhoneNumber(number) + let formattedNumber = formatPhoneNumber(context: strongSelf.context, number: number) let appVersion = (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "unknown" let systemVersion = UIDevice.current.systemVersion let locale = Locale.current.identifier diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift index 41ea069963..be4b957a30 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberControllerNode.swift @@ -165,13 +165,13 @@ final class ChangePhoneNumberControllerNode: ASDisplayNode { let localizedName: String = AuthorizationSequenceCountrySelectionController.lookupCountryNameById(country.id, strings: strongSelf.presentationData.strings) ?? country.name strongSelf.countryButton.setTitle("\(flagString) \(localizedName)", with: Font.regular(17.0), with: strongSelf.presentationData.theme.list.itemPrimaryTextColor, for: []) - let maskFont = Font.with(size: 20.0, design: .regular, traits: [.monospacedNumbers]) + let maskFont = Font.with(size: 17.0, design: .regular, traits: [.monospacedNumbers]) if let mask = AuthorizationSequenceCountrySelectionController.lookupPatternByNumber(number, preferredCountries: strongSelf.preferredCountryIdForCode).flatMap({ NSAttributedString(string: $0, font: maskFont, textColor: strongSelf.presentationData.theme.list.itemPlaceholderTextColor) }) { strongSelf.phoneInputNode.numberField.textField.attributedPlaceholder = nil strongSelf.phoneInputNode.mask = mask } else { strongSelf.phoneInputNode.mask = nil - strongSelf.phoneInputNode.numberField.textField.attributedPlaceholder = NSAttributedString(string: strongSelf.presentationData.strings.Login_PhonePlaceholder, font: Font.regular(20.0), textColor: strongSelf.presentationData.theme.list.itemPlaceholderTextColor) + strongSelf.phoneInputNode.numberField.textField.attributedPlaceholder = NSAttributedString(string: strongSelf.presentationData.strings.Login_PhonePlaceholder, font: Font.regular(17.0), textColor: strongSelf.presentationData.theme.list.itemPlaceholderTextColor) } return true } else { diff --git a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift index 8207382276..634fd16595 100644 --- a/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift +++ b/submodules/SettingsUI/Sources/ChangePhoneNumberIntroController.swift @@ -101,7 +101,7 @@ public final class ChangePhoneNumberIntroController: ViewController { self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style - let formattedPhone = formatPhoneNumber(phoneNumber) + let formattedPhone = formatPhoneNumber(context: context, number: phoneNumber) self.title = formattedPhone self.navigationItem.backBarButtonItem = UIBarButtonItem(title: presentationData.strings.Common_Back, style: .plain, target: nil, action: nil) //self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(self.cancelPressed)) diff --git a/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift index 09e42e9e5c..d7e2205182 100644 --- a/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift +++ b/submodules/SettingsUI/Sources/Privacy and Security/ConfirmPhoneNumberController.swift @@ -93,12 +93,11 @@ private enum ConfirmPhoneNumberCodeEntry: ItemListNodeEntry { }, action: { arguments.next() }) - case let .codeInfo(_, strings, phoneNumber, nextOptionText): - let formattedNumber = formatPhoneNumber(phoneNumber) - let stringAndRanges = strings.CancelResetAccount_TextSMS(formattedNumber) + case let .codeInfo(_, strings, formattedPhoneNumber, nextOptionText): + let stringAndRanges = strings.CancelResetAccount_TextSMS(formattedPhoneNumber) var result = "" result += stringAndRanges.string - if let range = result.range(of: formattedNumber) { + if let range = result.range(of: formattedPhoneNumber) { result.insert("*", at: range.upperBound) result.insert("*", at: range.upperBound) result.insert("*", at: range.lowerBound) @@ -122,7 +121,7 @@ private struct ConfirmPhoneNumberCodeControllerState: Equatable { } } -private func confirmPhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ConfirmPhoneNumberCodeControllerState, phoneNumber: String, codeData: CancelAccountResetData, timeout: Int32?, strings: PresentationStrings, theme: PresentationTheme) -> [ConfirmPhoneNumberCodeEntry] { +private func confirmPhoneNumberCodeControllerEntries(presentationData: PresentationData, state: ConfirmPhoneNumberCodeControllerState, formattedPhoneNumber: String, codeData: CancelAccountResetData, timeout: Int32?, strings: PresentationStrings, theme: PresentationTheme) -> [ConfirmPhoneNumberCodeEntry] { var entries: [ConfirmPhoneNumberCodeEntry] = [] entries.append(.codeEntry(presentationData.theme, presentationData.strings, presentationData.strings.ChangePhoneNumberCode_CodePlaceholder, state.codeText)) @@ -130,7 +129,7 @@ private func confirmPhoneNumberCodeControllerEntries(presentationData: Presentat if let nextType = codeData.nextType { text += authorizationNextOptionText(currentType: codeData.type, nextType: nextType, timeout: timeout, strings: presentationData.strings, primaryColor: .black, accentColor: .black).0.string } - entries.append(.codeInfo(presentationData.theme, presentationData.strings, phoneNumber, text)) + entries.append(.codeInfo(presentationData.theme, presentationData.strings, formattedPhoneNumber, text)) return entries } @@ -268,7 +267,7 @@ public func confirmPhoneNumberCodeController(context: AccountContext, phoneNumbe return state } let presentationData = context.sharedContext.currentPresentationData.with { $0 } - presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.CancelResetAccount_Success(formatPhoneNumber(phoneNumber)).string, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) + presentControllerImpl?(textAlertController(context: context, title: nil, text: presentationData.strings.CancelResetAccount_Success(formatPhoneNumber(context: context, number: phoneNumber)).string, actions: [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {})]), nil) dismissImpl?() })) } @@ -311,7 +310,7 @@ public func confirmPhoneNumberCodeController(context: AccountContext, phoneNumbe } let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.CancelResetAccount_Title), leftNavigationButton: leftNavigationButton, rightNavigationButton: rightNavigationButton, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: false) - let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: confirmPhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, phoneNumber: phoneNumber, codeData: data, timeout: timeout, strings: presentationData.strings, theme: presentationData.theme), style: .blocks, focusItemTag: ConfirmPhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false) + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: confirmPhoneNumberCodeControllerEntries(presentationData: presentationData, state: state, formattedPhoneNumber: formatPhoneNumber(context: context, number: phoneNumber), codeData: data, timeout: timeout, strings: presentationData.strings, theme: presentationData.theme), style: .blocks, focusItemTag: ConfirmPhoneNumberCodeTag.input, emptyStateItem: nil, animateChanges: false) return (controllerState, (listState, arguments)) } diff --git a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift index c53a29f3a9..2a8aa7db57 100644 --- a/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift +++ b/submodules/SolidRoundedButtonNode/Sources/SolidRoundedButtonNode.swift @@ -156,6 +156,13 @@ public final class SolidRoundedButtonNode: ASDisplayNode { self.animationTimer = timer timer.start() } + } else { + self.animationNode?.play() + let timer = SwiftSignalKit.Timer(timeout: 4.0, repeat: true, completion: { [weak self] in + self?.animationNode?.play() + }, queue: Queue.mainQueue()) + self.animationTimer = timer + timer.start() } } } else if let animationNode = self.animationNode { @@ -173,6 +180,14 @@ public final class SolidRoundedButtonNode: ASDisplayNode { } } + public var animationSize: CGSize = CGSize(width: 30.0, height: 30.0) { + didSet { + if let width = self.validLayout { + _ = self.updateLayout(width: width, transition: .immediate) + } + } + } + public var iconPosition: SolidRoundedButtonIconPosition = .left { didSet { if let width = self.validLayout { @@ -559,7 +574,7 @@ public final class SolidRoundedButtonNode: ASDisplayNode { let iconSize: CGSize if let _ = self.animationNode { - iconSize = CGSize(width: 30.0, height: 30.0) + iconSize = self.animationSize } else { iconSize = self.iconNode.image?.size ?? CGSize() } @@ -794,6 +809,13 @@ public final class SolidRoundedButtonView: UIView { self.animationTimer = timer timer.start() } + } else { + self.animationNode?.play() + let timer = SwiftSignalKit.Timer(timeout: 4.0, repeat: true, completion: { [weak self] in + self?.animationNode?.play() + }, queue: Queue.mainQueue()) + self.animationTimer = timer + timer.start() } } } else if let animationNode = self.animationNode { diff --git a/submodules/TelegramApi/Sources/Api0.swift b/submodules/TelegramApi/Sources/Api0.swift index eca711ed97..4df27e6e4a 100644 --- a/submodules/TelegramApi/Sources/Api0.swift +++ b/submodules/TelegramApi/Sources/Api0.swift @@ -181,7 +181,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[2104790276] = { return Api.DataJSON.parse_dataJSON($0) } dict[414687501] = { return Api.DcOption.parse_dcOption($0) } dict[1135897376] = { return Api.DefaultHistoryTTL.parse_defaultHistoryTTL($0) } - dict[-1460809483] = { return Api.Dialog.parse_dialog($0) } + dict[-712374074] = { return Api.Dialog.parse_dialog($0) } dict[1908216652] = { return Api.Dialog.parse_dialogFolder($0) } dict[1949890536] = { return Api.DialogFilter.parse_dialogFilter($0) } dict[909284270] = { return Api.DialogFilter.parse_dialogFilterDefault($0) } @@ -225,6 +225,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[594758406] = { return Api.EncryptedMessage.parse_encryptedMessageService($0) } dict[179611673] = { return Api.ExportedChatInvite.parse_chatInviteExported($0) } dict[-317687113] = { return Api.ExportedChatInvite.parse_chatInvitePublicJoinRequests($0) } + dict[1103040667] = { return Api.ExportedContactToken.parse_exportedContactToken($0) } dict[1571494644] = { return Api.ExportedMessageLink.parse_exportedMessageLink($0) } dict[-207944868] = { return Api.FileHash.parse_fileHash($0) } dict[-11252123] = { return Api.Folder.parse_folder($0) } @@ -455,7 +456,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[-648257196] = { return Api.MessageAction.parse_messageActionSecureValuesSent($0) } dict[455635795] = { return Api.MessageAction.parse_messageActionSecureValuesSentMe($0) } dict[-1434950843] = { return Api.MessageAction.parse_messageActionSetChatTheme($0) } - dict[-1441072131] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) } + dict[1007897979] = { return Api.MessageAction.parse_messageActionSetMessagesTTL($0) } dict[228168278] = { return Api.MessageAction.parse_messageActionTopicCreate($0) } dict[-1064024032] = { return Api.MessageAction.parse_messageActionTopicEdit($0) } dict[-1262252875] = { return Api.MessageAction.parse_messageActionWebViewDataSent($0) } @@ -938,6 +939,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1148485274] = { return Api.auth.Authorization.parse_authorizationSignUpRequired($0) } dict[1948046307] = { return Api.auth.CodeType.parse_codeTypeCall($0) } dict[577556219] = { return Api.auth.CodeType.parse_codeTypeFlashCall($0) } + dict[116234636] = { return Api.auth.CodeType.parse_codeTypeFragmentSms($0) } dict[-702884114] = { return Api.auth.CodeType.parse_codeTypeMissedCall($0) } dict[1923290508] = { return Api.auth.CodeType.parse_codeTypeSms($0) } dict[-1271602504] = { return Api.auth.ExportedAuthorization.parse_exportedAuthorization($0) } @@ -951,6 +953,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = { dict[1398007207] = { return Api.auth.SentCodeType.parse_sentCodeTypeCall($0) } dict[1511364673] = { return Api.auth.SentCodeType.parse_sentCodeTypeEmailCode($0) } dict[-1425815847] = { return Api.auth.SentCodeType.parse_sentCodeTypeFlashCall($0) } + dict[-648651719] = { return Api.auth.SentCodeType.parse_sentCodeTypeFragmentSms($0) } dict[-2113903484] = { return Api.auth.SentCodeType.parse_sentCodeTypeMissedCall($0) } dict[-1521934870] = { return Api.auth.SentCodeType.parse_sentCodeTypeSetUpEmailRequired($0) } dict[-1073693790] = { return Api.auth.SentCodeType.parse_sentCodeTypeSms($0) } @@ -1294,6 +1297,8 @@ public extension Api { _1.serialize(buffer, boxed) case let _1 as Api.ExportedChatInvite: _1.serialize(buffer, boxed) + case let _1 as Api.ExportedContactToken: + _1.serialize(buffer, boxed) case let _1 as Api.ExportedMessageLink: _1.serialize(buffer, boxed) case let _1 as Api.FileHash: diff --git a/submodules/TelegramApi/Sources/Api11.swift b/submodules/TelegramApi/Sources/Api11.swift index 407ec13c3d..f2b27273ff 100644 --- a/submodules/TelegramApi/Sources/Api11.swift +++ b/submodules/TelegramApi/Sources/Api11.swift @@ -1018,7 +1018,7 @@ public extension Api { case messageActionSecureValuesSent(types: [Api.SecureValueType]) case messageActionSecureValuesSentMe(values: [Api.SecureValue], credentials: Api.SecureCredentialsEncrypted) case messageActionSetChatTheme(emoticon: String) - case messageActionSetMessagesTTL(period: Int32) + case messageActionSetMessagesTTL(flags: Int32, period: Int32, autoSettingFrom: Int64?) case messageActionTopicCreate(flags: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?) case messageActionTopicEdit(flags: Int32, title: String?, iconEmojiId: Int64?, closed: Api.Bool?, hidden: Api.Bool?) case messageActionWebViewDataSent(text: String) @@ -1250,11 +1250,13 @@ public extension Api { } serializeString(emoticon, buffer: buffer, boxed: false) break - case .messageActionSetMessagesTTL(let period): + case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom): if boxed { - buffer.appendInt32(-1441072131) + buffer.appendInt32(1007897979) } + serializeInt32(flags, buffer: buffer, boxed: false) serializeInt32(period, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeInt64(autoSettingFrom!, buffer: buffer, boxed: false)} break case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId): if boxed { @@ -1353,8 +1355,8 @@ public extension Api { return ("messageActionSecureValuesSentMe", [("values", String(describing: values)), ("credentials", String(describing: credentials))]) case .messageActionSetChatTheme(let emoticon): return ("messageActionSetChatTheme", [("emoticon", String(describing: emoticon))]) - case .messageActionSetMessagesTTL(let period): - return ("messageActionSetMessagesTTL", [("period", String(describing: period))]) + case .messageActionSetMessagesTTL(let flags, let period, let autoSettingFrom): + return ("messageActionSetMessagesTTL", [("flags", String(describing: flags)), ("period", String(describing: period)), ("autoSettingFrom", String(describing: autoSettingFrom))]) case .messageActionTopicCreate(let flags, let title, let iconColor, let iconEmojiId): return ("messageActionTopicCreate", [("flags", String(describing: flags)), ("title", String(describing: title)), ("iconColor", String(describing: iconColor)), ("iconEmojiId", String(describing: iconEmojiId))]) case .messageActionTopicEdit(let flags, let title, let iconEmojiId, let closed, let hidden): @@ -1745,9 +1747,15 @@ public extension Api { public static func parse_messageActionSetMessagesTTL(_ reader: BufferReader) -> MessageAction? { var _1: Int32? _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: Int64? + if Int(_1!) & Int(1 << 0) != 0 {_3 = reader.readInt64() } let _c1 = _1 != nil - if _c1 { - return Api.MessageAction.messageActionSetMessagesTTL(period: _1!) + let _c2 = _2 != nil + let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil + if _c1 && _c2 && _c3 { + return Api.MessageAction.messageActionSetMessagesTTL(flags: _1!, period: _2!, autoSettingFrom: _3) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api23.swift b/submodules/TelegramApi/Sources/Api23.swift index ec423f45e7..b84c84469b 100644 --- a/submodules/TelegramApi/Sources/Api23.swift +++ b/submodules/TelegramApi/Sources/Api23.swift @@ -2,6 +2,7 @@ public extension Api.auth { enum CodeType: TypeConstructorDescription { case codeTypeCall case codeTypeFlashCall + case codeTypeFragmentSms case codeTypeMissedCall case codeTypeSms @@ -18,6 +19,12 @@ public extension Api.auth { buffer.appendInt32(577556219) } + break + case .codeTypeFragmentSms: + if boxed { + buffer.appendInt32(116234636) + } + break case .codeTypeMissedCall: if boxed { @@ -40,6 +47,8 @@ public extension Api.auth { return ("codeTypeCall", []) case .codeTypeFlashCall: return ("codeTypeFlashCall", []) + case .codeTypeFragmentSms: + return ("codeTypeFragmentSms", []) case .codeTypeMissedCall: return ("codeTypeMissedCall", []) case .codeTypeSms: @@ -53,6 +62,9 @@ public extension Api.auth { public static func parse_codeTypeFlashCall(_ reader: BufferReader) -> CodeType? { return Api.auth.CodeType.codeTypeFlashCall } + public static func parse_codeTypeFragmentSms(_ reader: BufferReader) -> CodeType? { + return Api.auth.CodeType.codeTypeFragmentSms + } public static func parse_codeTypeMissedCall(_ reader: BufferReader) -> CodeType? { return Api.auth.CodeType.codeTypeMissedCall } @@ -326,6 +338,7 @@ public extension Api.auth { case sentCodeTypeCall(length: Int32) case sentCodeTypeEmailCode(flags: Int32, emailPattern: String, length: Int32, nextPhoneLoginDate: Int32?) case sentCodeTypeFlashCall(pattern: String) + case sentCodeTypeFragmentSms(url: String, length: Int32) case sentCodeTypeMissedCall(prefix: String, length: Int32) case sentCodeTypeSetUpEmailRequired(flags: Int32) case sentCodeTypeSms(length: Int32) @@ -359,6 +372,13 @@ public extension Api.auth { } serializeString(pattern, buffer: buffer, boxed: false) break + case .sentCodeTypeFragmentSms(let url, let length): + if boxed { + buffer.appendInt32(-648651719) + } + serializeString(url, buffer: buffer, boxed: false) + serializeInt32(length, buffer: buffer, boxed: false) + break case .sentCodeTypeMissedCall(let prefix, let length): if boxed { buffer.appendInt32(-2113903484) @@ -391,6 +411,8 @@ public extension Api.auth { return ("sentCodeTypeEmailCode", [("flags", String(describing: flags)), ("emailPattern", String(describing: emailPattern)), ("length", String(describing: length)), ("nextPhoneLoginDate", String(describing: nextPhoneLoginDate))]) case .sentCodeTypeFlashCall(let pattern): return ("sentCodeTypeFlashCall", [("pattern", String(describing: pattern))]) + case .sentCodeTypeFragmentSms(let url, let length): + return ("sentCodeTypeFragmentSms", [("url", String(describing: url)), ("length", String(describing: length))]) case .sentCodeTypeMissedCall(let prefix, let length): return ("sentCodeTypeMissedCall", [("prefix", String(describing: prefix)), ("length", String(describing: length))]) case .sentCodeTypeSetUpEmailRequired(let flags): @@ -453,6 +475,20 @@ public extension Api.auth { return nil } } + public static func parse_sentCodeTypeFragmentSms(_ reader: BufferReader) -> SentCodeType? { + var _1: String? + _1 = parseString(reader) + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.auth.SentCodeType.sentCodeTypeFragmentSms(url: _1!, length: _2!) + } + else { + return nil + } + } public static func parse_sentCodeTypeMissedCall(_ reader: BufferReader) -> SentCodeType? { var _1: String? _1 = parseString(reader) @@ -1134,89 +1170,3 @@ public extension Api.contacts { } } -public extension Api.contacts { - enum TopPeers: TypeConstructorDescription { - case topPeers(categories: [Api.TopPeerCategoryPeers], chats: [Api.Chat], users: [Api.User]) - case topPeersDisabled - case topPeersNotModified - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .topPeers(let categories, let chats, let users): - if boxed { - buffer.appendInt32(1891070632) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(categories.count)) - for item in categories { - item.serialize(buffer, true) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(chats.count)) - for item in chats { - item.serialize(buffer, true) - } - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(users.count)) - for item in users { - item.serialize(buffer, true) - } - break - case .topPeersDisabled: - if boxed { - buffer.appendInt32(-1255369827) - } - - break - case .topPeersNotModified: - if boxed { - buffer.appendInt32(-567906571) - } - - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .topPeers(let categories, let chats, let users): - return ("topPeers", [("categories", String(describing: categories)), ("chats", String(describing: chats)), ("users", String(describing: users))]) - case .topPeersDisabled: - return ("topPeersDisabled", []) - case .topPeersNotModified: - return ("topPeersNotModified", []) - } - } - - public static func parse_topPeers(_ reader: BufferReader) -> TopPeers? { - var _1: [Api.TopPeerCategoryPeers]? - if let _ = reader.readInt32() { - _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.TopPeerCategoryPeers.self) - } - var _2: [Api.Chat]? - if let _ = reader.readInt32() { - _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) - } - var _3: [Api.User]? - if let _ = reader.readInt32() { - _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - if _c1 && _c2 && _c3 { - return Api.contacts.TopPeers.topPeers(categories: _1!, chats: _2!, users: _3!) - } - else { - return nil - } - } - public static func parse_topPeersDisabled(_ reader: BufferReader) -> TopPeers? { - return Api.contacts.TopPeers.topPeersDisabled - } - public static func parse_topPeersNotModified(_ reader: BufferReader) -> TopPeers? { - return Api.contacts.TopPeers.topPeersNotModified - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api24.swift b/submodules/TelegramApi/Sources/Api24.swift index f3e8113f14..fa5f9162c9 100644 --- a/submodules/TelegramApi/Sources/Api24.swift +++ b/submodules/TelegramApi/Sources/Api24.swift @@ -1,3 +1,89 @@ +public extension Api.contacts { + enum TopPeers: TypeConstructorDescription { + case topPeers(categories: [Api.TopPeerCategoryPeers], chats: [Api.Chat], users: [Api.User]) + case topPeersDisabled + case topPeersNotModified + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .topPeers(let categories, let chats, let users): + if boxed { + buffer.appendInt32(1891070632) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(categories.count)) + for item in categories { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(chats.count)) + for item in chats { + item.serialize(buffer, true) + } + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + break + case .topPeersDisabled: + if boxed { + buffer.appendInt32(-1255369827) + } + + break + case .topPeersNotModified: + if boxed { + buffer.appendInt32(-567906571) + } + + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .topPeers(let categories, let chats, let users): + return ("topPeers", [("categories", String(describing: categories)), ("chats", String(describing: chats)), ("users", String(describing: users))]) + case .topPeersDisabled: + return ("topPeersDisabled", []) + case .topPeersNotModified: + return ("topPeersNotModified", []) + } + } + + public static func parse_topPeers(_ reader: BufferReader) -> TopPeers? { + var _1: [Api.TopPeerCategoryPeers]? + if let _ = reader.readInt32() { + _1 = Api.parseVector(reader, elementSignature: 0, elementType: Api.TopPeerCategoryPeers.self) + } + var _2: [Api.Chat]? + if let _ = reader.readInt32() { + _2 = Api.parseVector(reader, elementSignature: 0, elementType: Api.Chat.self) + } + var _3: [Api.User]? + if let _ = reader.readInt32() { + _3 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + if _c1 && _c2 && _c3 { + return Api.contacts.TopPeers.topPeers(categories: _1!, chats: _2!, users: _3!) + } + else { + return nil + } + } + public static func parse_topPeersDisabled(_ reader: BufferReader) -> TopPeers? { + return Api.contacts.TopPeers.topPeersDisabled + } + public static func parse_topPeersNotModified(_ reader: BufferReader) -> TopPeers? { + return Api.contacts.TopPeers.topPeersNotModified + } + + } +} public extension Api.help { enum AppUpdate: TypeConstructorDescription { case appUpdate(flags: Int32, id: Int32, version: String, text: String, entities: [Api.MessageEntity], document: Api.Document?, url: String?, sticker: Api.Document?) @@ -1220,125 +1306,3 @@ public extension Api.messages { } } -public extension Api.messages { - enum BotCallbackAnswer: TypeConstructorDescription { - case botCallbackAnswer(flags: Int32, message: String?, url: String?, cacheTime: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .botCallbackAnswer(let flags, let message, let url, let cacheTime): - if boxed { - buffer.appendInt32(911761060) - } - serializeInt32(flags, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeString(message!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 2) != 0 {serializeString(url!, buffer: buffer, boxed: false)} - serializeInt32(cacheTime, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .botCallbackAnswer(let flags, let message, let url, let cacheTime): - return ("botCallbackAnswer", [("flags", String(describing: flags)), ("message", String(describing: message)), ("url", String(describing: url)), ("cacheTime", String(describing: cacheTime))]) - } - } - - public static func parse_botCallbackAnswer(_ reader: BufferReader) -> BotCallbackAnswer? { - var _1: Int32? - _1 = reader.readInt32() - var _2: String? - if Int(_1!) & Int(1 << 0) != 0 {_2 = parseString(reader) } - var _3: String? - if Int(_1!) & Int(1 << 2) != 0 {_3 = parseString(reader) } - var _4: Int32? - _4 = reader.readInt32() - let _c1 = _1 != nil - let _c2 = (Int(_1!) & Int(1 << 0) == 0) || _2 != nil - let _c3 = (Int(_1!) & Int(1 << 2) == 0) || _3 != nil - let _c4 = _4 != nil - if _c1 && _c2 && _c3 && _c4 { - return Api.messages.BotCallbackAnswer.botCallbackAnswer(flags: _1!, message: _2, url: _3, cacheTime: _4!) - } - else { - return nil - } - } - - } -} -public extension Api.messages { - enum BotResults: TypeConstructorDescription { - case botResults(flags: Int32, queryId: Int64, nextOffset: String?, switchPm: Api.InlineBotSwitchPM?, results: [Api.BotInlineResult], cacheTime: Int32, users: [Api.User]) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): - if boxed { - buffer.appendInt32(-1803769784) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt64(queryId, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 1) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} - if Int(flags) & Int(1 << 2) != 0 {switchPm!.serialize(buffer, true)} - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(results.count)) - for item in results { - item.serialize(buffer, true) - } - serializeInt32(cacheTime, buffer: buffer, boxed: false) - buffer.appendInt32(481674261) - buffer.appendInt32(Int32(users.count)) - for item in users { - item.serialize(buffer, true) - } - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): - return ("botResults", [("flags", String(describing: flags)), ("queryId", String(describing: queryId)), ("nextOffset", String(describing: nextOffset)), ("switchPm", String(describing: switchPm)), ("results", String(describing: results)), ("cacheTime", String(describing: cacheTime)), ("users", String(describing: users))]) - } - } - - public static func parse_botResults(_ reader: BufferReader) -> BotResults? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int64? - _2 = reader.readInt64() - var _3: String? - if Int(_1!) & Int(1 << 1) != 0 {_3 = parseString(reader) } - var _4: Api.InlineBotSwitchPM? - if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { - _4 = Api.parse(reader, signature: signature) as? Api.InlineBotSwitchPM - } } - var _5: [Api.BotInlineResult]? - if let _ = reader.readInt32() { - _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.BotInlineResult.self) - } - var _6: Int32? - _6 = reader.readInt32() - var _7: [Api.User]? - if let _ = reader.readInt32() { - _7 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) - } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = (Int(_1!) & Int(1 << 1) == 0) || _3 != nil - let _c4 = (Int(_1!) & Int(1 << 2) == 0) || _4 != nil - let _c5 = _5 != nil - let _c6 = _6 != nil - let _c7 = _7 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 { - return Api.messages.BotResults.botResults(flags: _1!, queryId: _2!, nextOffset: _3, switchPm: _4, results: _5!, cacheTime: _6!, users: _7!) - } - else { - return nil - } - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api25.swift b/submodules/TelegramApi/Sources/Api25.swift index c478d9c39a..2be1f04d09 100644 --- a/submodules/TelegramApi/Sources/Api25.swift +++ b/submodules/TelegramApi/Sources/Api25.swift @@ -1,3 +1,125 @@ +public extension Api.messages { + enum BotCallbackAnswer: TypeConstructorDescription { + case botCallbackAnswer(flags: Int32, message: String?, url: String?, cacheTime: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .botCallbackAnswer(let flags, let message, let url, let cacheTime): + if boxed { + buffer.appendInt32(911761060) + } + serializeInt32(flags, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeString(message!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 2) != 0 {serializeString(url!, buffer: buffer, boxed: false)} + serializeInt32(cacheTime, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .botCallbackAnswer(let flags, let message, let url, let cacheTime): + return ("botCallbackAnswer", [("flags", String(describing: flags)), ("message", String(describing: message)), ("url", String(describing: url)), ("cacheTime", String(describing: cacheTime))]) + } + } + + public static func parse_botCallbackAnswer(_ reader: BufferReader) -> BotCallbackAnswer? { + var _1: Int32? + _1 = reader.readInt32() + var _2: String? + if Int(_1!) & Int(1 << 0) != 0 {_2 = parseString(reader) } + var _3: String? + if Int(_1!) & Int(1 << 2) != 0 {_3 = parseString(reader) } + var _4: Int32? + _4 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = (Int(_1!) & Int(1 << 0) == 0) || _2 != nil + let _c3 = (Int(_1!) & Int(1 << 2) == 0) || _3 != nil + let _c4 = _4 != nil + if _c1 && _c2 && _c3 && _c4 { + return Api.messages.BotCallbackAnswer.botCallbackAnswer(flags: _1!, message: _2, url: _3, cacheTime: _4!) + } + else { + return nil + } + } + + } +} +public extension Api.messages { + enum BotResults: TypeConstructorDescription { + case botResults(flags: Int32, queryId: Int64, nextOffset: String?, switchPm: Api.InlineBotSwitchPM?, results: [Api.BotInlineResult], cacheTime: Int32, users: [Api.User]) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): + if boxed { + buffer.appendInt32(-1803769784) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt64(queryId, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 1) != 0 {serializeString(nextOffset!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 2) != 0 {switchPm!.serialize(buffer, true)} + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(results.count)) + for item in results { + item.serialize(buffer, true) + } + serializeInt32(cacheTime, buffer: buffer, boxed: false) + buffer.appendInt32(481674261) + buffer.appendInt32(Int32(users.count)) + for item in users { + item.serialize(buffer, true) + } + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .botResults(let flags, let queryId, let nextOffset, let switchPm, let results, let cacheTime, let users): + return ("botResults", [("flags", String(describing: flags)), ("queryId", String(describing: queryId)), ("nextOffset", String(describing: nextOffset)), ("switchPm", String(describing: switchPm)), ("results", String(describing: results)), ("cacheTime", String(describing: cacheTime)), ("users", String(describing: users))]) + } + } + + public static func parse_botResults(_ reader: BufferReader) -> BotResults? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int64? + _2 = reader.readInt64() + var _3: String? + if Int(_1!) & Int(1 << 1) != 0 {_3 = parseString(reader) } + var _4: Api.InlineBotSwitchPM? + if Int(_1!) & Int(1 << 2) != 0 {if let signature = reader.readInt32() { + _4 = Api.parse(reader, signature: signature) as? Api.InlineBotSwitchPM + } } + var _5: [Api.BotInlineResult]? + if let _ = reader.readInt32() { + _5 = Api.parseVector(reader, elementSignature: 0, elementType: Api.BotInlineResult.self) + } + var _6: Int32? + _6 = reader.readInt32() + var _7: [Api.User]? + if let _ = reader.readInt32() { + _7 = Api.parseVector(reader, elementSignature: 0, elementType: Api.User.self) + } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = (Int(_1!) & Int(1 << 1) == 0) || _3 != nil + let _c4 = (Int(_1!) & Int(1 << 2) == 0) || _4 != nil + let _c5 = _5 != nil + let _c6 = _6 != nil + let _c7 = _7 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 { + return Api.messages.BotResults.botResults(flags: _1!, queryId: _2!, nextOffset: _3, switchPm: _4, results: _5!, cacheTime: _6!, users: _7!) + } + else { + return nil + } + } + + } +} public extension Api.messages { enum ChatAdminsWithInvites: TypeConstructorDescription { case chatAdminsWithInvites(admins: [Api.ChatAdminWithInvites], users: [Api.User]) diff --git a/submodules/TelegramApi/Sources/Api29.swift b/submodules/TelegramApi/Sources/Api29.swift index f5443acdc0..5ca1f4e3b3 100644 --- a/submodules/TelegramApi/Sources/Api29.swift +++ b/submodules/TelegramApi/Sources/Api29.swift @@ -2853,6 +2853,21 @@ public extension Api.functions.contacts { }) } } +public extension Api.functions.contacts { + static func exportContactToken() -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(-127582169) + + return (FunctionDescription(name: "contacts.exportContactToken", parameters: []), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.ExportedContactToken? in + let reader = BufferReader(buffer) + var result: Api.ExportedContactToken? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.ExportedContactToken + } + return result + }) + } +} public extension Api.functions.contacts { static func getBlocked(offset: Int32, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() @@ -2964,6 +2979,21 @@ public extension Api.functions.contacts { }) } } +public extension Api.functions.contacts { + static func importContactToken(token: String) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + let buffer = Buffer() + buffer.appendInt32(318789512) + serializeString(token, buffer: buffer, boxed: false) + return (FunctionDescription(name: "contacts.importContactToken", parameters: [("token", String(describing: token))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.User? in + let reader = BufferReader(buffer) + var result: Api.User? + if let signature = reader.readInt32() { + result = Api.parse(reader, signature: signature) as? Api.User + } + return result + }) + } +} public extension Api.functions.contacts { static func importContacts(contacts: [Api.InputContact]) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() diff --git a/submodules/TelegramApi/Sources/Api4.swift b/submodules/TelegramApi/Sources/Api4.swift index 052c017a21..9b7ed73b7a 100644 --- a/submodules/TelegramApi/Sources/Api4.swift +++ b/submodules/TelegramApi/Sources/Api4.swift @@ -874,14 +874,14 @@ public extension Api { } public extension Api { enum Dialog: TypeConstructorDescription { - case dialog(flags: Int32, peer: Api.Peer, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, unreadReactionsCount: Int32, notifySettings: Api.PeerNotifySettings, pts: Int32?, draft: Api.DraftMessage?, folderId: Int32?) + case dialog(flags: Int32, peer: Api.Peer, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, unreadReactionsCount: Int32, notifySettings: Api.PeerNotifySettings, pts: Int32?, draft: Api.DraftMessage?, folderId: Int32?, ttlPeriod: Int32?) case dialogFolder(flags: Int32, folder: Api.Folder, peer: Api.Peer, topMessage: Int32, unreadMutedPeersCount: Int32, unreadUnmutedPeersCount: Int32, unreadMutedMessagesCount: Int32, unreadUnmutedMessagesCount: Int32) public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { switch self { - case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let notifySettings, let pts, let draft, let folderId): + case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let notifySettings, let pts, let draft, let folderId, let ttlPeriod): if boxed { - buffer.appendInt32(-1460809483) + buffer.appendInt32(-712374074) } serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) @@ -895,6 +895,7 @@ public extension Api { if Int(flags) & Int(1 << 0) != 0 {serializeInt32(pts!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 1) != 0 {draft!.serialize(buffer, true)} if Int(flags) & Int(1 << 4) != 0 {serializeInt32(folderId!, buffer: buffer, boxed: false)} + if Int(flags) & Int(1 << 5) != 0 {serializeInt32(ttlPeriod!, buffer: buffer, boxed: false)} break case .dialogFolder(let flags, let folder, let peer, let topMessage, let unreadMutedPeersCount, let unreadUnmutedPeersCount, let unreadMutedMessagesCount, let unreadUnmutedMessagesCount): if boxed { @@ -914,8 +915,8 @@ public extension Api { public func descriptionFields() -> (String, [(String, Any)]) { switch self { - case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let notifySettings, let pts, let draft, let folderId): - return ("dialog", [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMessage", String(describing: topMessage)), ("readInboxMaxId", String(describing: readInboxMaxId)), ("readOutboxMaxId", String(describing: readOutboxMaxId)), ("unreadCount", String(describing: unreadCount)), ("unreadMentionsCount", String(describing: unreadMentionsCount)), ("unreadReactionsCount", String(describing: unreadReactionsCount)), ("notifySettings", String(describing: notifySettings)), ("pts", String(describing: pts)), ("draft", String(describing: draft)), ("folderId", String(describing: folderId))]) + case .dialog(let flags, let peer, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let notifySettings, let pts, let draft, let folderId, let ttlPeriod): + return ("dialog", [("flags", String(describing: flags)), ("peer", String(describing: peer)), ("topMessage", String(describing: topMessage)), ("readInboxMaxId", String(describing: readInboxMaxId)), ("readOutboxMaxId", String(describing: readOutboxMaxId)), ("unreadCount", String(describing: unreadCount)), ("unreadMentionsCount", String(describing: unreadMentionsCount)), ("unreadReactionsCount", String(describing: unreadReactionsCount)), ("notifySettings", String(describing: notifySettings)), ("pts", String(describing: pts)), ("draft", String(describing: draft)), ("folderId", String(describing: folderId)), ("ttlPeriod", String(describing: ttlPeriod))]) case .dialogFolder(let flags, let folder, let peer, let topMessage, let unreadMutedPeersCount, let unreadUnmutedPeersCount, let unreadMutedMessagesCount, let unreadUnmutedMessagesCount): return ("dialogFolder", [("flags", String(describing: flags)), ("folder", String(describing: folder)), ("peer", String(describing: peer)), ("topMessage", String(describing: topMessage)), ("unreadMutedPeersCount", String(describing: unreadMutedPeersCount)), ("unreadUnmutedPeersCount", String(describing: unreadUnmutedPeersCount)), ("unreadMutedMessagesCount", String(describing: unreadMutedMessagesCount)), ("unreadUnmutedMessagesCount", String(describing: unreadUnmutedMessagesCount))]) } @@ -952,6 +953,8 @@ public extension Api { } } var _12: Int32? if Int(_1!) & Int(1 << 4) != 0 {_12 = reader.readInt32() } + var _13: Int32? + if Int(_1!) & Int(1 << 5) != 0 {_13 = reader.readInt32() } let _c1 = _1 != nil let _c2 = _2 != nil let _c3 = _3 != nil @@ -964,8 +967,9 @@ public extension Api { let _c10 = (Int(_1!) & Int(1 << 0) == 0) || _10 != nil let _c11 = (Int(_1!) & Int(1 << 1) == 0) || _11 != nil let _c12 = (Int(_1!) & Int(1 << 4) == 0) || _12 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 { - return Api.Dialog.dialog(flags: _1!, peer: _2!, topMessage: _3!, readInboxMaxId: _4!, readOutboxMaxId: _5!, unreadCount: _6!, unreadMentionsCount: _7!, unreadReactionsCount: _8!, notifySettings: _9!, pts: _10, draft: _11, folderId: _12) + let _c13 = (Int(_1!) & Int(1 << 5) == 0) || _13 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 { + return Api.Dialog.dialog(flags: _1!, peer: _2!, topMessage: _3!, readInboxMaxId: _4!, readOutboxMaxId: _5!, unreadCount: _6!, unreadMentionsCount: _7!, unreadReactionsCount: _8!, notifySettings: _9!, pts: _10, draft: _11, folderId: _12, ttlPeriod: _13) } else { return nil diff --git a/submodules/TelegramApi/Sources/Api5.swift b/submodules/TelegramApi/Sources/Api5.swift index d6cc8b29fe..42ddc4ef5a 100644 --- a/submodules/TelegramApi/Sources/Api5.swift +++ b/submodules/TelegramApi/Sources/Api5.swift @@ -916,6 +916,46 @@ public extension Api { } } +public extension Api { + enum ExportedContactToken: TypeConstructorDescription { + case exportedContactToken(url: String, expires: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .exportedContactToken(let url, let expires): + if boxed { + buffer.appendInt32(1103040667) + } + serializeString(url, buffer: buffer, boxed: false) + serializeInt32(expires, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .exportedContactToken(let url, let expires): + return ("exportedContactToken", [("url", String(describing: url)), ("expires", String(describing: expires))]) + } + } + + public static func parse_exportedContactToken(_ reader: BufferReader) -> ExportedContactToken? { + var _1: String? + _1 = parseString(reader) + var _2: Int32? + _2 = reader.readInt32() + let _c1 = _1 != nil + let _c2 = _2 != nil + if _c1 && _c2 { + return Api.ExportedContactToken.exportedContactToken(url: _1!, expires: _2!) + } + else { + return nil + } + } + + } +} public extension Api { enum ExportedMessageLink: TypeConstructorDescription { case exportedMessageLink(link: String, html: String) @@ -1092,121 +1132,3 @@ public extension Api { } } -public extension Api { - enum ForumTopic: TypeConstructorDescription { - case forumTopic(flags: Int32, id: Int32, date: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, unreadReactionsCount: Int32, fromId: Api.Peer, notifySettings: Api.PeerNotifySettings, draft: Api.DraftMessage?) - case forumTopicDeleted(id: Int32) - - public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { - switch self { - case .forumTopic(let flags, let id, let date, let title, let iconColor, let iconEmojiId, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let fromId, let notifySettings, let draft): - if boxed { - buffer.appendInt32(1903173033) - } - serializeInt32(flags, buffer: buffer, boxed: false) - serializeInt32(id, buffer: buffer, boxed: false) - serializeInt32(date, buffer: buffer, boxed: false) - serializeString(title, buffer: buffer, boxed: false) - serializeInt32(iconColor, buffer: buffer, boxed: false) - if Int(flags) & Int(1 << 0) != 0 {serializeInt64(iconEmojiId!, buffer: buffer, boxed: false)} - serializeInt32(topMessage, buffer: buffer, boxed: false) - serializeInt32(readInboxMaxId, buffer: buffer, boxed: false) - serializeInt32(readOutboxMaxId, buffer: buffer, boxed: false) - serializeInt32(unreadCount, buffer: buffer, boxed: false) - serializeInt32(unreadMentionsCount, buffer: buffer, boxed: false) - serializeInt32(unreadReactionsCount, buffer: buffer, boxed: false) - fromId.serialize(buffer, true) - notifySettings.serialize(buffer, true) - if Int(flags) & Int(1 << 4) != 0 {draft!.serialize(buffer, true)} - break - case .forumTopicDeleted(let id): - if boxed { - buffer.appendInt32(37687451) - } - serializeInt32(id, buffer: buffer, boxed: false) - break - } - } - - public func descriptionFields() -> (String, [(String, Any)]) { - switch self { - case .forumTopic(let flags, let id, let date, let title, let iconColor, let iconEmojiId, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let fromId, let notifySettings, let draft): - return ("forumTopic", [("flags", String(describing: flags)), ("id", String(describing: id)), ("date", String(describing: date)), ("title", String(describing: title)), ("iconColor", String(describing: iconColor)), ("iconEmojiId", String(describing: iconEmojiId)), ("topMessage", String(describing: topMessage)), ("readInboxMaxId", String(describing: readInboxMaxId)), ("readOutboxMaxId", String(describing: readOutboxMaxId)), ("unreadCount", String(describing: unreadCount)), ("unreadMentionsCount", String(describing: unreadMentionsCount)), ("unreadReactionsCount", String(describing: unreadReactionsCount)), ("fromId", String(describing: fromId)), ("notifySettings", String(describing: notifySettings)), ("draft", String(describing: draft))]) - case .forumTopicDeleted(let id): - return ("forumTopicDeleted", [("id", String(describing: id))]) - } - } - - public static func parse_forumTopic(_ reader: BufferReader) -> ForumTopic? { - var _1: Int32? - _1 = reader.readInt32() - var _2: Int32? - _2 = reader.readInt32() - var _3: Int32? - _3 = reader.readInt32() - var _4: String? - _4 = parseString(reader) - var _5: Int32? - _5 = reader.readInt32() - var _6: Int64? - if Int(_1!) & Int(1 << 0) != 0 {_6 = reader.readInt64() } - var _7: Int32? - _7 = reader.readInt32() - var _8: Int32? - _8 = reader.readInt32() - var _9: Int32? - _9 = reader.readInt32() - var _10: Int32? - _10 = reader.readInt32() - var _11: Int32? - _11 = reader.readInt32() - var _12: Int32? - _12 = reader.readInt32() - var _13: Api.Peer? - if let signature = reader.readInt32() { - _13 = Api.parse(reader, signature: signature) as? Api.Peer - } - var _14: Api.PeerNotifySettings? - if let signature = reader.readInt32() { - _14 = Api.parse(reader, signature: signature) as? Api.PeerNotifySettings - } - var _15: Api.DraftMessage? - if Int(_1!) & Int(1 << 4) != 0 {if let signature = reader.readInt32() { - _15 = Api.parse(reader, signature: signature) as? Api.DraftMessage - } } - let _c1 = _1 != nil - let _c2 = _2 != nil - let _c3 = _3 != nil - let _c4 = _4 != nil - let _c5 = _5 != nil - let _c6 = (Int(_1!) & Int(1 << 0) == 0) || _6 != nil - let _c7 = _7 != nil - let _c8 = _8 != nil - let _c9 = _9 != nil - let _c10 = _10 != nil - let _c11 = _11 != nil - let _c12 = _12 != nil - let _c13 = _13 != nil - let _c14 = _14 != nil - let _c15 = (Int(_1!) & Int(1 << 4) == 0) || _15 != nil - if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 { - return Api.ForumTopic.forumTopic(flags: _1!, id: _2!, date: _3!, title: _4!, iconColor: _5!, iconEmojiId: _6, topMessage: _7!, readInboxMaxId: _8!, readOutboxMaxId: _9!, unreadCount: _10!, unreadMentionsCount: _11!, unreadReactionsCount: _12!, fromId: _13!, notifySettings: _14!, draft: _15) - } - else { - return nil - } - } - public static func parse_forumTopicDeleted(_ reader: BufferReader) -> ForumTopic? { - var _1: Int32? - _1 = reader.readInt32() - let _c1 = _1 != nil - if _c1 { - return Api.ForumTopic.forumTopicDeleted(id: _1!) - } - else { - return nil - } - } - - } -} diff --git a/submodules/TelegramApi/Sources/Api6.swift b/submodules/TelegramApi/Sources/Api6.swift index 7177c5d984..f59d75fea7 100644 --- a/submodules/TelegramApi/Sources/Api6.swift +++ b/submodules/TelegramApi/Sources/Api6.swift @@ -1,3 +1,121 @@ +public extension Api { + enum ForumTopic: TypeConstructorDescription { + case forumTopic(flags: Int32, id: Int32, date: Int32, title: String, iconColor: Int32, iconEmojiId: Int64?, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, unreadReactionsCount: Int32, fromId: Api.Peer, notifySettings: Api.PeerNotifySettings, draft: Api.DraftMessage?) + case forumTopicDeleted(id: Int32) + + public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) { + switch self { + case .forumTopic(let flags, let id, let date, let title, let iconColor, let iconEmojiId, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let fromId, let notifySettings, let draft): + if boxed { + buffer.appendInt32(1903173033) + } + serializeInt32(flags, buffer: buffer, boxed: false) + serializeInt32(id, buffer: buffer, boxed: false) + serializeInt32(date, buffer: buffer, boxed: false) + serializeString(title, buffer: buffer, boxed: false) + serializeInt32(iconColor, buffer: buffer, boxed: false) + if Int(flags) & Int(1 << 0) != 0 {serializeInt64(iconEmojiId!, buffer: buffer, boxed: false)} + serializeInt32(topMessage, buffer: buffer, boxed: false) + serializeInt32(readInboxMaxId, buffer: buffer, boxed: false) + serializeInt32(readOutboxMaxId, buffer: buffer, boxed: false) + serializeInt32(unreadCount, buffer: buffer, boxed: false) + serializeInt32(unreadMentionsCount, buffer: buffer, boxed: false) + serializeInt32(unreadReactionsCount, buffer: buffer, boxed: false) + fromId.serialize(buffer, true) + notifySettings.serialize(buffer, true) + if Int(flags) & Int(1 << 4) != 0 {draft!.serialize(buffer, true)} + break + case .forumTopicDeleted(let id): + if boxed { + buffer.appendInt32(37687451) + } + serializeInt32(id, buffer: buffer, boxed: false) + break + } + } + + public func descriptionFields() -> (String, [(String, Any)]) { + switch self { + case .forumTopic(let flags, let id, let date, let title, let iconColor, let iconEmojiId, let topMessage, let readInboxMaxId, let readOutboxMaxId, let unreadCount, let unreadMentionsCount, let unreadReactionsCount, let fromId, let notifySettings, let draft): + return ("forumTopic", [("flags", String(describing: flags)), ("id", String(describing: id)), ("date", String(describing: date)), ("title", String(describing: title)), ("iconColor", String(describing: iconColor)), ("iconEmojiId", String(describing: iconEmojiId)), ("topMessage", String(describing: topMessage)), ("readInboxMaxId", String(describing: readInboxMaxId)), ("readOutboxMaxId", String(describing: readOutboxMaxId)), ("unreadCount", String(describing: unreadCount)), ("unreadMentionsCount", String(describing: unreadMentionsCount)), ("unreadReactionsCount", String(describing: unreadReactionsCount)), ("fromId", String(describing: fromId)), ("notifySettings", String(describing: notifySettings)), ("draft", String(describing: draft))]) + case .forumTopicDeleted(let id): + return ("forumTopicDeleted", [("id", String(describing: id))]) + } + } + + public static func parse_forumTopic(_ reader: BufferReader) -> ForumTopic? { + var _1: Int32? + _1 = reader.readInt32() + var _2: Int32? + _2 = reader.readInt32() + var _3: Int32? + _3 = reader.readInt32() + var _4: String? + _4 = parseString(reader) + var _5: Int32? + _5 = reader.readInt32() + var _6: Int64? + if Int(_1!) & Int(1 << 0) != 0 {_6 = reader.readInt64() } + var _7: Int32? + _7 = reader.readInt32() + var _8: Int32? + _8 = reader.readInt32() + var _9: Int32? + _9 = reader.readInt32() + var _10: Int32? + _10 = reader.readInt32() + var _11: Int32? + _11 = reader.readInt32() + var _12: Int32? + _12 = reader.readInt32() + var _13: Api.Peer? + if let signature = reader.readInt32() { + _13 = Api.parse(reader, signature: signature) as? Api.Peer + } + var _14: Api.PeerNotifySettings? + if let signature = reader.readInt32() { + _14 = Api.parse(reader, signature: signature) as? Api.PeerNotifySettings + } + var _15: Api.DraftMessage? + if Int(_1!) & Int(1 << 4) != 0 {if let signature = reader.readInt32() { + _15 = Api.parse(reader, signature: signature) as? Api.DraftMessage + } } + let _c1 = _1 != nil + let _c2 = _2 != nil + let _c3 = _3 != nil + let _c4 = _4 != nil + let _c5 = _5 != nil + let _c6 = (Int(_1!) & Int(1 << 0) == 0) || _6 != nil + let _c7 = _7 != nil + let _c8 = _8 != nil + let _c9 = _9 != nil + let _c10 = _10 != nil + let _c11 = _11 != nil + let _c12 = _12 != nil + let _c13 = _13 != nil + let _c14 = _14 != nil + let _c15 = (Int(_1!) & Int(1 << 4) == 0) || _15 != nil + if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 && _c15 { + return Api.ForumTopic.forumTopic(flags: _1!, id: _2!, date: _3!, title: _4!, iconColor: _5!, iconEmojiId: _6, topMessage: _7!, readInboxMaxId: _8!, readOutboxMaxId: _9!, unreadCount: _10!, unreadMentionsCount: _11!, unreadReactionsCount: _12!, fromId: _13!, notifySettings: _14!, draft: _15) + } + else { + return nil + } + } + public static func parse_forumTopicDeleted(_ reader: BufferReader) -> ForumTopic? { + var _1: Int32? + _1 = reader.readInt32() + let _c1 = _1 != nil + if _c1 { + return Api.ForumTopic.forumTopicDeleted(id: _1!) + } + else { + return nil + } + } + + } +} public extension Api { enum Game: TypeConstructorDescription { case game(flags: Int32, id: Int64, accessHash: Int64, shortName: String, title: String, description: String, photo: Api.Photo, document: Api.Document?) diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index ce3f9e2035..4a5c97737a 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -617,7 +617,7 @@ public final class PresentationCallImpl: PresentationCall { self.reportedIncomingCall = true var phoneNumber: String? if let peer = self.peer as? TelegramUser, let phone = peer.phone { - phoneNumber = formatPhoneNumber(phone) + phoneNumber = formatPhoneNumber(context: self.context, number: phone) } self.callKitIntegration?.reportIncomingCall( uuid: self.internalId, diff --git a/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift index 0337e2688e..d04539c652 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCallManager.swift @@ -439,7 +439,7 @@ public final class PresentationCallManagerImpl: PresentationCallManager { } var phoneNumber: String? if let peer = peer as? TelegramUser, let phone = peer.phone { - phoneNumber = formatPhoneNumber(phone) + phoneNumber = formatPhoneNumber(context: context, number: phone) } strongSelf.callKitIntegration?.startCall(context: context, peerId: peerId, phoneNumber: phoneNumber, localContactId: localContactId, isVideo: isVideo, displayTitle: peer.debugDisplayTitle) })) diff --git a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift index 7d23b54086..3a4ba5eaf2 100644 --- a/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift +++ b/submodules/TelegramCore/Sources/ApiUtils/TelegramMediaAction.swift @@ -72,7 +72,7 @@ func telegramMediaActionFromApiAction(_ action: Api.MessageAction) -> TelegramMe PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)) })) } - case let .messageActionSetMessagesTTL(period): + case let .messageActionSetMessagesTTL(period, _, _): return TelegramMediaAction(action: .messageAutoremoveTimeoutUpdated(period)) case let .messageActionGroupCallScheduled(call, scheduleDate): switch call { diff --git a/submodules/TelegramCore/Sources/State/AccountState.swift b/submodules/TelegramCore/Sources/State/AccountState.swift index 6a5ef5f6cc..67ac5d8ba0 100644 --- a/submodules/TelegramCore/Sources/State/AccountState.swift +++ b/submodules/TelegramCore/Sources/State/AccountState.swift @@ -34,6 +34,8 @@ extension SentAuthorizationCodeType { self = .email(emailPattern: emailPattern, length: length, nextPhoneLoginDate: nextPhoneLoginDate, appleSignInAllowed: (flags & (1 << 0)) != 0, setup: false) case let .sentCodeTypeSetUpEmailRequired(flags): self = .emailSetupRequired(appleSignInAllowed: (flags & (1 << 0)) != 0) + case let .sentCodeTypeFragmentSms(url, length): + self = .fragment(url: url, length: length) } } } @@ -49,6 +51,8 @@ extension AuthorizationCodeNextType { self = .flashCall case .codeTypeMissedCall: self = .missedCall + case .codeTypeFragmentSms: + self = .fragment } } } diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index ec67ed0068..1cee550fd0 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -2211,7 +2211,7 @@ private func resolveMissingPeerChatInfos(network: Network, state: AccountMutable for dialog in dialogs { switch dialog { - case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, notifySettings, pts, _, folderId): + case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, notifySettings, pts, _, folderId, _): let peerId = peer.peerId updatedState.setNeedsHoleFromPreviousState(peerId: peerId, namespace: Namespaces.Message.Cloud, validateChannelPts: pts) @@ -2453,7 +2453,7 @@ private func resetChannels(accountPeerId: PeerId, postbox: Postbox, network: Net let apiMarkedUnread: Bool let groupId: PeerGroupId switch dialog { - case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, peerNotificationSettings, pts, _, folderId): + case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, peerNotificationSettings, pts, _, folderId, _): apiPeer = peer apiTopMessage = topMessage apiReadInboxMaxId = readInboxMaxId @@ -2750,7 +2750,7 @@ private func pollChannel(accountPeerId: PeerId, postbox: Postbox, network: Netwo var parameters: (peer: Api.Peer, pts: Int32, topMessage: Int32, readInboxMaxId: Int32, readOutboxMaxId: Int32, unreadCount: Int32, unreadMentionsCount: Int32, unreadReactionsCount: Int32)? switch dialog { - case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, _, pts, _, _): + case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, _, pts, _, _, _): if let pts = pts { parameters = (peer, pts, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount) } diff --git a/submodules/TelegramCore/Sources/State/FetchChatList.swift b/submodules/TelegramCore/Sources/State/FetchChatList.swift index 2784a77955..06a132bd59 100644 --- a/submodules/TelegramCore/Sources/State/FetchChatList.swift +++ b/submodules/TelegramCore/Sources/State/FetchChatList.swift @@ -85,7 +85,7 @@ private func parseDialogs(apiDialogs: [Api.Dialog], apiMessages: [Api.Message], var apiChannelPts: Int32? let apiNotificationSettings: Api.PeerNotifySettings switch dialog { - case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, peerNotificationSettings, pts, _, _): + case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, peerNotificationSettings, pts, _, _, _): if let peer = peers[peer.peerId] { var isExluded = false if let group = peer as? TelegramGroup { diff --git a/submodules/TelegramCore/Sources/State/ManagedConsumePersonalMessagesActions.swift b/submodules/TelegramCore/Sources/State/ManagedConsumePersonalMessagesActions.swift index 7a5890072d..6f3648f8cf 100644 --- a/submodules/TelegramCore/Sources/State/ManagedConsumePersonalMessagesActions.swift +++ b/submodules/TelegramCore/Sources/State/ManagedConsumePersonalMessagesActions.swift @@ -367,7 +367,7 @@ private func synchronizeUnseenPersonalMentionsTag(postbox: Postbox, network: Net let apiTopMessage: Int32 let apiUnreadMentionsCount: Int32 switch dialog { - case let .dialog(_, _, topMessage, _, _, _, unreadMentionsCount, _, _, _, _, _): + case let .dialog(_, _, topMessage, _, _, _, unreadMentionsCount, _, _, _, _, _, _): apiTopMessage = topMessage apiUnreadMentionsCount = unreadMentionsCount @@ -409,7 +409,7 @@ private func synchronizeUnseenReactionsTag(postbox: Postbox, network: Network, e let apiTopMessage: Int32 let apiUnreadReactionsCount: Int32 switch dialog { - case let .dialog(_, _, topMessage, _, _, _, _, unreadReactionsCount, _, _, _, _): + case let .dialog(_, _, topMessage, _, _, _, _, unreadReactionsCount, _, _, _, _, _): apiTopMessage = topMessage apiUnreadReactionsCount = unreadReactionsCount diff --git a/submodules/TelegramCore/Sources/State/ManagedSynchronizePinnedChatsOperations.swift b/submodules/TelegramCore/Sources/State/ManagedSynchronizePinnedChatsOperations.swift index cb0f03c24e..937b95c305 100644 --- a/submodules/TelegramCore/Sources/State/ManagedSynchronizePinnedChatsOperations.swift +++ b/submodules/TelegramCore/Sources/State/ManagedSynchronizePinnedChatsOperations.swift @@ -161,7 +161,7 @@ private func synchronizePinnedChats(transaction: Transaction, postbox: Postbox, var apiChannelPts: Int32? let apiNotificationSettings: Api.PeerNotifySettings switch dialog { - case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _, _, peerNotificationSettings, pts, _, _): + case let .dialog(flags, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _, _, peerNotificationSettings, pts, _, _, _): apiPeer = peer apiTopMessage = topMessage apiReadInboxMaxId = readInboxMaxId diff --git a/submodules/TelegramCore/Sources/State/SynchronizePeerReadState.swift b/submodules/TelegramCore/Sources/State/SynchronizePeerReadState.swift index f6d1487941..bed0706667 100644 --- a/submodules/TelegramCore/Sources/State/SynchronizePeerReadState.swift +++ b/submodules/TelegramCore/Sources/State/SynchronizePeerReadState.swift @@ -87,7 +87,7 @@ private func dialogReadState(network: Network, postbox: Postbox, peerId: PeerId) let apiMarkedUnread: Bool var apiChannelPts: Int32 = 0 switch dialog { - case let .dialog(flags, _, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _, _, _, pts, _, _): + case let .dialog(flags, _, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, _, _, _, pts, _, _, _): apiTopMessage = topMessage apiReadInboxMaxId = readInboxMaxId apiReadOutboxMaxId = readOutboxMaxId diff --git a/submodules/TelegramCore/Sources/State/UpdatesApiUtils.swift b/submodules/TelegramCore/Sources/State/UpdatesApiUtils.swift index f5f4064547..0bf994384c 100644 --- a/submodules/TelegramCore/Sources/State/UpdatesApiUtils.swift +++ b/submodules/TelegramCore/Sources/State/UpdatesApiUtils.swift @@ -181,7 +181,7 @@ extension Api.Peer { extension Api.Dialog { var peerId: PeerId? { switch self { - case let .dialog(_, peer, _, _, _, _, _, _, _, _, _, _): + case let .dialog(_, peer, _, _, _, _, _, _, _, _, _, _, _): return peer.peerId case .dialogFolder: return nil diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_UnauthorizedAccountState.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_UnauthorizedAccountState.swift index 5b98e3674c..72d3bf3024 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_UnauthorizedAccountState.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_UnauthorizedAccountState.swift @@ -8,6 +8,7 @@ private enum SentAuthorizationCodeTypeValue: Int32 { case missedCall = 4 case email = 5 case emailSetupRequired = 6 + case fragment = 7 } public enum SentAuthorizationCodeType: PostboxCoding, Equatable { @@ -18,6 +19,7 @@ public enum SentAuthorizationCodeType: PostboxCoding, Equatable { case missedCall(numberPrefix: String, length: Int32) case email(emailPattern: String, length: Int32, nextPhoneLoginDate: Int32?, appleSignInAllowed: Bool, setup: Bool) case emailSetupRequired(appleSignInAllowed: Bool) + case fragment(url: String, length: Int32) public init(decoder: PostboxDecoder) { switch decoder.decodeInt32ForKey("v", orElse: 0) { @@ -35,6 +37,8 @@ public enum SentAuthorizationCodeType: PostboxCoding, Equatable { self = .email(emailPattern: decoder.decodeStringForKey("e", orElse: ""), length: decoder.decodeInt32ForKey("l", orElse: 0), nextPhoneLoginDate: decoder.decodeOptionalInt32ForKey("d"), appleSignInAllowed: decoder.decodeInt32ForKey("a", orElse: 0) != 0, setup: decoder.decodeInt32ForKey("s", orElse: 0) != 0) case SentAuthorizationCodeTypeValue.emailSetupRequired.rawValue: self = .emailSetupRequired(appleSignInAllowed: decoder.decodeInt32ForKey("a", orElse: 0) != 0) + case SentAuthorizationCodeTypeValue.fragment.rawValue: + self = .fragment(url: decoder.decodeStringForKey("u", orElse: ""), length: decoder.decodeInt32ForKey("l", orElse: 0)) default: preconditionFailure() } @@ -42,36 +46,40 @@ public enum SentAuthorizationCodeType: PostboxCoding, Equatable { public func encode(_ encoder: PostboxEncoder) { switch self { - case let .otherSession(length): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.otherSession.rawValue, forKey: "v") - encoder.encodeInt32(length, forKey: "l") - case let .sms(length): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.sms.rawValue, forKey: "v") - encoder.encodeInt32(length, forKey: "l") - case let .call(length): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.call.rawValue, forKey: "v") - encoder.encodeInt32(length, forKey: "l") - case let .flashCall(pattern): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.flashCall.rawValue, forKey: "v") - encoder.encodeString(pattern, forKey: "p") - case let .missedCall(numberPrefix, length): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.missedCall.rawValue, forKey: "v") - encoder.encodeString(numberPrefix, forKey: "n") - encoder.encodeInt32(length, forKey: "l") - case let .email(emailPattern, length, nextPhoneLoginDate, appleSignInAllowed, setup): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.email.rawValue, forKey: "v") - encoder.encodeString(emailPattern, forKey: "e") - encoder.encodeInt32(length, forKey: "l") - if let nextPhoneLoginDate = nextPhoneLoginDate { - encoder.encodeInt32(nextPhoneLoginDate, forKey: "d") - } else { - encoder.encodeNil(forKey: "d") - } - encoder.encodeInt32(appleSignInAllowed ? 1 : 0, forKey: "a") - encoder.encodeInt32(setup ? 1 : 0, forKey: "s") - case let .emailSetupRequired(appleSignInAllowed): - encoder.encodeInt32(SentAuthorizationCodeTypeValue.emailSetupRequired.rawValue, forKey: "v") - encoder.encodeInt32(appleSignInAllowed ? 1 : 0, forKey: "a") + case let .otherSession(length): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.otherSession.rawValue, forKey: "v") + encoder.encodeInt32(length, forKey: "l") + case let .sms(length): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.sms.rawValue, forKey: "v") + encoder.encodeInt32(length, forKey: "l") + case let .call(length): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.call.rawValue, forKey: "v") + encoder.encodeInt32(length, forKey: "l") + case let .flashCall(pattern): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.flashCall.rawValue, forKey: "v") + encoder.encodeString(pattern, forKey: "p") + case let .missedCall(numberPrefix, length): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.missedCall.rawValue, forKey: "v") + encoder.encodeString(numberPrefix, forKey: "n") + encoder.encodeInt32(length, forKey: "l") + case let .email(emailPattern, length, nextPhoneLoginDate, appleSignInAllowed, setup): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.email.rawValue, forKey: "v") + encoder.encodeString(emailPattern, forKey: "e") + encoder.encodeInt32(length, forKey: "l") + if let nextPhoneLoginDate = nextPhoneLoginDate { + encoder.encodeInt32(nextPhoneLoginDate, forKey: "d") + } else { + encoder.encodeNil(forKey: "d") + } + encoder.encodeInt32(appleSignInAllowed ? 1 : 0, forKey: "a") + encoder.encodeInt32(setup ? 1 : 0, forKey: "s") + case let .emailSetupRequired(appleSignInAllowed): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.emailSetupRequired.rawValue, forKey: "v") + encoder.encodeInt32(appleSignInAllowed ? 1 : 0, forKey: "a") + case let .fragment(url, length): + encoder.encodeInt32(SentAuthorizationCodeTypeValue.fragment.rawValue, forKey: "v") + encoder.encodeString(url, forKey: "u") + encoder.encodeInt32(length, forKey: "l") } } } @@ -81,6 +89,7 @@ public enum AuthorizationCodeNextType: Int32 { case call = 1 case flashCall = 2 case missedCall = 3 + case fragment = 4 } private enum UnauthorizedAccountStateContentsValue: Int32 { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChatListFiltering.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChatListFiltering.swift index e22f2c225e..9a02a227ce 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChatListFiltering.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChatListFiltering.swift @@ -654,7 +654,7 @@ private func loadAndStorePeerChatInfos(accountPeerId: PeerId, postbox: Postbox, for dialog in dialogs { switch dialog { - case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, notifySettings, pts, _, folderId): + case let .dialog(_, peer, topMessage, readInboxMaxId, readOutboxMaxId, unreadCount, unreadMentionsCount, unreadReactionsCount, notifySettings, pts, _, folderId, _): let peerId = peer.peerId if topMessage != 0 { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ContactToken.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ContactToken.swift new file mode 100644 index 0000000000..f5902e1415 --- /dev/null +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ContactToken.swift @@ -0,0 +1,4 @@ +import Foundation +import Postbox +import TelegramApi +import SwiftSignalKit diff --git a/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleView.swift b/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleView.swift index 8a94554f7a..8ab51fdc09 100644 --- a/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleView.swift +++ b/submodules/TelegramUI/Components/ChatTitleView/Sources/ChatTitleView.swift @@ -189,7 +189,7 @@ public final class ChatTitleView: UIView, NavigationBarTitleView { segments = [.text(0, NSAttributedString(string: self.strings.Conversation_SavedMessages, font: titleFont, textColor: titleTheme.rootController.navigationBar.primaryTextColor))] } else { if !peerView.peerIsContact, let user = peer as? TelegramUser, !user.flags.contains(.isSupport), user.botInfo == nil, let phone = user.phone, !phone.isEmpty { - segments = [.text(0, NSAttributedString(string: formatPhoneNumber(phone), font: titleFont, textColor: titleTheme.rootController.navigationBar.primaryTextColor))] + segments = [.text(0, NSAttributedString(string: formatPhoneNumber(context: self.context, number: phone), font: titleFont, textColor: titleTheme.rootController.navigationBar.primaryTextColor))] } else { segments = [.text(0, NSAttributedString(string: EnginePeer(peer).displayTitle(strings: self.strings, displayOrder: self.nameDisplayOrder), font: titleFont, textColor: titleTheme.rootController.navigationBar.primaryTextColor))] } diff --git a/submodules/TelegramUI/Components/EmojiStatusSelectionComponent/Sources/EmojiStatusSelectionComponent.swift b/submodules/TelegramUI/Components/EmojiStatusSelectionComponent/Sources/EmojiStatusSelectionComponent.swift index 7b28eed953..dc34157515 100644 --- a/submodules/TelegramUI/Components/EmojiStatusSelectionComponent/Sources/EmojiStatusSelectionComponent.swift +++ b/submodules/TelegramUI/Components/EmojiStatusSelectionComponent/Sources/EmojiStatusSelectionComponent.swift @@ -184,6 +184,7 @@ public final class EmojiStatusSelectionComponent: Component { makeSearchContainerNode: { _ in return nil }, deviceMetrics: component.deviceMetrics, hiddenInputHeight: 0.0, + inputHeight: 0.0, displayBottomPanel: false, isExpanded: false )), diff --git a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift index 6973a2bdab..a487dd0385 100644 --- a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift +++ b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EmojiPagerContentComponent.swift @@ -1682,6 +1682,7 @@ public final class EmojiSearchHeaderView: UIView, UITextFieldDelegate { let textFieldFrame = CGRect(origin: CGPoint(x: textComponentView.frame.minX, y: backgroundFrame.minY), size: CGSize(width: backgroundFrame.maxX - textComponentView.frame.minX, height: backgroundFrame.height)) let textField = EmojiSearchTextField(frame: textFieldFrame) + textField.autocorrectionType = .no self.textField = textField self.insertSubview(textField, belowSubview: self.clearIconView) textField.delegate = self @@ -1727,6 +1728,11 @@ public final class EmojiSearchHeaderView: UIView, UITextFieldDelegate { public func textFieldDidEndEditing(_ textField: UITextField) { } + public func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.endEditing(true) + return false + } + @objc private func textFieldChanged(_ textField: UITextField) { self.update(transition: .immediate) diff --git a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntityKeyboard.swift b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntityKeyboard.swift index 72329b5ca1..58c999ae4b 100644 --- a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntityKeyboard.swift +++ b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntityKeyboard.swift @@ -106,6 +106,7 @@ public final class EntityKeyboardComponent: Component { public let makeSearchContainerNode: (EntitySearchContentType) -> EntitySearchContainerNode? public let deviceMetrics: DeviceMetrics public let hiddenInputHeight: CGFloat + public let inputHeight: CGFloat public let displayBottomPanel: Bool public let isExpanded: Bool @@ -131,6 +132,7 @@ public final class EntityKeyboardComponent: Component { makeSearchContainerNode: @escaping (EntitySearchContentType) -> EntitySearchContainerNode?, deviceMetrics: DeviceMetrics, hiddenInputHeight: CGFloat, + inputHeight: CGFloat, displayBottomPanel: Bool, isExpanded: Bool ) { @@ -155,6 +157,7 @@ public final class EntityKeyboardComponent: Component { self.makeSearchContainerNode = makeSearchContainerNode self.deviceMetrics = deviceMetrics self.hiddenInputHeight = hiddenInputHeight + self.inputHeight = inputHeight self.displayBottomPanel = displayBottomPanel self.isExpanded = isExpanded } @@ -202,6 +205,9 @@ public final class EntityKeyboardComponent: Component { if lhs.hiddenInputHeight != rhs.hiddenInputHeight { return false } + if lhs.inputHeight != rhs.inputHeight { + return false + } if lhs.displayBottomPanel != rhs.displayBottomPanel { return false } @@ -682,7 +688,8 @@ public final class EntityKeyboardComponent: Component { EntitySearchContentEnvironment( context: component.emojiContent.context, theme: component.theme, - deviceMetrics: component.deviceMetrics + deviceMetrics: component.deviceMetrics, + inputHeight: component.inputHeight ) }, containerSize: availableSize diff --git a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntitySearchContentComponent.swift b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntitySearchContentComponent.swift index 6424d92c18..aba91c6f56 100644 --- a/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntitySearchContentComponent.swift +++ b/submodules/TelegramUI/Components/EntityKeyboard/Sources/EntitySearchContentComponent.swift @@ -22,15 +22,18 @@ final class EntitySearchContentEnvironment: Equatable { let context: AccountContext let theme: PresentationTheme let deviceMetrics: DeviceMetrics + let inputHeight: CGFloat init( context: AccountContext, theme: PresentationTheme, - deviceMetrics: DeviceMetrics + deviceMetrics: DeviceMetrics, + inputHeight: CGFloat ) { self.context = context self.theme = theme self.deviceMetrics = deviceMetrics + self.inputHeight = inputHeight } static func ==(lhs: EntitySearchContentEnvironment, rhs: EntitySearchContentEnvironment) -> Bool { @@ -43,7 +46,9 @@ final class EntitySearchContentEnvironment: Equatable { if lhs.deviceMetrics != rhs.deviceMetrics { return false } - + if lhs.inputHeight != rhs.inputHeight { + return false + } return true } } @@ -98,7 +103,7 @@ final class EntitySearchContentComponent: Component { leftInset: 0.0, rightInset: 0.0, bottomInset: 0.0, - inputHeight: 0.0, + inputHeight: environmentValue.inputHeight, deviceMetrics: environmentValue.deviceMetrics, transition: transition.containedViewLayoutTransition ) diff --git a/submodules/TelegramUI/Components/ForumCreateTopicScreen/Sources/ForumCreateTopicScreen.swift b/submodules/TelegramUI/Components/ForumCreateTopicScreen/Sources/ForumCreateTopicScreen.swift index 90482642c7..608d0ec2e7 100644 --- a/submodules/TelegramUI/Components/ForumCreateTopicScreen/Sources/ForumCreateTopicScreen.swift +++ b/submodules/TelegramUI/Components/ForumCreateTopicScreen/Sources/ForumCreateTopicScreen.swift @@ -155,7 +155,7 @@ private final class TitleFieldComponent: Component { return true } - final class View: UIView { + final class View: UIView, UITextFieldDelegate { private let iconButton: HighlightTrackingButton private let iconView: ComponentView private let placeholderView: ComponentView @@ -169,9 +169,10 @@ private final class TitleFieldComponent: Component { self.iconView = ComponentView() self.placeholderView = ComponentView() self.textField = TextFieldNodeView(frame: .zero) - + super.init(frame: frame) - + + self.textField.delegate = self self.textField.addTarget(self, action: #selector(self.textChanged(_:)), for: .editingChanged) self.addSubview(self.textField) @@ -400,6 +401,7 @@ private final class TopicIconSelectionComponent: Component { makeSearchContainerNode: { _ in return nil }, deviceMetrics: component.deviceMetrics, hiddenInputHeight: 0.0, + inputHeight: 0.0, displayBottomPanel: false, isExpanded: true )), diff --git a/submodules/TelegramUI/Resources/Animations/anim_fragment.json b/submodules/TelegramUI/Resources/Animations/anim_fragment.json new file mode 100644 index 0000000000..d9a764851e --- /dev/null +++ b/submodules/TelegramUI/Resources/Animations/anim_fragment.json @@ -0,0 +1 @@ +{"tgs":1,"v":"5.5.2","fr":60,"ip":0,"op":59,"w":512,"h":512,"nm":"1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"1","sr":1,"ks":{"p":{"a":1,"k":[{"i":{"x":0.3,"y":1},"o":{"x":0.05,"y":0},"t":1,"s":[256,368.474,0],"to":[0,4,0],"ti":[0,3.5,0]},{"i":{"x":0.85,"y":1},"o":{"x":0.8,"y":0},"t":13,"s":[256,392.474,0],"to":[0,-3.5,0],"ti":[0,1.917,0]},{"i":{"x":0.3,"y":1},"o":{"x":0.5,"y":0},"t":28,"s":[256,347.474,0],"to":[0,-1.917,0],"ti":[0,-2.167,0]},{"i":{"x":0.4,"y":1},"o":{"x":0.29,"y":0},"t":39,"s":[256,380.974,0],"to":[0,2.167,0],"ti":[0,2.083,0]},{"i":{"x":0.71,"y":1},"o":{"x":0.29,"y":0},"t":49,"s":[256,360.474,0],"to":[0,-2.083,0],"ti":[0,-1.333,0]},{"t":58,"s":[256,368.474,0]}]},"a":{"a":0,"k":[256,368.474,0]},"s":{"a":1,"k":[{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.85,0.85,0.85],"y":[1,1,1]},"o":{"x":[0.8,0.8,0.8],"y":[0,0,0]},"t":11,"s":[108,92,100]},{"i":{"x":[0.3,0.3,0.3],"y":[1,1,1]},"o":{"x":[0.5,0.5,0.5],"y":[0,0,0]},"t":26,"s":[90,117,100]},{"i":{"x":[0.4,0.4,0.4],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":37,"s":[105,92,100]},{"i":{"x":[0.71,0.71,0.71],"y":[1,1,1]},"o":{"x":[0.29,0.29,0.29],"y":[0,0,0]},"t":47,"s":[99,102,100]},{"t":57,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.656,-2.458],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.216,-0.078],[-0.917,-0.848]],"o":[[0,0],[-1.939,6.784],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.125,0.405],[1.162,1.075]],"v":[[53.969,-13.324],[15.439,104.466],[-5.595,107.925],[-120.842,-24.689],[-123.512,-27.737],[-125.78,-30.326],[-125.846,-30.402],[-138.871,-45.269],[-129.141,-53.31],[47.527,-21.925],[48.469,-21.717],[52.057,-20.012]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-9.813,-21.949],[-10.061,104.985],[-23.595,107.964],[-126.478,-51.435],[-128.685,-54.854],[-130.559,-57.758],[-130.614,-57.843],[-141.378,-74.519],[-131.648,-82.56],[-14.286,-29.675],[-13.656,-29.342],[-10.631,-26.481]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-67.338,-27.899],[-13.561,104.877],[-24.095,107.857],[-109.118,-67.827],[-110.748,-71.594],[-112.134,-74.796],[-112.174,-74.889],[-120.128,-93.269],[-110.398,-101.31],[-70.686,-35.625],[-70.62,-35.475],[-68.969,-31.663]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-85.763,-31.242],[-16.061,109.224],[-24.845,103.342],[-94.552,-28.372],[-90.984,-32.654],[-97.345,-52.21],[-101.503,-52.724],[-107.756,-96.338],[-99.545,-107.504],[-91.923,-55.657],[-97.366,-52.192],[-91.024,-32.662]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-98.638,-29.985],[-10.936,108.232],[-16.845,102.224],[-102.177,-28.24],[-102.909,-31.699],[-97.505,-60.262],[-98.235,-60.89],[-78.381,-112.581],[-73.42,-118.997],[-96.048,-59.961],[-97.487,-60.236],[-102.932,-31.77]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,0],[0,0],[4.904,4.808],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.308,2.522],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-93.513,-26.86],[-14.74,108.357],[-25.032,103.849],[-97.052,-25.115],[-97.784,-28.574],[-96.13,-60.2],[-96.86,-60.828],[-79.693,-106.831],[-74.733,-113.247],[-94.673,-59.899],[-96.112,-60.173],[-97.807,-28.645]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,0],[0,0],[2.263,3.401],[0,0],[0,0],[0,0],[0,0],[0,0],[-2.08,0.379],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.395,0.768],[0,0],[0,0],[0,0],[0,0],[0,0],[1.006,-3.662],[0,0],[0,0],[0,0],[0,0]],"v":[[-88.388,-23.735],[-12.186,108.482],[-18.47,104.974],[-91.927,-21.99],[-92.659,-25.449],[-94.755,-60.137],[-95.485,-60.765],[-81.006,-101.081],[-76.045,-107.497],[-93.298,-59.836],[-94.737,-60.111],[-92.682,-25.52]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[0,0],[5.095,6.214],[1.198,3.378],[0,0],[0,0],[0,0],[0,0],[-2.33,-0.621],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.067,4.276],[0,0],[-1.698,-5.003],[0,0],[0,0],[0,0],[0.006,-9.162],[0,0],[0,0],[0,0],[0,0]],"v":[[-78.263,-22.992],[-10.561,106.974],[-21.095,101.842],[-87.052,-20.122],[-83.484,-24.404],[-87.845,-48.46],[-92.003,-48.974],[-101.631,-87.838],[-93.42,-99.004],[-82.423,-51.907],[-87.866,-48.442],[-83.524,-24.412]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,0],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-4.559,-0.44],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0,0],[0,0],[0,0]],"v":[[-49.588,-20.649],[-14.811,103.877],[-25.595,105.857],[-100.118,-66.077],[-101.748,-69.844],[-103.134,-73.046],[-103.174,-73.139],[-106.878,-81.519],[-103.148,-96.06],[-52.936,-28.375],[-52.87,-28.225],[-51.219,-24.413]],"c":true}]},{"t":58,"s":[{"i":[[0,-1.866],[0,0],[4.884,7.121],[0,0],[0,0],[0,0],[0,0],[0,0],[-7.775,-3.676],[0,0],[-0.2,-0.112],[-0.575,-1.109]],"o":[[0,0],[-0.133,8.553],[0,0],[0,0],[0,0],[0,0],[0,0],[-3.333,-5.48],[0,0],[0.22,0.11],[1.506,0.844],[0.63,1.214]],"v":[[-12.813,-21.897],[-13.061,105.036],[-26.595,108.016],[-129.478,-51.384],[-131.685,-54.802],[-133.559,-57.707],[-133.614,-57.791],[-144.378,-74.468],[-134.648,-82.509],[-17.286,-29.624],[-16.656,-29.291],[-13.631,-26.429]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":1,"k":[{"t":0,"s":[179.897,270.405],"h":1},{"t":31,"s":[329.897,270.405],"h":1}]},"a":{"a":0,"k":[-76.103,14.405]},"s":{"a":1,"k":[{"t":0,"s":[100,100],"h":1},{"t":31,"s":[-100,100],"h":1}]},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":0,"s":[100],"h":1},{"t":21,"s":[0],"h":1},{"t":31,"s":[100],"h":1}]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"L","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.014},"t":8,"s":[{"i":[[0.5,-1.926],[0,0],[-4.884,7.121],[0,0],[4.977,-6.565],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.122,-7.481],[0,0],[-1.098,1.55]],"v":[[69.125,-20.949],[28.061,98.403],[31.845,105.383],[108.503,-99.644],[103.898,-103.685],[73.598,-31.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[0.133,8.553],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[9.813,-21.949],[10.061,104.985],[23.595,107.964],[141.378,-74.519],[131.648,-82.56],[14.286,-29.675]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[7.775,-3.676],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-94.937,-32.699],[-5.689,106.949],[12.345,107.428],[136.128,-65.269],[126.398,-73.31],[-90.464,-40.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[0,-3.797],[0,0],[-16.33,13.572],[0,0],[8.38,-3.676],[0,0]],"o":[[0,0],[7.865,6.015],[0,0],[3.592,-5.48],[0,0],[-3.981,1.845]],"v":[[-144.476,-47.699],[-17.449,106.949],[21,107.428],[143.908,-46.269],[133.42,-54.31],[-139.655,-55.425]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[8.475,1.06],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[3.333,-5.48],[0,0],[-3.693,1.845]],"v":[[-138.054,-68.199],[-9.439,106.699],[5.345,104.928],[80.006,-23.269],[73.275,-36.56],[-133.581,-75.925]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[0,-3.797],[0,0],[-4.884,7.121],[0,0],[6.926,1.268],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[1.995,-5.873],[0,0],[-3.693,1.845]],"v":[[-135.164,-75.799],[-16.039,106.264],[-0.58,103.755],[31.208,-21.677],[22.074,-34.718],[-130.691,-83.525]],"c":true}]},{"t":58,"s":[{"i":[[-3.903,-6.785],[0,0],[0.28,5.393],[0,0],[4.415,1.955],[0,0]],"o":[[0,0],[3.689,6.015],[0,0],[-0.074,-7.149],[0,0],[-4.376,-2.434]],"v":[[-140.722,-74.59],[-22.314,109.377],[-9.53,106.607],[-9.739,-19.601],[-16.102,-30.267],[-134.499,-82.942]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[332.103,270.405]},"a":{"a":0,"k":[76.103,14.405]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"R","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.4,"y":0.905},"o":{"x":0.167,"y":0.167},"t":0,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.6,"y":0.095},"t":8,"s":[{"i":[[-4.407,9.1],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[3.647,-4.152],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[64.407,-48.1],[94.853,-116.598],[91.071,-125.923],[-133.133,-84.474],[-134.915,-75.149],[50.281,-40.1]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[{"i":[[-3.141,1.409],[0,0],[4.693,0],[0,0],[-4.282,-1.921],[0,0]],"o":[[0,0],[4.282,-1.921],[0,0],[-4.693,0],[0,0],[3.141,1.409]],"v":[[5.157,-47.3],[131.853,-103.149],[130.071,-112.474],[-129.633,-112.474],[-131.415,-103.149],[-4.719,-47.3]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[{"i":[[-3.735,0.905],[0,0],[4.446,0.573],[0,0],[-0.281,-2.571],[0,0]],"o":[[0,0],[4.562,-1.329],[0,0],[-3.585,-0.274],[0,0],[0.147,1.766]],"v":[[-71.636,-55.66],[130.183,-92.501],[129.351,-102.532],[-80.466,-120.843],[-86.458,-115.393],[-78.274,-58.279]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[-3.883,0.779],[0,0],[4.384,0.717],[0,0],[0.719,-2.733],[0,0]],"o":[[0,0],[4.632,-1.181],[0,0],[-3.308,-0.343],[0,0],[-0.601,1.855]],"v":[[-85.834,-57.438],[129.765,-89.838],[129.171,-100.046],[-63.174,-122.623],[-70.219,-118.142],[-91.663,-60.712]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[{"i":[[-4.626,-0.1],[0,0],[4.076,1.204],[0,0],[1.978,-0.848],[0,0]],"o":[[0,0],[4.981,-0.064],[0,0],[-1.923,-0.576],[0,0],[-4.344,1.708]],"v":[[-130.384,-71.791],[129.552,-72.5],[130.145,-80.33],[2.522,-126.625],[-2.786,-126.422],[-132.166,-77.294]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[{"i":[[-4.626,-0.109],[0,0],[0.581,2.975],[0,0],[1.978,-0.93],[0,0]],"o":[[0,0],[6.476,1.395],[0,0],[-1.924,-0.632],[0,0],[-4.344,1.873]],"v":[[-130.187,-94.699],[80.4,-54.395],[86.669,-61.35],[66.994,-117.152],[63.936,-119.429],[-131.969,-100.731]],"c":true}]},{"i":{"x":0.3,"y":1},"o":{"x":0.167,"y":0.167},"t":33,"s":[{"i":[[-4.626,-0.111],[0,0],[-2.616,2.343],[0,0],[1.978,-0.943],[0,0]],"o":[[0,0],[5.878,0.829],[0,0],[-1.924,-0.641],[0,0],[-4.344,1.899]],"v":[[-125.399,-102.121],[37.027,-50.663],[46.116,-55.343],[93.31,-112.129],[91.152,-115.305],[-127.181,-108.239]],"c":true}]},{"t":58,"s":[{"i":[[-6.407,-2.769],[0,0],[-5.038,2.278],[0,0],[5.273,-0.726],[0,0]],"o":[[0,0],[3.157,1.572],[0,0],[6.591,-2.37],[0,0],[-7.125,0.298]],"v":[[-130.593,-103.106],[-4.907,-47.572],[7.288,-48.528],[131.034,-103.255],[128.727,-112.274],[-127.875,-113.298]],"c":true}]}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[256.219,176.641]},"a":{"a":0,"k":[0.219,-79.359]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Top","bm":0,"hd":false}],"ip":0,"op":180,"st":0,"bm":0}]} \ No newline at end of file diff --git a/submodules/TelegramUI/Sources/AccountContext.swift b/submodules/TelegramUI/Sources/AccountContext.swift index 9be65ceaff..3c2bd7c1f7 100644 --- a/submodules/TelegramUI/Sources/AccountContext.swift +++ b/submodules/TelegramUI/Sources/AccountContext.swift @@ -21,6 +21,7 @@ import FetchManagerImpl import InAppPurchaseManager import AnimationCache import MultiAnimationRenderer +import AppBundle private final class DeviceSpecificContactImportContext { let disposable = MetaDisposable() @@ -147,12 +148,19 @@ public final class AccountContextImpl: AccountContext { return self._appConfiguration.get() } + public var currentCountriesConfiguration: Atomic + private let _countriesConfiguration = Promise() + public var countriesConfiguration: Signal { + return self._countriesConfiguration.get() + } + public var watchManager: WatchManager? private var storedPassword: (String, CFAbsoluteTime, SwiftSignalKit.Timer)? private var limitsConfigurationDisposable: Disposable? private var contentSettingsDisposable: Disposable? private var appConfigurationDisposable: Disposable? + private var countriesConfigurationDisposable: Disposable? private let deviceSpecificContactImportContexts: QueueLocalObject private var managedAppSpecificContactsDisposable: Disposable? @@ -241,13 +249,20 @@ public final class AccountContextImpl: AccountContext { let updatedAppConfiguration = getAppConfiguration(postbox: account.postbox) self.currentAppConfiguration = Atomic(value: appConfiguration) self._appConfiguration.set(.single(appConfiguration) |> then(updatedAppConfiguration)) - + let currentAppConfiguration = self.currentAppConfiguration self.appConfigurationDisposable = (self._appConfiguration.get() |> deliverOnMainQueue).start(next: { value in let _ = currentAppConfiguration.swap(value) }) + self.currentCountriesConfiguration = Atomic(value: CountriesConfiguration(countries: loadCountryCodes())) + let currentCountriesConfiguration = self.currentCountriesConfiguration + self.countriesConfigurationDisposable = (self.engine.localization.getCountriesList(accountManager: sharedContext.accountManager, langCode: nil) + |> deliverOnMainQueue).start(next: { value in + let _ = currentCountriesConfiguration.swap(CountriesConfiguration(countries: value)) + }) + let queue = Queue() self.deviceSpecificContactImportContexts = QueueLocalObject(queue: queue, generate: { return DeviceSpecificContactImportContexts(queue: queue) @@ -314,6 +329,7 @@ public final class AccountContextImpl: AccountContext { self.managedAppSpecificContactsDisposable?.dispose() self.contentSettingsDisposable?.dispose() self.appConfigurationDisposable?.dispose() + self.countriesConfigurationDisposable?.dispose() self.experimentalUISettingsDisposable?.dispose() self.animatedEmojiStickersDisposable?.dispose() } @@ -629,3 +645,63 @@ func getAppConfiguration(postbox: Postbox) -> Signal } |> distinctUntilChanged } + +private func loadCountryCodes() -> [Country] { + guard let filePath = getAppBundle().path(forResource: "PhoneCountries", ofType: "txt") else { + return [] + } + guard let stringData = try? Data(contentsOf: URL(fileURLWithPath: filePath)) else { + return [] + } + guard let data = String(data: stringData, encoding: .utf8) else { + return [] + } + + let delimiter = ";" + let endOfLine = "\n" + + var result: [Country] = [] +// var countriesByPrefix: [String: (Country, Country.CountryCode)] = [:] + + var currentLocation = data.startIndex + + let locale = Locale(identifier: "en-US") + + while true { + guard let codeRange = data.range(of: delimiter, options: [], range: currentLocation ..< data.endIndex) else { + break + } + + let countryCode = String(data[currentLocation ..< codeRange.lowerBound]) + + guard let idRange = data.range(of: delimiter, options: [], range: codeRange.upperBound ..< data.endIndex) else { + break + } + + let countryId = String(data[codeRange.upperBound ..< idRange.lowerBound]) + + guard let patternRange = data.range(of: delimiter, options: [], range: idRange.upperBound ..< data.endIndex) else { + break + } + + let pattern = String(data[idRange.upperBound ..< patternRange.lowerBound]) + + let maybeNameRange = data.range(of: endOfLine, options: [], range: patternRange.upperBound ..< data.endIndex) + + let countryName = locale.localizedString(forIdentifier: countryId) ?? "" + if let _ = Int(countryCode) { + let code = Country.CountryCode(code: countryCode, prefixes: [], patterns: !pattern.isEmpty ? [pattern] : []) + let country = Country(id: countryId, name: countryName, localizedName: nil, countryCodes: [code], hidden: false) + result.append(country) +// countriesByPrefix["\(code.code)"] = (country, code) + } + + if let maybeNameRange = maybeNameRange { + currentLocation = maybeNameRange.upperBound + } else { + break + } + } + + return result +} diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 34e9deffb6..2b503d6463 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -1711,7 +1711,9 @@ private func extractAccountManagerState(records: AccountRecordsView deliverOnMainQueue).start(next: { _, context, authContext in - if let context = context { + if let authContext = authContext, let confirmationCode = parseConfirmationCodeUrl(url) { + authContext.rootController.applyConfirmationCode(confirmationCode) + } else if let context = context { context.openUrl(url) } else if let authContext = authContext { if let proxyData = parseProxyUrl(url) { @@ -1726,8 +1728,6 @@ private func extractAccountManagerState(records: AccountRecordsView distinctUntilChanged + let context = self.context let threadData: Signal + let isGeneralThreadClosed: Signal if let threadId = self.chatLocation.threadId { let viewKey: PostboxViewKey = .messageHistoryThreadInfo(peerId: peerId, threadId: threadId) threadData = context.account.postbox.combinedView(keys: [viewKey]) @@ -6397,7 +6406,30 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G return ChatPresentationInterfaceState.ThreadData(title: data.info.title, icon: data.info.icon, iconColor: data.info.iconColor, isOwnedByMe: data.isOwnedByMe, isClosed: data.isClosed) } |> distinctUntilChanged + isGeneralThreadClosed = .single(nil) } else { + isGeneralThreadClosed = isForum + |> mapToSignal { isForum -> Signal in + if isForum { + let viewKey: PostboxViewKey = .messageHistoryThreadInfo(peerId: peerId, threadId: 1) + return context.account.postbox.combinedView(keys: [viewKey]) + |> map { views -> ChatPresentationInterfaceState.ThreadData? in + guard let view = views.views[viewKey] as? MessageHistoryThreadInfoView else { + return nil + } + guard let data = view.info?.data.get(MessageHistoryThreadData.self) else { + return nil + } + return ChatPresentationInterfaceState.ThreadData(title: data.info.title, icon: data.info.icon, iconColor: data.info.iconColor, isOwnedByMe: data.isOwnedByMe, isClosed: data.isClosed) + } + |> distinctUntilChanged + |> map { threadData -> Bool? in + return threadData?.isClosed + } + } else { + return .single(nil) + } + } threadData = .single(nil) } @@ -6407,8 +6439,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G topPinnedMessage, customEmojiAvailable, isForum, - threadData - ).start(next: { [weak self] cachedDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown, topPinnedMessage, customEmojiAvailable, isForum, threadData in + threadData, + isGeneralThreadClosed + ).start(next: { [weak self] cachedDataAndMessages, hasPendingMessages, isTopReplyThreadMessageShown, topPinnedMessage, customEmojiAvailable, isForum, threadData, isGeneralThreadClosed in if let strongSelf = self { let (cachedData, messages) = cachedDataAndMessages @@ -6582,7 +6615,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G } } - if strongSelf.presentationInterfaceState.pinnedMessageId != pinnedMessageId || strongSelf.presentationInterfaceState.pinnedMessage != pinnedMessage || strongSelf.presentationInterfaceState.peerIsBlocked != peerIsBlocked || pinnedMessageUpdated || callsDataUpdated || voiceMessagesAvailableUpdated || strongSelf.presentationInterfaceState.slowmodeState != slowmodeState || strongSelf.presentationInterfaceState.activeGroupCallInfo != activeGroupCallInfo || customEmojiAvailable != strongSelf.presentationInterfaceState.customEmojiAvailable || threadData != strongSelf.presentationInterfaceState.threadData { + if strongSelf.presentationInterfaceState.pinnedMessageId != pinnedMessageId || strongSelf.presentationInterfaceState.pinnedMessage != pinnedMessage || strongSelf.presentationInterfaceState.peerIsBlocked != peerIsBlocked || pinnedMessageUpdated || callsDataUpdated || voiceMessagesAvailableUpdated || strongSelf.presentationInterfaceState.slowmodeState != slowmodeState || strongSelf.presentationInterfaceState.activeGroupCallInfo != activeGroupCallInfo || customEmojiAvailable != strongSelf.presentationInterfaceState.customEmojiAvailable || threadData != strongSelf.presentationInterfaceState.threadData || isGeneralThreadClosed != strongSelf.presentationInterfaceState.isGeneralThreadClosed { strongSelf.updateChatPresentationInterfaceState(animated: strongSelf.willAppear, interactive: strongSelf.willAppear, { state in return state .updatedPinnedMessageId(pinnedMessageId) @@ -6594,6 +6627,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G .updatedVoiceMessagesAvailable(voiceMessagesAvailable) .updatedCustomEmojiAvailable(customEmojiAvailable) .updatedThreadData(threadData) + .updatedIsGeneralThreadClosed(isGeneralThreadClosed) .updatedTitlePanelContext({ context in if pinnedMessageId != nil { if !context.contains(where: { @@ -11686,7 +11720,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G private func getCaptionPanelView() -> TGCaptionPanelView { let presentationData = self.presentationData.withUpdated(theme: defaultDarkColorPresentationTheme) - var presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: presentationData.chatFontSize, bubbleCorners: presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: self.presentationInterfaceState.chatLocation, subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil) + var presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: presentationData.chatFontSize, bubbleCorners: presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: self.presentationInterfaceState.chatLocation, subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil, isGeneralThreadClosed: nil) var updateChatPresentationInterfaceStateImpl: (((ChatPresentationInterfaceState) -> ChatPresentationInterfaceState) -> Void)? var ensureFocusedImpl: (() -> Void)? @@ -15917,7 +15951,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G let actionSheet = ActionSheetController(presentationData: strongSelf.presentationData) var items: [ActionSheetItem] = [] - items.append(ActionSheetTextItem(title: strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumberConfirmation(formatPhoneNumber(phoneNumber), EnginePeer(peer).compactDisplayTitle).string)) + items.append(ActionSheetTextItem(title: strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumberConfirmation(formatPhoneNumber(context: strongSelf.context, number: phoneNumber), EnginePeer(peer).compactDisplayTitle).string)) items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_ShareMyPhoneNumber, action: { [weak actionSheet] in actionSheet?.dismissAnimated() guard let strongSelf = self else { diff --git a/submodules/TelegramUI/Sources/ChatEntityKeyboardInputNode.swift b/submodules/TelegramUI/Sources/ChatEntityKeyboardInputNode.swift index fc57ae680c..86c4129e68 100644 --- a/submodules/TelegramUI/Sources/ChatEntityKeyboardInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatEntityKeyboardInputNode.swift @@ -1822,6 +1822,7 @@ final class ChatEntityKeyboardInputNode: ChatInputNode { }, deviceMetrics: deviceMetrics, hiddenInputHeight: hiddenInputHeight, + inputHeight: inputHeight, displayBottomPanel: true, isExpanded: isExpanded && !self.isEmojiSearchActive )), @@ -2342,7 +2343,8 @@ final class EntityInputView: UIView, AttachmentTextInputPanelInputView, UIInputV activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, - threadData: nil + threadData: nil, + isGeneralThreadClosed: nil ) let _ = inputNode.updateLayout( diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift index 08ee00b0cf..3e26beda6e 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateInputPanels.swift @@ -159,17 +159,18 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState } if channel.flags.contains(.isForum) && isMember { + var canManage = false + if channel.flags.contains(.isCreator) { + canManage = true + } else if channel.hasPermission(.manageTopics) { + canManage = true + } + if let threadData = chatPresentationInterfaceState.threadData { if threadData.isClosed { - var canManage = false - if channel.flags.contains(.isCreator) { - canManage = true - } else if channel.hasPermission(.manageTopics) { - canManage = true - } else if threadData.isOwnedByMe { + if threadData.isOwnedByMe { canManage = true } - if !canManage { if let currentPanel = (currentPanel as? ChatRestrictedInputPanelNode) ?? (currentSecondaryPanel as? ChatRestrictedInputPanelNode) { return (currentPanel, nil) @@ -181,6 +182,17 @@ func inputPanelForChatPresentationIntefaceState(_ chatPresentationInterfaceState } } } + } else if let isGeneralThreadClosed = chatPresentationInterfaceState.isGeneralThreadClosed, isGeneralThreadClosed { + if !canManage { + if let currentPanel = (currentPanel as? ChatRestrictedInputPanelNode) ?? (currentSecondaryPanel as? ChatRestrictedInputPanelNode) { + return (currentPanel, nil) + } else { + let panel = ChatRestrictedInputPanelNode() + panel.context = context + panel.interfaceInteraction = interfaceInteraction + return (panel, nil) + } + } } } diff --git a/submodules/TelegramUI/Sources/ChatMessageContactBubbleContentNode.swift b/submodules/TelegramUI/Sources/ChatMessageContactBubbleContentNode.swift index 86a485cd44..746ce8efea 100644 --- a/submodules/TelegramUI/Sources/ChatMessageContactBubbleContentNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageContactBubbleContentNode.swift @@ -123,11 +123,11 @@ class ChatMessageContactBubbleContentNode: ChatMessageBubbleContentNode { if !contactData.basicData.phoneNumbers.isEmpty { for phone in contactData.basicData.phoneNumbers { if infoComponents.count < infoLineLimit { - infoComponents.append(formatPhoneNumber(phone.value)) + infoComponents.append(formatPhoneNumber(context: item.context, number: phone.value)) } } } else { - infoComponents.append(formatPhoneNumber(selectedContact.phoneNumber)) + infoComponents.append(formatPhoneNumber(context: item.context, number: selectedContact.phoneNumber)) } if infoComponents.count < infoLineLimit { for email in contactData.emailAddresses { @@ -143,7 +143,7 @@ class ChatMessageContactBubbleContentNode: ChatMessageBubbleContentNode { } info = infoComponents.joined(separator: "\n") } else { - info = formatPhoneNumber(selectedContact.phoneNumber) + info = formatPhoneNumber(context: item.context, number: selectedContact.phoneNumber) } } diff --git a/submodules/TelegramUI/Sources/ChatQrCodeScreen.swift b/submodules/TelegramUI/Sources/ChatQrCodeScreen.swift index 9718d282c9..0a35d20bea 100644 --- a/submodules/TelegramUI/Sources/ChatQrCodeScreen.swift +++ b/submodules/TelegramUI/Sources/ChatQrCodeScreen.swift @@ -564,12 +564,12 @@ final class ChatQrCodeScreen: ViewController { static let themeCrossfadeDelay: Double = 0.05 enum Subject { - case peer(peer: Peer, threadId: Int64?) + case peer(peer: Peer, threadId: Int64?, temporary: Bool) case messages([Message]) var fileName: String { switch self { - case let .peer(peer, threadId): + case let .peer(peer, threadId, _): var result: String if let addressName = peer.addressName, !addressName.isEmpty { result = "t_me-\(peer.addressName ?? "")" @@ -805,8 +805,8 @@ private class ChatQrCodeScreenNode: ViewControllerTracingNode, UIScrollViewDeleg self.wrappingScrollNode.view.canCancelContentTouches = true switch controller.subject { - case let .peer(peer, threadId): - self.contentNode = QrContentNode(context: context, peer: peer, threadId: threadId, isStatic: false) + case let .peer(peer, threadId, temporary): + self.contentNode = QrContentNode(context: context, peer: peer, threadId: threadId, isStatic: false, temporary: temporary) case let .messages(messages): self.contentNode = MessageContentNode(context: context, messages: messages) } @@ -999,7 +999,7 @@ private class ChatQrCodeScreenNode: ViewControllerTracingNode, UIScrollViewDeleg let initiallySelectedEmoticon: Signal let sharedData = self.context.sharedContext.accountManager.sharedData(keys: [ApplicationSpecificSharedDataKeys.presentationThemeSettings]) |> take(1) - if case let .peer(peer, _) = controller.subject, peer.id != self.context.account.peerId { + if case let .peer(peer, _, _) = controller.subject, peer.id != self.context.account.peerId { let themeEmoticon = self.context.engine.data.get(TelegramEngine.EngineData.Item.Peer.ThemeEmoticon(id: peer.id)) initiallySelectedEmoticon = combineLatest(themeEmoticon, sharedData) |> map { themeEmoticon, sharedData -> String in @@ -1441,6 +1441,7 @@ private class QrContentNode: ASDisplayNode, ContentNode { private let peer: Peer private let threadId: Int64? private let isStatic: Bool + private let temporary: Bool fileprivate let containerNode: ASDisplayNode fileprivate let wallpaperBackgroundNode: WallpaperBackgroundNode @@ -1469,11 +1470,17 @@ private class QrContentNode: ASDisplayNode, ContentNode { return false } - init(context: AccountContext, peer: Peer, threadId: Int64?, isStatic: Bool = false) { + private var timer: SwiftSignalKit.Timer? + private var setupTimestamp: Double + + init(context: AccountContext, peer: Peer, threadId: Int64?, isStatic: Bool = false, temporary: Bool) { self.context = context self.peer = peer self.threadId = threadId self.isStatic = isStatic + self.temporary = temporary + + self.setupTimestamp = CACurrentMediaTime() self.containerNode = ASDisplayNode() @@ -1514,18 +1521,22 @@ private class QrContentNode: ASDisplayNode, ContentNode { } var codeText: String - if let addressName = peer.addressName, !addressName.isEmpty { - codeText = "@\(peer.addressName ?? "")".uppercased() + if temporary { + codeText = "5:00" } else { - codeText = peer.debugDisplayTitle.uppercased() - } - if let threadId = self.threadId, threadId != 0 { - codeText += "/\(threadId)" + if let addressName = peer.addressName, !addressName.isEmpty { + codeText = "@\(peer.addressName ?? "")".uppercased() + } else { + codeText = peer.debugDisplayTitle.uppercased() + } + if let threadId = self.threadId, threadId != 0 { + codeText += "/\(threadId)" + } } self.codeTextNode = ImmediateTextNode() self.codeTextNode.displaysAsynchronously = false - self.codeTextNode.attributedText = NSAttributedString(string: codeText, font: Font.with(size: 23.0, design: .round, weight: .bold, traits: []), textColor: .black) + self.codeTextNode.attributedText = NSAttributedString(string: codeText, font: Font.with(size: 23.0, design: .round, weight: .bold, traits: [.monospacedNumbers]), textColor: .black) self.codeTextNode.truncationMode = .byCharWrapping self.codeTextNode.maximumNumberOfLines = 2 self.codeTextNode.textAlignment = .center @@ -1590,6 +1601,17 @@ private class QrContentNode: ASDisplayNode, ContentNode { |> map { codeReady, wallpaperReady in return codeReady && wallpaperReady }) + + if temporary { + self.timer = Timer(timeout: 0.5, repeat: true, completion: { [weak self] in + self?.tick() + }, queue: Queue.mainQueue()) + self.timer?.start() + } + } + + deinit { + self.timer?.invalidate() } override func didLoad() { @@ -1598,6 +1620,17 @@ private class QrContentNode: ASDisplayNode, ContentNode { self.codeForegroundNode.view.mask = self.codeMaskNode.view } + private func tick() { + let timeout: Double = 5.0 * 60.0 + let currentTime = CACurrentMediaTime() + let elapsed = max(0.0, timeout - (currentTime - self.setupTimestamp)) + + self.codeTextNode.attributedText = NSAttributedString(string: stringForDuration(Int32(elapsed)), font: Font.with(size: 23.0, design: .round, weight: .bold, traits: [.monospacedNumbers]), textColor: .black) + if let (size, topInset, bottomInset) = self.validLayout { + self.updateLayout(size: size, topInset: topInset, bottomInset: bottomInset, transition: .immediate) + } + } + func generateImage(completion: @escaping (UIImage?) -> Void) { guard let (theme, wallpaper, isDarkAppearance, selectedEmoticon) = self.currentParams else { return @@ -1606,7 +1639,7 @@ private class QrContentNode: ASDisplayNode, ContentNode { let size = CGSize(width: 390.0, height: 844.0) let scale: CGFloat = 3.0 - let copyNode = QrContentNode(context: self.context, peer: self.peer, threadId: self.threadId, isStatic: true) + let copyNode = QrContentNode(context: self.context, peer: self.peer, threadId: self.threadId, isStatic: true, temporary: false) func prepare(view: UIView, scale: CGFloat) { view.contentScaleFactor = scale @@ -1708,7 +1741,7 @@ private class QrContentNode: ASDisplayNode, ContentNode { } } - self.codeTextNode.attributedText = NSAttributedString(string: self.codeTextNode.attributedText?.string ?? "", font: Font.with(size: fontSize, design: .round, weight: .bold, traits: []), textColor: .black) + self.codeTextNode.attributedText = NSAttributedString(string: self.codeTextNode.attributedText?.string ?? "", font: Font.with(size: fontSize, design: .round, weight: .bold, traits: [.monospacedNumbers]), textColor: .black) let codeBackgroundWidth = min(300.0, size.width - codeInset * 2.0) let codeBackgroundHeight = floor(codeBackgroundWidth * 1.1) diff --git a/submodules/TelegramUI/Sources/CreateGroupController.swift b/submodules/TelegramUI/Sources/CreateGroupController.swift index 622ed1c423..3511a2a2fb 100644 --- a/submodules/TelegramUI/Sources/CreateGroupController.swift +++ b/submodules/TelegramUI/Sources/CreateGroupController.swift @@ -443,7 +443,7 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId] } } } else { - createSignal = context.engine.peers.createGroup(title: title, peerIds: peerIds) + createSignal = context.engine.peers.createGroup(title: title, peerIds: peerIds, ttlPeriod: nil) } case .supergroup: createSignal = context.engine.peers.createSupergroup(title: title, description: nil) diff --git a/submodules/TelegramUI/Sources/OpenUrl.swift b/submodules/TelegramUI/Sources/OpenUrl.swift index a6da62508f..6f9cafbdbc 100644 --- a/submodules/TelegramUI/Sources/OpenUrl.swift +++ b/submodules/TelegramUI/Sources/OpenUrl.swift @@ -141,6 +141,13 @@ func formattedConfirmationCode(_ code: Int) -> String { func openExternalUrlImpl(context: AccountContext, urlContext: OpenURLContext, url: String, forceExternal: Bool, presentationData: PresentationData, navigationController: NavigationController?, dismissInput: @escaping () -> Void) { if forceExternal || url.lowercased().hasPrefix("tel:") || url.lowercased().hasPrefix("calshow:") { + if url.lowercased().hasPrefix("tel:+888") { + context.sharedContext.presentGlobalController(textAlertController(context: context, title: nil, text: presentationData.strings.Conversation_CantPhoneCallAnonymousNumberError, actions: [ + TextAlertAction(type: .genericAction, title: presentationData.strings.Common_OK, action: { + }), + ], parseMarkdown: true), nil) + return + } context.sharedContext.applicationBindings.openUrl(url) return } diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift index eda0cc3e49..e9ba8f6058 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoHeaderNode.swift @@ -2666,7 +2666,7 @@ final class PeerInfoHeaderNode: ASDisplayNode { title = title.replacingOccurrences(of: "\u{1160}", with: "").replacingOccurrences(of: "\u{3164}", with: "") if title.isEmpty { if let peer = peer as? TelegramUser, let phone = peer.phone { - title = formatPhoneNumber(phone) + title = formatPhoneNumber(context: self.context, number: phone) } else if let addressName = peer.addressName { title = "@\(addressName)" } else { @@ -2677,7 +2677,7 @@ final class PeerInfoHeaderNode: ASDisplayNode { titleString = NSAttributedString(string: title, font: Font.regular(30.0), textColor: presentationData.theme.list.itemPrimaryTextColor) smallTitleString = NSAttributedString(string: title, font: Font.regular(30.0), textColor: .white) if self.isSettings, let user = peer as? TelegramUser { - var subtitle = formatPhoneNumber(user.phone ?? "") + var subtitle = formatPhoneNumber(context: self.context, number: user.phone ?? "") if let mainUsername = user.addressName, !mainUsername.isEmpty { subtitle = "\(subtitle) • @\(mainUsername)" diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 483ecb0448..cf39ef88e6 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -393,7 +393,7 @@ final class PeerInfoSelectionPanelNode: ASDisplayNode { self.backgroundNode.updateColor(color: presentationData.theme.rootController.navigationBar.blurredBackgroundColor, transition: .immediate) self.separatorNode.backgroundColor = presentationData.theme.rootController.navigationBar.separatorColor - let interfaceState = ChatPresentationInterfaceState(chatWallpaper: .color(0), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: .defaultValue, fontSize: .regular, bubbleCorners: PresentationChatBubbleCorners(mainRadius: 16.0, auxiliaryRadius: 8.0, mergeBubbleCorners: true), accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(id: self.peerId), subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil) + let interfaceState = ChatPresentationInterfaceState(chatWallpaper: .color(0), theme: presentationData.theme, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameDisplayOrder: presentationData.nameDisplayOrder, limitsConfiguration: .defaultValue, fontSize: .regular, bubbleCorners: PresentationChatBubbleCorners(mainRadius: 16.0, auxiliaryRadius: 8.0, mergeBubbleCorners: true), accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(id: self.peerId), subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil, isGeneralThreadClosed: nil) let panelHeight = self.selectionPanel.updateLayout(width: layout.size.width, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, bottomInset: layout.intrinsicInsets.bottom, additionalSideInsets: UIEdgeInsets(), maxHeight: 0.0, isSecondary: false, transition: transition, interfaceState: interfaceState, metrics: layout.metrics, isMediaInputExpanded: false) transition.updateFrame(node: self.selectionPanel, frame: CGRect(origin: CGPoint(), size: CGSize(width: layout.size.width, height: panelHeight))) @@ -680,7 +680,7 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p if let settings = data.globalSettings { if settings.suggestPhoneNumberConfirmation, let peer = data.peer as? TelegramUser { - let phoneNumber = formatPhoneNumber(peer.phone ?? "") + let phoneNumber = formatPhoneNumber(context: context, number: peer.phone ?? "") items[.phone]!.append(PeerInfoScreenInfoItem(id: 0, title: presentationData.strings.Settings_CheckPhoneNumberTitle(phoneNumber).string, text: .markdown(presentationData.strings.Settings_CheckPhoneNumberText), linkAction: { link in if case .tap = link { interaction.openFaq(presentationData.strings.Settings_CheckPhoneNumberFAQAnchor) @@ -884,7 +884,7 @@ private func settingsEditingItems(data: PeerInfoScreenData?, state: PeerInfoStat } if let user = data.peer as? TelegramUser { - items[.info]!.append(PeerInfoScreenDisclosureItem(id: ItemPhoneNumber, label: .text(user.phone.flatMap({ formatPhoneNumber($0) }) ?? ""), text: presentationData.strings.Settings_PhoneNumber, action: { + items[.info]!.append(PeerInfoScreenDisclosureItem(id: ItemPhoneNumber, label: .text(user.phone.flatMap({ formatPhoneNumber(context: context, number: $0) }) ?? ""), text: presentationData.strings.Settings_PhoneNumber, action: { interaction.openSettings(.phoneNumber) })) } @@ -960,8 +960,14 @@ private func infoItems(data: PeerInfoScreenData?, context: AccountContext, prese } if let phone = user.phone { - let formattedPhone = formatPhoneNumber(phone) - items[.peerInfo]!.append(PeerInfoScreenLabeledValueItem(id: 2, label: presentationData.strings.ContactInfo_PhoneLabelMobile, text: formattedPhone, textColor: .accent, action: { node in + let formattedPhone = formatPhoneNumber(context: context, number: phone) + let label: String + if formattedPhone.hasPrefix("+888 ") { + label = presentationData.strings.UserInfo_AnonymousNumberLabel + } else { + label = presentationData.strings.ContactInfo_PhoneLabelMobile + } + items[.peerInfo]!.append(PeerInfoScreenLabeledValueItem(id: 2, label: label, text: formattedPhone, textColor: .accent, action: { node in interaction.openPhone(phone, node, nil) }, longTapAction: nil, contextAction: { node, gesture, _ in interaction.openPhone(phone, node, gesture) @@ -3065,7 +3071,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate guard case let .user(peer) = peer, let phone = peer.phone, !phone.isEmpty else { return .complete() } - return (context.sharedContext.contactDataManager?.basicDataForNormalizedPhoneNumber(DeviceContactNormalizedPhoneNumber(rawValue: formatPhoneNumber(phone))) ?? .single([])) + return (context.sharedContext.contactDataManager?.basicDataForNormalizedPhoneNumber(DeviceContactNormalizedPhoneNumber(rawValue: formatPhoneNumber(context: context, number: phone))) ?? .single([])) |> take(1) |> mapToSignal { records -> Signal in var signals: [Signal] = [] @@ -3292,9 +3298,9 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate var actions: [ContextMenuAction] = [] if copyPhone, let phone = user.phone, !phone.isEmpty { actions.append(ContextMenuAction(content: .text(title: strongSelf.presentationData.strings.Settings_CopyPhoneNumber, accessibilityLabel: strongSelf.presentationData.strings.Settings_CopyPhoneNumber), action: { [weak self] in - UIPasteboard.general.string = formatPhoneNumber(phone) - if let strongSelf = self { + UIPasteboard.general.string = formatPhoneNumber(context: strongSelf.context, number: phone) + let presentationData = strongSelf.context.sharedContext.currentPresentationData.with { $0 } strongSelf.controller?.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_PhoneCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } @@ -3471,7 +3477,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate if let stickerPackReference = stickerPackReference { let _ = (strongSelf.context.engine.stickers.loadedStickerPack(reference: stickerPackReference, forceActualized: false) - |> deliverOnMainQueue).start(next: { [weak self] stickerPack in + |> deliverOnMainQueue).start(next: { [weak self] stickerPack in if let strongSelf = self, case let .result(info, _, _) = stickerPack { strongSelf.controller?.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .sticker(context: strongSelf.context, file: file, title: nil, text: strongSelf.presentationData.strings.PeerInfo_TopicIconInfoText(info.title).string, undoText: strongSelf.presentationData.strings.Stickers_PremiumPackView, customAction: nil), elevatedLayout: false, action: { [weak self] action in if let strongSelf = self, action == .undo { @@ -5446,20 +5452,22 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate guard let strongSelf = self else { return } - strongSelf.context.sharedContext.applicationBindings.openUrl("tel:\(formatPhoneNumber(value).replacingOccurrences(of: " ", with: ""))") + strongSelf.context.sharedContext.applicationBindings.openUrl("tel:\(formatPhoneNumber(context: strongSelf.context, number: value).replacingOccurrences(of: " ", with: ""))") } let copyAction = { [weak self] in guard let strongSelf = self else { return } - UIPasteboard.general.string = formatPhoneNumber(value) + UIPasteboard.general.string = formatPhoneNumber(context: strongSelf.context, number: value) strongSelf.controller?.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_PhoneCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) } + let formattedPhoneNumber = formatPhoneNumber(context: strongSelf.context, number: value) + var isAnonymousNumber = false var items: [ContextMenuItem] = [] - if case let .user(peer) = peer, let peerPhoneNumber = peer.phone, formatPhoneNumber(value) == formatPhoneNumber(peerPhoneNumber) { + if case let .user(peer) = peer, let peerPhoneNumber = peer.phone, formattedPhoneNumber == formatPhoneNumber(context: strongSelf.context, number: peerPhoneNumber) { items.append(.action(ContextMenuActionItem(text: presentationData.strings.UserInfo_TelegramCall, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Call"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { telegramCallAction(false) @@ -5470,34 +5478,47 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate telegramCallAction(true) } }))) - - items.append(.action(ContextMenuActionItem(text: presentationData.strings.UserInfo_PhoneCall, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/PhoneCall"), color: theme.contextMenu.primaryColor) }, action: { c, _ in - c.dismiss { - phoneCallAction() - } - }))) + if !formattedPhoneNumber.hasPrefix("+888") { + items.append(.action(ContextMenuActionItem(text: presentationData.strings.UserInfo_PhoneCall, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/PhoneCall"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + c.dismiss { + phoneCallAction() + } + }))) + isAnonymousNumber = true + } items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ContextMenuCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } }))) } else { - items = [ - .action(ContextMenuActionItem(text: presentationData.strings.UserInfo_PhoneCall, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/PhoneCall"), color: theme.contextMenu.primaryColor) }, action: { c, _ in - c.dismiss { - phoneCallAction() - } - })), + if !formattedPhoneNumber.hasPrefix("+888") { + items.append( + .action(ContextMenuActionItem(text: presentationData.strings.UserInfo_PhoneCall, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/PhoneCall"), color: theme.contextMenu.primaryColor) }, action: { c, _ in + c.dismiss { + phoneCallAction() + } + })) + ) + isAnonymousNumber = true + } + items.append( .action(ContextMenuActionItem(text: presentationData.strings.Conversation_ContextMenuCopy, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in c.dismiss { copyAction() } - })), - ] + })) + ) } - - let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .extracted(PeerInfoContextExtractedContentSource(sourceNode: sourceNode)), items: .single(ContextController.Items(content: .list(items))), gesture: gesture) -// contextController.useComplexItemsTransitionAnimation = true + var actions = ContextController.Items(content: .list(items)) + if isAnonymousNumber { + actions.tip = .animatedEmoji(text: strongSelf.presentationData.strings.UserInfo_AnonymousNumberInfo, arguments: nil, file: nil, action: { [weak self] in + if let strongSelf = self { + strongSelf.context.sharedContext.openExternalUrl(context: strongSelf.context, urlContext: .generic, url: "https://fragment.com", forceExternal: true, presentationData: strongSelf.presentationData, navigationController: nil, dismissInput: {}) + } + }) + } + let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .extracted(PeerInfoContextExtractedContentSource(sourceNode: sourceNode)), items: .single(actions), gesture: gesture) strongSelf.controller?.present(contextController, in: .window(.root)) }) } @@ -6964,8 +6985,12 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate if case let .replyThread(message) = self.chatLocation { threadId = Int64(message.messageId.id) } - - controller.present(ChatQrCodeScreen(context: self.context, subject: .peer(peer: peer, threadId: threadId)), in: .window(.root)) + + var temporary = false + if self.isSettings && self.data?.globalSettings?.privacySettings?.phoneDiscoveryEnabled == false { + temporary = true + } + controller.present(ChatQrCodeScreen(context: self.context, subject: .peer(peer: peer, threadId: threadId, temporary: temporary)), in: .window(.root)) } fileprivate func openSettings(section: PeerInfoSettingsSection) { @@ -8315,7 +8340,6 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate private var hasQrButton = false fileprivate func updateNavigation(transition: ContainedViewLayoutTransition, additive: Bool) { let offsetY = self.scrollNode.view.contentOffset.y - var transition = transition if self.isSettings, !(self.controller?.movingInHierarchy == true) { let bottomOffsetY = max(0.0, self.scrollNode.view.contentSize.height + min(83.0, self.scrollNode.view.contentInset.bottom) - offsetY - self.scrollNode.frame.height) @@ -8384,17 +8408,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate rightNavigationButtons.append(PeerInfoHeaderNavigationButtonSpec(key: .done, isForExpandedView: false)) } else { if self.isSettings { - var hasQrButton = false - if self.data?.globalSettings?.privacySettings?.phoneDiscoveryEnabled == true { - leftNavigationButtons.append(PeerInfoHeaderNavigationButtonSpec(key: .qrCode, isForExpandedView: false)) - hasQrButton = true - } - if hasQrButton != self.hasQrButton { - self.hasQrButton = hasQrButton - if !transition.isAnimated { - transition = .animated(duration: 0.2, curve: .easeInOut) - } - } + leftNavigationButtons.append(PeerInfoHeaderNavigationButtonSpec(key: .qrCode, isForExpandedView: false)) rightNavigationButtons.append(PeerInfoHeaderNavigationButtonSpec(key: .edit, isForExpandedView: false)) rightNavigationButtons.append(PeerInfoHeaderNavigationButtonSpec(key: .search, isForExpandedView: true)) } else if peerInfoCanEdit(peer: self.data?.peer, chatLocation: self.chatLocation, threadData: self.data?.threadData, cachedData: self.data?.cachedData, isContact: self.data?.isContact) { diff --git a/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift b/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift index 2f51338a60..fd637a238f 100644 --- a/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift +++ b/submodules/TelegramUI/Sources/PeerSelectionControllerNode.swift @@ -103,7 +103,7 @@ final class PeerSelectionControllerNode: ASDisplayNode { self.animationCache = context.animationCache self.animationRenderer = context.animationRenderer - self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(id: PeerId(0)), subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil) + self.presentationInterfaceState = ChatPresentationInterfaceState(chatWallpaper: .builtin(WallpaperSettings()), theme: self.presentationData.theme, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameDisplayOrder: self.presentationData.nameDisplayOrder, limitsConfiguration: self.context.currentLimitsConfiguration.with { $0 }, fontSize: self.presentationData.chatFontSize, bubbleCorners: self.presentationData.chatBubbleCorners, accountPeerId: self.context.account.peerId, mode: .standard(previewing: false), chatLocation: .peer(id: PeerId(0)), subject: nil, peerNearbyData: nil, greetingData: nil, pendingUnpinnedAllMessages: false, activeGroupCallInfo: nil, hasActiveGroupCall: false, importState: nil, threadData: nil, isGeneralThreadClosed: nil) self.presentationInterfaceState = self.presentationInterfaceState.updatedInterfaceState { $0.withUpdatedForwardMessageIds(forwardedMessageIds) } diff --git a/submodules/TelegramUI/Sources/SharedAccountContext.swift b/submodules/TelegramUI/Sources/SharedAccountContext.swift index c6b94c9429..b7739277b0 100644 --- a/submodules/TelegramUI/Sources/SharedAccountContext.swift +++ b/submodules/TelegramUI/Sources/SharedAccountContext.swift @@ -1415,7 +1415,7 @@ public final class SharedAccountContextImpl: SharedAccountContext { } public func makeChatQrCodeScreen(context: AccountContext, peer: Peer, threadId: Int64?) -> ViewController { - return ChatQrCodeScreen(context: context, subject: .peer(peer: peer, threadId: threadId)) + return ChatQrCodeScreen(context: context, subject: .peer(peer: peer, threadId: threadId, temporary: false)) } public func makePrivacyAndSecurityController(context: AccountContext) -> ViewController { diff --git a/submodules/WebUI/Sources/WebAppController.swift b/submodules/WebUI/Sources/WebAppController.swift index d18832fe99..18d172acb6 100644 --- a/submodules/WebUI/Sources/WebAppController.swift +++ b/submodules/WebUI/Sources/WebAppController.swift @@ -801,39 +801,6 @@ public final class WebAppController: ViewController, AttachmentContainable { } case "web_app_request_phone": break -// let _ = (self.context.account.postbox.loadedPeerWithId(self.context.account.peerId) -// |> deliverOnMainQueue).start(next: { [weak self] accountPeer in -// guard let strongSelf = self else { -// return -// } -// guard let user = accountPeer as? TelegramUser, let phoneNumber = user.phone else { -// return -// } -// -// let actionSheet = ActionSheetController(presentationData: strongSelf.presentationData) -// var items: [ActionSheetItem] = [] -// items.append(ActionSheetTextItem(title: strongSelf.presentationData.strings.WebApp_ShareMyPhoneNumberConfirmation(formatPhoneNumber(phoneNumber), strongSelf.controller?.botName ?? "").string, parseMarkdown: true)) -// items.append(ActionSheetButtonItem(title: strongSelf.presentationData.strings.WebApp_ShareMyPhoneNumber, action: { [weak actionSheet] in -// actionSheet?.dismissAnimated() -// guard let strongSelf = self else { -// return -// } -// -// strongSelf.sendPhoneRequestedEvent(phone: phoneNumber) -// })) -// -// actionSheet.setItemGroups([ActionSheetItemGroup(items: items), ActionSheetItemGroup(items: [ -// ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in -// actionSheet?.dismissAnimated() -// guard let strongSelf = self else { -// return -// } -// -// strongSelf.sendPhoneRequestedEvent(phone: nil) -// }) -// ])]) -// strongSelf.controller?.present(actionSheet, in: .window(.root)) -// }) default: break }