From 097eacdc34bc430a05b0a6a5a735b20631824b30 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Sat, 25 May 2024 02:29:19 +0400 Subject: [PATCH] Various improvements --- .../Telegram-iOS/en.lproj/Localizable.strings | 23 ++++ .../ItemListAvatarAndNameInfoItem/BUILD | 1 + .../Sources/ItemListAvatarAndNameItem.swift | 49 +++++++-- .../Sources/ChannelAdminController.swift | 2 +- .../ChannelBannedMemberController.swift | 2 +- .../Sources/DeviceContactInfoController.swift | 23 ++-- .../DataAndStorageSettingsController.swift | 65 ++++++++--- .../SaveIncomingMediaController.swift | 2 +- .../TelegramEngine/Payments/Stars.swift | 36 ++----- .../Payments/TelegramEnginePayments.swift | 12 +-- .../Sources/EmojiTextAttachmentView.swift | 4 +- .../Sources/ShareExtensionContext.swift | 2 +- .../Sources/StarsPurchaseScreen.swift | 6 +- .../Sources/StarsBalanceComponent.swift | 6 +- .../Sources/StarsTransactionScreen.swift | 102 +++++++++++++----- .../StarsTransactionsListPanelComponent.swift | 43 ++++---- ...sTransactionsPanelContainerComponent.swift | 8 +- .../Sources/StarsTransactionsScreen.swift | 93 +++++++++++----- .../Sources/StarsTransferScreen.swift | 7 +- .../Contents.json | 2 +- .../balancestar_48 (2).pdf | Bin .../Star.imageset/transactionstar_20 (2).pdf | Bin 12891 -> 0 bytes .../Stars/StarLarge.imageset/Contents.json | 2 +- .../Stars/StarLarge.imageset/Star20.pdf | Bin 0 -> 17487 bytes .../Stars/StarMedium.imageset/Contents.json | 12 +++ .../Stars/StarMedium.imageset/star_18.pdf | Bin 0 -> 17373 bytes .../Stars/StarSmall.imageset/Contents.json | 12 +++ .../Stars/StarSmall.imageset/star_16 (2).pdf | Bin 0 -> 15774 bytes .../Sources/CreateChannelController.swift | 2 +- .../Sources/CreateGroupController.swift | 2 +- 30 files changed, 352 insertions(+), 166 deletions(-) rename submodules/TelegramUI/Images.xcassets/Premium/Stars/{Star.imageset => BalanceStar.imageset}/Contents.json (71%) rename submodules/TelegramUI/Images.xcassets/Premium/Stars/{StarLarge.imageset => BalanceStar.imageset}/balancestar_48 (2).pdf (100%) delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/transactionstar_20 (2).pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Star20.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/star_18.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/star_16 (2).pdf diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 64b5d4beaa..127d6d2eda 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -12230,10 +12230,22 @@ Sorry for the inconvenience."; "Stars.Intro.Title" = "Telegram Stars"; "Stars.Intro.Description" = "Buy Stars to unlock content and services in miniapps on Telegram."; "Stars.Intro.Balance" = "Balance"; +"Stars.Intro.YourBalance" = "your balance"; +"Stars.Intro.Buy" = "Buy More Stars"; "Stars.Intro.AllTransactions" = "All Transactions"; "Stars.Intro.Incoming" = "Incoming"; "Stars.Intro.Outgoing" = "Outgoing"; +"Stars.Intro.Transaction.AppleTopUp.Title" = "Stars Top-Up"; +"Stars.Intro.Transaction.AppleTopUp.Subtitle" = "via App Store"; +"Stars.Intro.Transaction.GoogleTopUp.Title" = "Stars Top-Up"; +"Stars.Intro.Transaction.GoogleTopUp.Subtitle" = "via Play Market"; +"Stars.Intro.Transaction.PremiumBotTopUp.Title" = "Stars Top-Up"; +"Stars.Intro.Transaction.PremiumBotTopUp.Subtitle" = "via Premium Bot"; +"Stars.Intro.Transaction.FragmentTopUp.Title" = "Stars Top-Up"; +"Stars.Intro.Transaction.FragmentTopUp.Subtitle" = "via Fragment"; +"Stars.Intro.Transaction.Unsupported.Title" = "Unsupported"; + "Stars.Purchase.GetStars" = "Get Stars"; "Stars.Purchase.GetStarsInfo" = "Choose how many Stars you would like to buy."; @@ -12249,6 +12261,7 @@ Sorry for the inconvenience."; "Stars.Purchase.Info" = "By proceeding and purchasing Stars, you agree with [Terms and Conditions]()."; "Stars.Purchase.Terms_URL" = "https://telegram.org/tos"; +"Stars.Transaction.Via" = "Via"; "Stars.Transaction.To" = "To"; "Stars.Transaction.Id" = "Transaction ID"; "Stars.Transaction.Date" = "Date"; @@ -12256,6 +12269,16 @@ Sorry for the inconvenience."; "Stars.Transaction.Terms_URL" = "https://telegram.org/tos"; "Stars.Transaction.CopiedId" = "Transaction ID copied to clipboard."; +"Stars.Transaction.AppleTopUp.Title" = "Stars Top-Up"; +"Stars.Transaction.AppleTopUp.Subtitle" = "App Store"; +"Stars.Transaction.GoogleTopUp.Title" = "Stars Top-Up"; +"Stars.Transaction.GoogleTopUp.Subtitle" = "Play Market"; +"Stars.Transaction.PremiumBotTopUp.Title" = "Stars Top-Up"; +"Stars.Transaction.PremiumBotTopUp.Subtitle" = "Premium Bot"; +"Stars.Transaction.FragmentTopUp.Title" = "Stars Top-Up"; +"Stars.Transaction.FragmentTopUp.Subtitle" = "Fragment"; +"Stars.Transaction.Unsupported.Title" = "Unsupported"; + "Stars.Transfer.Title" = "Confirm Your Purchase"; "Stars.Transfer.Info" = "Do you want to buy **%1$@** in **%2$@** for **%3$@**?"; "Stars.Transfer.Info.Stars_1" = "%@ Star"; diff --git a/submodules/ItemListAvatarAndNameInfoItem/BUILD b/submodules/ItemListAvatarAndNameInfoItem/BUILD index e24785c855..dbf1c6e68d 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/BUILD +++ b/submodules/ItemListAvatarAndNameInfoItem/BUILD @@ -13,6 +13,7 @@ swift_library( "//submodules/SSignalKit/SwiftSignalKit:SwiftSignalKit", "//submodules/AsyncDisplayKit:AsyncDisplayKit", "//submodules/Display:Display", + "//submodules/Postbox:Postbox", "//submodules/TelegramCore:TelegramCore", "//submodules/TelegramPresentationData:TelegramPresentationData", "//submodules/PeerPresenceStatusManager:PeerPresenceStatusManager", diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index efc5bc8c84..7c467645b2 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Display import AsyncDisplayKit +import Postbox import TelegramCore import SwiftSignalKit import TelegramPresentationData @@ -60,7 +61,7 @@ public enum ItemListAvatarAndNameInfoItemName: Equatable { } } - public func composedDisplayTitle(context: AccountContext, strings: PresentationStrings) -> String { + public func composedDisplayTitle(context: AccountContext?, strings: PresentationStrings) -> String { switch self { case let .personName(firstName, lastName, phone): if !firstName.isEmpty { @@ -72,7 +73,11 @@ public enum ItemListAvatarAndNameInfoItemName: Equatable { } else if !lastName.isEmpty { return lastName } else if !phone.isEmpty { - return formatPhoneNumber(context: context, number: "+\(phone)") + if let context { + return formatPhoneNumber(context: context, number: "+\(phone)") + } else { + return "+\(phone)" + } } else { return strings.User_DeletedAccount } @@ -127,7 +132,18 @@ public enum ItemListAvatarAndNameInfoItemMode { } public class ItemListAvatarAndNameInfoItem: ListViewItem, ItemListItem { - let accountContext: AccountContext + public enum ItemContext { + case accountContext(AccountContext) + case other(accountPeerId: EnginePeer.Id, postbox: Postbox, network: Network) + + var accountContext: AccountContext? { + if case let .accountContext(accountContext) = self { + return accountContext + } + return nil + } + } + let itemContext: ItemContext let presentationData: ItemListPresentationData let dateTimeFormat: PresentationDateTimeFormat let mode: ItemListAvatarAndNameInfoItemMode @@ -150,8 +166,8 @@ public class ItemListAvatarAndNameInfoItem: ListViewItem, ItemListItem { public let selectable: Bool - public init(accountContext: AccountContext, presentationData: ItemListPresentationData, dateTimeFormat: PresentationDateTimeFormat, mode: ItemListAvatarAndNameInfoItemMode, peer: EnginePeer?, presence: EnginePeer.Presence?, label: String? = nil, memberCount: Int?, state: ItemListAvatarAndNameInfoItemState, sectionId: ItemListSectionId, style: ItemListAvatarAndNameInfoItemStyle, editingNameUpdated: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, editingNameCompleted: @escaping () -> Void = {}, avatarTapped: @escaping () -> Void, context: ItemListAvatarAndNameInfoItemContext? = nil, updatingImage: ItemListAvatarAndNameInfoItemUpdatingAvatar? = nil, call: (() -> Void)? = nil, action: (() -> Void)? = nil, longTapAction: (() -> Void)? = nil, tag: ItemListItemTag? = nil) { - self.accountContext = accountContext + public init(itemContext: ItemContext, presentationData: ItemListPresentationData, dateTimeFormat: PresentationDateTimeFormat, mode: ItemListAvatarAndNameInfoItemMode, peer: EnginePeer?, presence: EnginePeer.Presence?, label: String? = nil, memberCount: Int?, state: ItemListAvatarAndNameInfoItemState, sectionId: ItemListSectionId, style: ItemListAvatarAndNameInfoItemStyle, editingNameUpdated: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, editingNameCompleted: @escaping () -> Void = {}, avatarTapped: @escaping () -> Void, context: ItemListAvatarAndNameInfoItemContext? = nil, updatingImage: ItemListAvatarAndNameInfoItemUpdatingAvatar? = nil, call: (() -> Void)? = nil, action: (() -> Void)? = nil, longTapAction: (() -> Void)? = nil, tag: ItemListItemTag? = nil) { + self.itemContext = itemContext self.presentationData = presentationData self.dateTimeFormat = dateTimeFormat self.mode = mode @@ -358,7 +374,12 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo updatedTheme = item.presentationData.theme } - let premiumConfiguration = PremiumConfiguration.with(appConfiguration: item.accountContext.currentAppConfiguration.with { $0 }) + let premiumConfiguration: PremiumConfiguration + if case let .accountContext(context) = item.itemContext { + premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 }) + } else { + premiumConfiguration = .defaultValue + } var credibilityIconImage: UIImage? var credibilityIconOffset: CGFloat = 4.0 @@ -395,7 +416,7 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo nameMaximumNumberOfLines = 2 } - let (nameNodeLayout, nameNodeApply) = layoutNameNode(TextNodeLayoutArguments(attributedString: NSAttributedString(string: displayTitle.composedDisplayTitle(context: item.accountContext, strings: item.presentationData.strings), font: nameFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: nameMaximumNumberOfLines, truncationType: .end, constrainedSize: CGSize(width: baseWidth - 20 - 94.0 - (item.call != nil ? 36.0 : 0.0) - additionalTitleInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) + let (nameNodeLayout, nameNodeApply) = layoutNameNode(TextNodeLayoutArguments(attributedString: NSAttributedString(string: displayTitle.composedDisplayTitle(context: item.itemContext.accountContext, strings: item.presentationData.strings), font: nameFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor), backgroundColor: nil, maximumNumberOfLines: nameMaximumNumberOfLines, truncationType: .end, constrainedSize: CGSize(width: baseWidth - 20 - 94.0 - (item.call != nil ? 36.0 : 0.0) - additionalTitleInset, height: CGFloat.greatestFiniteMagnitude), alignment: .natural, cutout: nil, insets: UIEdgeInsets())) var statusText: String = "" let statusColor: UIColor @@ -404,7 +425,11 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo switch item.mode { case .settings: if let phone = peer.phone, !phone.isEmpty { - statusText += formatPhoneNumber(context: item.accountContext, number: phone) + if let accountContext = item.itemContext.accountContext { + statusText += formatPhoneNumber(context: accountContext, number: phone) + } else { + statusText += formatPhoneNumber(phone) + } } if let username = peer.addressName, !username.isEmpty { if !statusText.isEmpty { @@ -669,7 +694,13 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo overrideImage = .deletedIcon } - strongSelf.avatarNode.setPeer(context: item.accountContext, theme: item.presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: ignoreEmpty ? nil : item.presentationData.theme.list.mediaPlaceholderColor, synchronousLoad: synchronousLoads) + switch item.itemContext { + case let .accountContext(context): + strongSelf.avatarNode.setPeer(context: context, theme: item.presentationData.theme, peer: peer, overrideImage: overrideImage, emptyColor: ignoreEmpty ? nil : item.presentationData.theme.list.mediaPlaceholderColor, synchronousLoad: synchronousLoads) + case let .other(accountPeerId, postbox, network): + strongSelf.avatarNode.setPeer(accountPeerId: accountPeerId, postbox: postbox, network: network, contentSettings: .default, theme: item.presentationData.theme, peer: peer, authorOfMessage: nil, overrideImage: overrideImage, emptyColor: ignoreEmpty ? nil : item.presentationData.theme.list.mediaPlaceholderColor, synchronousLoad: synchronousLoads) + } + } let avatarFrame = CGRect(origin: CGPoint(x: params.leftInset + 15.0, y: floor((layout.contentSize.height - 66.0) / 2.0)), size: CGSize(width: 66.0, height: 66.0)) diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift index b45a71658b..87ba5d676e 100644 --- a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift @@ -346,7 +346,7 @@ private enum ChannelAdminEntry: ItemListNodeEntry { let arguments = arguments as! ChannelAdminControllerArguments switch self { case let .info(_, _, dateTimeFormat, peer, presence): - return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in + return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { }) case let .rankTitle(_, text, count, limit): diff --git a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift index 2e0ecd6a3a..f7b2f1b24a 100644 --- a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift @@ -215,7 +215,7 @@ private enum ChannelBannedMemberEntry: ItemListNodeEntry { let arguments = arguments as! ChannelBannedMemberControllerArguments switch self { case let .info(_, _, dateTimeFormat, peer, presence): - return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in + return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { }) case let .rightsHeader(_, text): diff --git a/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift b/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift index 9eeebabcdf..be85ed72cc 100644 --- a/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift +++ b/submodules/PeerInfoUI/Sources/DeviceContactInfoController.swift @@ -35,7 +35,7 @@ private enum DeviceContactInfoAction { } private final class DeviceContactInfoControllerArguments { - let accountContext: AccountContext? + let context: ShareControllerAccountContext let isPlain: Bool let updateEditingName: (ItemListAvatarAndNameInfoItemName) -> Void let updatePhone: (Int64, String) -> Void @@ -52,8 +52,8 @@ private final class DeviceContactInfoControllerArguments { let updateShareViaException: (Bool) -> Void let openAvatar: (EnginePeer) -> Void - init(accountContext: AccountContext?, isPlain: Bool, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updatePhone: @escaping (Int64, String) -> Void, updatePhoneLabel: @escaping (Int64, String) -> Void, deletePhone: @escaping (Int64) -> Void, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, addPhoneNumber: @escaping () -> Void, performAction: @escaping (DeviceContactInfoAction) -> Void, toggleSelection: @escaping (DeviceContactInfoDataId) -> Void, callPhone: @escaping (String) -> Void, openUrl: @escaping (String) -> Void, openAddress: @escaping (DeviceContactAddressData) -> Void, displayCopyContextMenu: @escaping (DeviceContactInfoEntryTag, String) -> Void, updateShareViaException: @escaping (Bool) -> Void, openAvatar: @escaping (EnginePeer) -> Void) { - self.accountContext = accountContext + init(context: ShareControllerAccountContext, isPlain: Bool, updateEditingName: @escaping (ItemListAvatarAndNameInfoItemName) -> Void, updatePhone: @escaping (Int64, String) -> Void, updatePhoneLabel: @escaping (Int64, String) -> Void, deletePhone: @escaping (Int64) -> Void, setPhoneIdWithRevealedOptions: @escaping (Int64?, Int64?) -> Void, addPhoneNumber: @escaping () -> Void, performAction: @escaping (DeviceContactInfoAction) -> Void, toggleSelection: @escaping (DeviceContactInfoDataId) -> Void, callPhone: @escaping (String) -> Void, openUrl: @escaping (String) -> Void, openAddress: @escaping (DeviceContactAddressData) -> Void, displayCopyContextMenu: @escaping (DeviceContactInfoEntryTag, String) -> Void, updateShareViaException: @escaping (Bool) -> Void, openAvatar: @escaping (EnginePeer) -> Void) { + self.context = context self.isPlain = isPlain self.updateEditingName = updateEditingName self.updatePhone = updatePhone @@ -406,10 +406,13 @@ private enum DeviceContactInfoEntry: ItemListNodeEntry { let arguments = arguments as! DeviceContactInfoControllerArguments switch self { case let .info(_, _, _, dateTimeFormat, peer, state, jobSummary, _, hiddenAvatar): - guard let accountContext = arguments.accountContext else { - fatalError() + let itemContext: ItemListAvatarAndNameInfoItem.ItemContext + if let context = arguments.context as? ShareControllerAppAccountContext { + itemContext = .accountContext(context.context) + } else { + itemContext = .other(accountPeerId: arguments.context.accountPeerId, postbox: arguments.context.stateManager.postbox, network: arguments.context.stateManager.network) } - return ItemListAvatarAndNameInfoItem(accountContext: accountContext, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .contact, peer: peer, presence: nil, label: jobSummary, memberCount: nil, state: state, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks(withTopInset: false, withExtendedBottomInset: true), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(itemContext: itemContext, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .contact, peer: peer, presence: nil, label: jobSummary, memberCount: nil, state: state, sectionId: self.section, style: arguments.isPlain ? .plain : .blocks(withTopInset: false, withExtendedBottomInset: true), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, avatarTapped: { if peer.smallProfileImage != nil { @@ -945,13 +948,7 @@ public func deviceContactInfoController(context: ShareControllerAccountContext, shareViaException = shareViaExceptionValue } - let accountContext: AccountContext? - if let context = context as? ShareControllerAppAccountContext { - accountContext = context.context - } else { - accountContext = nil - } - let arguments = DeviceContactInfoControllerArguments(accountContext: accountContext, isPlain: !isShare, updateEditingName: { editingName in + let arguments = DeviceContactInfoControllerArguments(context: context, isPlain: !isShare, updateEditingName: { editingName in updateState { state in var state = state if let _ = state.editingState { diff --git a/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift b/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift index e5f16c1201..177571d2b1 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/DataAndStorageSettingsController.swift @@ -35,8 +35,9 @@ private final class DataAndStorageControllerArguments { let openBrowserSelection: () -> Void let openIntents: () -> Void let toggleEnableSensitiveContent: (Bool) -> Void + let presentSensitiveContentConfirmation: () -> Void - init(openStorageUsage: @escaping () -> Void, openNetworkUsage: @escaping () -> Void, openProxy: @escaping () -> Void, openAutomaticDownloadConnectionType: @escaping (AutomaticDownloadConnectionType) -> Void, resetAutomaticDownload: @escaping () -> Void, toggleVoiceUseLessData: @escaping (Bool) -> Void, openSaveIncoming: @escaping (AutomaticSaveIncomingPeerType) -> Void, toggleSaveEditedPhotos: @escaping (Bool) -> Void, togglePauseMusicOnRecording: @escaping (Bool) -> Void, toggleRaiseToListen: @escaping (Bool) -> Void, toggleDownloadInBackground: @escaping (Bool) -> Void, openBrowserSelection: @escaping () -> Void, openIntents: @escaping () -> Void, toggleEnableSensitiveContent: @escaping (Bool) -> Void) { + init(openStorageUsage: @escaping () -> Void, openNetworkUsage: @escaping () -> Void, openProxy: @escaping () -> Void, openAutomaticDownloadConnectionType: @escaping (AutomaticDownloadConnectionType) -> Void, resetAutomaticDownload: @escaping () -> Void, toggleVoiceUseLessData: @escaping (Bool) -> Void, openSaveIncoming: @escaping (AutomaticSaveIncomingPeerType) -> Void, toggleSaveEditedPhotos: @escaping (Bool) -> Void, togglePauseMusicOnRecording: @escaping (Bool) -> Void, toggleRaiseToListen: @escaping (Bool) -> Void, toggleDownloadInBackground: @escaping (Bool) -> Void, openBrowserSelection: @escaping () -> Void, openIntents: @escaping () -> Void, toggleEnableSensitiveContent: @escaping (Bool) -> Void, presentSensitiveContentConfirmation: @escaping () -> Void) { self.openStorageUsage = openStorageUsage self.openNetworkUsage = openNetworkUsage self.openProxy = openProxy @@ -51,6 +52,7 @@ private final class DataAndStorageControllerArguments { self.openBrowserSelection = openBrowserSelection self.openIntents = openIntents self.toggleEnableSensitiveContent = toggleEnableSensitiveContent + self.presentSensitiveContentConfirmation = presentSensitiveContentConfirmation } } @@ -110,6 +112,7 @@ private enum DataAndStorageEntry: ItemListNodeEntry { case connectionHeader(PresentationTheme, String) case connectionProxy(PresentationTheme, String, String) case enableSensitiveContent(String, Bool) + case enableSensitiveContentInfo(String) var section: ItemListSectionId { switch self { @@ -127,7 +130,7 @@ private enum DataAndStorageEntry: ItemListNodeEntry { return DataAndStorageSection.other.rawValue case .connectionHeader, .connectionProxy: return DataAndStorageSection.connection.rawValue - case .enableSensitiveContent: + case .enableSensitiveContent, .enableSensitiveContentInfo: return DataAndStorageSection.enableSensitiveContent.rawValue } } @@ -174,12 +177,14 @@ private enum DataAndStorageEntry: ItemListNodeEntry { return 34 case .raiseToListenInfo: return 35 - case .connectionHeader: - return 36 - case .connectionProxy: - return 37 case .enableSensitiveContent: + return 36 + case .enableSensitiveContentInfo: + return 37 + case .connectionHeader: return 38 + case .connectionProxy: + return 39 } } @@ -323,6 +328,12 @@ private enum DataAndStorageEntry: ItemListNodeEntry { } else { return false } + case let .enableSensitiveContentInfo(text): + if case .enableSensitiveContentInfo(text) = rhs { + return true + } else { + return false + } } } @@ -421,9 +432,15 @@ private enum DataAndStorageEntry: ItemListNodeEntry { arguments.openProxy() }) case let .enableSensitiveContent(text, value): - return ItemListSwitchItem(presentationData: presentationData, title: text, value: value, sectionId: self.section, style: .blocks, updated: { value in - arguments.toggleEnableSensitiveContent(value) + return ItemListSwitchItem(presentationData: presentationData, title: text, value: value, enableInteractiveChanges: value, sectionId: self.section, style: .blocks, updated: { updatedValue in + if value { + arguments.toggleEnableSensitiveContent(updatedValue) + } else { + arguments.presentSensitiveContentConfirmation() + } }, tag: nil) + case let .enableSensitiveContentInfo(text): + return ItemListTextItem(presentationData: presentationData, text: .markdown(text), sectionId: self.section) } } } @@ -627,6 +644,14 @@ private func dataAndStorageControllerEntries(state: DataAndStorageControllerStat entries.append(.raiseToListen(presentationData.theme, presentationData.strings.Settings_RaiseToListen, data.mediaInputSettings.enableRaiseToSpeak)) entries.append(.raiseToListenInfo(presentationData.theme, presentationData.strings.Settings_RaiseToListenInfo)) + +#if DEBUG + if let contentSettingsConfiguration = contentSettingsConfiguration { //, contentSettingsConfiguration.canAdjustSensitiveContent { + entries.append(.enableSensitiveContent("Show 18+ Content", contentSettingsConfiguration.sensitiveContentEnabled)) + entries.append(.enableSensitiveContentInfo("Do not hide media that contain content suitable only for adults.")) + } +#endif + let proxyValue: String if let proxySettings = data.proxySettings, let activeServer = proxySettings.activeServer, proxySettings.enabled { switch activeServer.connection { @@ -640,13 +665,7 @@ private func dataAndStorageControllerEntries(state: DataAndStorageControllerStat } entries.append(.connectionHeader(presentationData.theme, presentationData.strings.ChatSettings_ConnectionType_Title.uppercased())) entries.append(.connectionProxy(presentationData.theme, presentationData.strings.SocksProxySetup_Title, proxyValue)) - - #if DEBUG - if let contentSettingsConfiguration = contentSettingsConfiguration, contentSettingsConfiguration.canAdjustSensitiveContent { - entries.append(.enableSensitiveContent("Display Sensitive Content", contentSettingsConfiguration.sensitiveContentEnabled)) - } - #endif - + return entries } @@ -779,6 +798,8 @@ public func dataAndStorageController(context: AccountContext, focusOnItemTag: Da return DataAndStorageData(automaticMediaDownloadSettings: automaticMediaDownloadSettings, autodownloadSettings: autodownloadSettings, generatedMediaStoreSettings: generatedMediaStoreSettings, mediaInputSettings: mediaInputSettings, voiceCallSettings: voiceCallSettings, proxySettings: proxySettings) }) + var enableSensitiveContentImpl: (() -> Void)? + let arguments = DataAndStorageControllerArguments(openStorageUsage: { pushControllerImpl?(StorageUsageScreen(context: context, makeStorageUsageExceptionsScreen: { category in return storageUsageExceptionsScreen(context: context, category: category) @@ -882,8 +903,22 @@ public func dataAndStorageController(context: AccountContext, focusOnItemTag: Da } }) updateSensitiveContentDisposable.set(updateRemoteContentSettingsConfiguration(postbox: context.account.postbox, network: context.account.network, sensitiveContentEnabled: value).start()) + }, presentSensitiveContentConfirmation: { + let controller = textAlertController(context: context, title: "18+ Content", text: "Confirm that you are over 18 years old and update your settings to see potentially explicit and sensitive content.", actions: [ + TextAlertAction(type: .genericAction, title: "Cancel", action: { + + }), + TextAlertAction(type: .defaultAction, title: "Confirm", action: { + enableSensitiveContentImpl?() + }) + ]) + presentControllerImpl?(controller, nil) }) + enableSensitiveContentImpl = { + arguments.toggleEnableSensitiveContent(true) + } + let preferencesKey: PostboxViewKey = .preferences(keys: Set([ApplicationSpecificPreferencesKeys.mediaAutoSaveSettings])) let preferences = context.account.postbox.combinedView(keys: [preferencesKey]) |> map { views -> MediaAutoSaveSettings in diff --git a/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift b/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift index 9f4dca4e0e..b361db75b4 100644 --- a/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift +++ b/submodules/SettingsUI/Sources/Data and Storage/SaveIncomingMediaController.swift @@ -167,7 +167,7 @@ private enum SaveIncomingMediaEntry: ItemListNodeEntry { switch self { case let .peer(peer, presence): return ItemListAvatarAndNameInfoItem( - accountContext: arguments.context, + itemContext: .accountContext(arguments.context), presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), mode: .generic, diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift index 9e87fb6957..dbb04fca3d 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift @@ -72,10 +72,10 @@ struct InternalStarsStatus { let nextOffset: String? } -func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id, offset: String?) -> Signal { +func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id, offset: String?) -> Signal { return account.postbox.transaction { transaction -> Peer? in return transaction.getPeer(peerId) - } |> mapToSignal { peer -> Signal in + } |> mapToSignal { peer -> Signal in guard let peer, let inputPeer = apiInputPeer(peer) else { return .never() } @@ -88,15 +88,9 @@ func _internal_requestStarsState(account: Account, peerId: EnginePeer.Id, offset } return signal - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) - } - |> mapToSignal { result -> Signal in - guard let result else { - return .single(nil) - } - return account.postbox.transaction { transaction -> InternalStarsStatus? in + |> retryRequest + |> mapToSignal { result -> Signal in + return account.postbox.transaction { transaction -> InternalStarsStatus in switch result { case let .starsStatus(_, balance, history, nextOffset, chats, users): let peers = AccumulatedPeers(chats: chats, users: users) @@ -168,14 +162,10 @@ private final class StarsContextImpl { self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, offset: nil) |> deliverOnMainQueue).start(next: { [weak self] status in if let self { - if let status { - self._state = StarsContext.State(balance: status.balance, transactions: status.transactions, canLoadMore: status.nextOffset != nil, isLoading: false) - self.nextOffset = status.nextOffset - - self.loadMore() - } else { - self._state = nil - } + self._state = StarsContext.State(balance: status.balance, transactions: status.transactions, canLoadMore: status.nextOffset != nil, isLoading: false) + self.nextOffset = status.nextOffset + + self.loadMore() } })) } @@ -202,12 +192,8 @@ private final class StarsContextImpl { self.disposable.set((_internal_requestStarsState(account: self.account, peerId: self.peerId, offset: nextOffset) |> deliverOnMainQueue).start(next: { [weak self] status in if let self { - if let status { - self._state = StarsContext.State(balance: status.balance, transactions: currentState.transactions + status.transactions, canLoadMore: status.nextOffset != nil, isLoading: false) - self.nextOffset = status.nextOffset - } else { - self.nextOffset = nil - } + self._state = StarsContext.State(balance: status.balance, transactions: currentState.transactions + status.transactions, canLoadMore: status.nextOffset != nil, isLoading: false) + self.nextOffset = status.nextOffset } })) } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift index 8cba75d6bf..23b0b369d4 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Payments/TelegramEnginePayments.swift @@ -73,17 +73,7 @@ public extension TelegramEngine { public func peerStarsContext(peerId: EnginePeer.Id) -> StarsContext { return StarsContext(account: self.account, peerId: peerId) } - - public func peerStarsState(peerId: EnginePeer.Id) -> Signal { - return _internal_requestStarsState(account: self.account, peerId: peerId, offset: nil) - |> map { state -> StarsContext.State? in - guard let state else { - return nil - } - return StarsContext.State(balance: state.balance, transactions: state.transactions, canLoadMore: false, isLoading: false) - } - } - + public func sendStarsPaymentForm(formId: Int64, source: BotPaymentInvoiceSource) -> Signal { return _internal_sendStarsPaymentForm(account: self.account, formId: formId, source: source) } diff --git a/submodules/TelegramUI/Components/EmojiTextAttachmentView/Sources/EmojiTextAttachmentView.swift b/submodules/TelegramUI/Components/EmojiTextAttachmentView/Sources/EmojiTextAttachmentView.swift index c4c232a975..6613b4752b 100644 --- a/submodules/TelegramUI/Components/EmojiTextAttachmentView/Sources/EmojiTextAttachmentView.swift +++ b/submodules/TelegramUI/Components/EmojiTextAttachmentView/Sources/EmojiTextAttachmentView.swift @@ -847,8 +847,8 @@ private let starImage: UIImage? = { generateImage(CGSize(width: 32.0, height: 32.0), contextGenerator: { size, context in context.clear(CGRect(origin: .zero, size: size)) - if let image = generateTintedImage(image: UIImage(bundleImageName: "Premium/Stars/Star"), color: .white), let cgImage = image.cgImage { - context.draw(cgImage, in: CGRect(origin: .zero, size: size).insetBy(dx: 2.0, dy: 2.0), byTiling: false) + if let image = generateTintedImage(image: UIImage(bundleImageName: "Item List/PremiumIcon"), color: .white), let cgImage = image.cgImage { + context.draw(cgImage, in: CGRect(origin: .zero, size: size).insetBy(dx: 4.0, dy: 4.0), byTiling: false) } })?.withRenderingMode(.alwaysTemplate) }() diff --git a/submodules/TelegramUI/Components/ShareExtensionContext/Sources/ShareExtensionContext.swift b/submodules/TelegramUI/Components/ShareExtensionContext/Sources/ShareExtensionContext.swift index d963c523a2..8616872705 100644 --- a/submodules/TelegramUI/Components/ShareExtensionContext/Sources/ShareExtensionContext.swift +++ b/submodules/TelegramUI/Components/ShareExtensionContext/Sources/ShareExtensionContext.swift @@ -317,7 +317,7 @@ public class ShareRootControllerImpl { presentationDataPromise.set(.single(presentationData)) var immediatePeerId: PeerId? - if #available(iOS 13.2, *), let sendMessageIntent = self.getExtensionContext()?.intent as? INSendMessageIntent { + if !"".isEmpty, #available(iOS 13.2, *), let sendMessageIntent = self.getExtensionContext()?.intent as? INSendMessageIntent { if let contact = sendMessageIntent.recipients?.first, let handle = contact.customIdentifier, handle.hasPrefix("tg") { let string = handle.suffix(from: handle.index(handle.startIndex, offsetBy: 2)) if let peerId = Int64(string) { diff --git a/submodules/TelegramUI/Components/Stars/StarsPurchaseScreen/Sources/StarsPurchaseScreen.swift b/submodules/TelegramUI/Components/Stars/StarsPurchaseScreen/Sources/StarsPurchaseScreen.swift index e4bfca1905..5eb583a75b 100644 --- a/submodules/TelegramUI/Components/Stars/StarsPurchaseScreen/Sources/StarsPurchaseScreen.swift +++ b/submodules/TelegramUI/Components/Stars/StarsPurchaseScreen/Sources/StarsPurchaseScreen.swift @@ -1059,13 +1059,13 @@ func generateStarsIcon(count: Int) -> UIImage { var originX = floorToScreenPixels((size.width - totalWidth) / 2.0) - let mainImage = UIImage(bundleImageName: "Premium/Stars/Star") + let mainImage = UIImage(bundleImageName: "Premium/Stars/StarLarge") if let cgImage = mainImage?.cgImage, let partCGImage = partImage.cgImage { context.draw(cgImage, in: CGRect(origin: CGPoint(x: originX, y: 0.0), size: imageSize), byTiling: false) - originX += spacing + originX += spacing + UIScreenPixel for _ in 0 ..< count - 1 { - context.draw(partCGImage, in: CGRect(origin: CGPoint(x: originX, y: UIScreenPixel), size: imageSize), byTiling: false) + context.draw(partCGImage, in: CGRect(origin: CGPoint(x: originX, y: -UIScreenPixel), size: imageSize).insetBy(dx: -1.0 + UIScreenPixel, dy: -1.0 + UIScreenPixel), byTiling: false) originX += spacing } } diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsBalanceComponent.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsBalanceComponent.swift index e1371b6504..a2a67317f9 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsBalanceComponent.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsBalanceComponent.swift @@ -52,7 +52,7 @@ final class StarsBalanceComponent: Component { override init(frame: CGRect) { super.init(frame: frame) - self.icon.image = UIImage(bundleImageName: "Premium/Stars/StarLarge") + self.icon.image = UIImage(bundleImageName: "Premium/Stars/BalanceStar") self.addSubview(self.icon) } @@ -107,7 +107,7 @@ final class StarsBalanceComponent: Component { transition: .immediate, component: AnyComponent( MultilineTextComponent( - text: .plain(NSAttributedString(string: "your balance", font: Font.regular(17.0), textColor: component.theme.list.itemSecondaryTextColor)), + text: .plain(NSAttributedString(string: component.strings.Stars_Intro_YourBalance, font: Font.regular(17.0), textColor: component.theme.list.itemSecondaryTextColor)), horizontalAlignment: .center ) ), @@ -126,7 +126,7 @@ final class StarsBalanceComponent: Component { transition: .immediate, component: AnyComponent( SolidRoundedButtonComponent( - title: "Buy More Stars", + title: component.strings.Stars_Intro_Buy, theme: SolidRoundedButtonComponent.Theme(theme: component.theme), height: 50.0, cornerRadius: 11.0, diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionScreen.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionScreen.swift index 11fe0415ac..a9e8e3b5c7 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionScreen.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionScreen.swift @@ -118,7 +118,9 @@ private final class StarsTransactionSheetContent: CombinedComponent { let closeButton = Child(Button.self) let title = Child(MultilineTextComponent.self) let star = Child(GiftAvatarComponent.self) - let description = Child(BalancedTextComponent.self) + let amount = Child(BalancedTextComponent.self) + let amountStar = Child(BundleIconComponent.self) + let description = Child(MultilineTextComponent.self) let table = Child(TableComponent.self) let additional = Child(BalancedTextComponent.self) let button = Child(SolidRoundedButtonComponent.self) @@ -157,6 +159,7 @@ private final class StarsTransactionSheetContent: CombinedComponent { ) let titleText: String + let amountText: String let descriptionText: String let additionalText: String let buttonText: String @@ -164,6 +167,7 @@ private final class StarsTransactionSheetContent: CombinedComponent { let count: Int64 let transactionId: String? let date: Int32 + let via: String? let toPeer: EnginePeer? let photo: TelegramMediaWebFile? @@ -173,17 +177,24 @@ private final class StarsTransactionSheetContent: CombinedComponent { switch transaction.peer { case let .peer(peer): titleText = transaction.title ?? peer.compactDisplayTitle + via = nil case .appStore: - titleText = "In-App Purchase" + titleText = strings.Stars_Transaction_AppleTopUp_Title + via = strings.Stars_Transaction_AppleTopUp_Subtitle case .playMarket: - titleText = "Play Market" + titleText = strings.Stars_Transaction_GoogleTopUp_Title + via = strings.Stars_Transaction_GoogleTopUp_Subtitle case .premiumBot: - titleText = "Premium Bot" + titleText = strings.Stars_Transaction_PremiumBotTopUp_Title + via = strings.Stars_Transaction_PremiumBotTopUp_Subtitle case .fragment: - titleText = "Fragment" + titleText = strings.Stars_Transaction_FragmentTopUp_Title + via = strings.Stars_Transaction_FragmentTopUp_Subtitle case .unsupported: - titleText = "Unsupported" + titleText = strings.Stars_Transaction_Unsupported_Title + via = nil } + descriptionText = transaction.description ?? "" count = transaction.count transactionId = transaction.id @@ -196,7 +207,9 @@ private final class StarsTransactionSheetContent: CombinedComponent { photo = transaction.photo case let .receipt(receipt): titleText = receipt.invoiceMedia.title + descriptionText = receipt.invoiceMedia.description count = (receipt.invoice.prices.first?.amount ?? receipt.invoiceMedia.totalAmount) * -1 + via = nil transactionId = receipt.transactionId date = receipt.date if let peer = state.peerMap[receipt.botPaymentId] { @@ -207,22 +220,15 @@ private final class StarsTransactionSheetContent: CombinedComponent { photo = receipt.invoiceMedia.photo } + let formattedAmount = presentationStringsFormattedNumber(abs(Int32(count)), dateTimeFormat.decimalSeparator) + if count < 0 { + amountText = "- \(formattedAmount)" + } else { + amountText = "+ \(formattedAmount)" + } additionalText = strings.Stars_Transaction_Terms buttonText = strings.Common_OK - if count < 0 { - descriptionText = " - \(count * -1) # " - } else { - descriptionText = " + \(count) # " - } - - let descriptionAttributedText = NSMutableAttributedString(string: descriptionText, font: Font.semibold(18.0), textColor: descriptionText.hasPrefix("-") ? theme.list.itemDestructiveColor : theme.list.itemDisclosureActions.constructive.fillColor) - if let range = descriptionAttributedText.string.range(of: "#"), let chevronImage = generateTintedImage(image: UIImage(bundleImageName: "Item List/PremiumIcon"), color: UIColor(rgb: 0xf09903)) { - descriptionAttributedText.addAttribute(.attachment, value: chevronImage, range: NSRange(range, in: descriptionAttributedText.string)) - descriptionAttributedText.addAttribute(.foregroundColor, value: UIColor(rgb: 0xf09903), range: NSRange(range, in: descriptionAttributedText.string)) - descriptionAttributedText.addAttribute(.baselineOffset, value: 2.0, range: NSRange(range, in: descriptionAttributedText.string)) - } - let title = title.update( component: MultilineTextComponent( text: .plain(NSAttributedString( @@ -254,9 +260,10 @@ private final class StarsTransactionSheetContent: CombinedComponent { transition: .immediate ) - let description = description.update( + let amountAttributedText = NSMutableAttributedString(string: amountText, font: Font.semibold(17.0), textColor: amountText.hasPrefix("-") ? theme.list.itemDestructiveColor : theme.list.itemDisclosureActions.constructive.fillColor) + let amount = amount.update( component: BalancedTextComponent( - text: .plain(descriptionAttributedText), + text: .plain(amountAttributedText), horizontalAlignment: .center, maximumNumberOfLines: 0, lineSpacing: 0.2 @@ -264,7 +271,16 @@ private final class StarsTransactionSheetContent: CombinedComponent { availableSize: CGSize(width: context.availableSize.width - textSideInset * 2.0, height: context.availableSize.height), transition: .immediate ) - + + let amountStar = amountStar.update( + component: BundleIconComponent( + name: "Premium/Stars/StarMedium", + tintColor: nil + ), + availableSize: context.availableSize, + transition: .immediate + ) + let tableFont = Font.regular(15.0) let tableTextColor = theme.list.itemPrimaryTextColor let tableLinkColor = theme.list.itemAccentColor @@ -294,6 +310,14 @@ private final class StarsTransactionSheetContent: CombinedComponent { ) ) )) + } else if let via { + tableItems.append(.init( + id: "via", + title: strings.Stars_Transaction_Via, + component: AnyComponent( + MultilineTextComponent(text: .plain(NSAttributedString(string: via, font: tableFont, textColor: tableTextColor))) + ) + )) } if let transactionId { @@ -393,10 +417,35 @@ private final class StarsTransactionSheetContent: CombinedComponent { var originY: CGFloat = 0.0 originY += star.size.height - 23.0 - context.add(description - .position(CGPoint(x: context.availableSize.width / 2.0, y: originY + description.size.height / 2.0)) + if !descriptionText.isEmpty { + let description = description.update( + component: MultilineTextComponent( + text: .plain(NSAttributedString( + string: descriptionText, + font: Font.regular(15.0), + textColor: theme.actionSheet.primaryTextColor, + paragraphAlignment: .center + )), + horizontalAlignment: .center, + maximumNumberOfLines: 3 + ), + availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0 - 60.0, height: CGFloat.greatestFiniteMagnitude), + transition: .immediate + ) + context.add(description + .position(CGPoint(x: context.availableSize.width / 2.0, y: originY + description.size.height / 2.0)) + ) + originY += description.size.height + 10.0 + } + + context.add(amount + .position(CGPoint(x: context.availableSize.width / 2.0 - 10.0, y: originY + amount.size.height / 2.0)) ) - originY += description.size.height + 20.0 + context.add(amountStar + .position(CGPoint(x: context.availableSize.width / 2.0 + amount.size.width / 2.0 + amountStar.size.width / 2.0 - 7.0, y: originY + amountStar.size.height / 2.0)) + ) + + originY += amount.size.height + 20.0 context.add(table .position(CGPoint(x: context.availableSize.width / 2.0, y: originY + table.size.height / 2.0)) @@ -1054,7 +1103,6 @@ private final class TransactionCellComponent: Component { let size = CGSize(width: textSize.width + spacing + buttonSize.width, height: textSize.height) - let buttonFrame = CGRect(origin: CGPoint(x: textSize.width + spacing, y: floorToScreenPixels((size.height - buttonSize.height) / 2.0)), size: buttonSize) if let buttonView = self.button.view { if buttonView.superview == nil { @@ -1063,7 +1111,7 @@ private final class TransactionCellComponent: Component { transition.setFrame(view: buttonView, frame: buttonFrame) } - let textFrame = CGRect(origin: CGPoint(x: 0.0, y: floorToScreenPixels((size.height - textSize.height) / 2.0)), size: textSize) + let textFrame = CGRect(origin: CGPoint(x: 0.0, y: floorToScreenPixels((size.height - textSize.height) / 2.0) + 1.0), size: textSize) if let textView = self.text.view { if textView.superview == nil { self.addSubview(textView) diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift index 93c0ebe317..9e15b901bf 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsListPanelComponent.swift @@ -203,7 +203,7 @@ final class StarsTransactionsListPanelComponent: Component { separatorView = UIView() self.separatorViews[id] = separatorView - self.addSubview(separatorView) + self.scrollView.addSubview(separatorView) } separatorView.backgroundColor = environment.theme.list.itemBlocksSeparatorColor @@ -213,33 +213,38 @@ final class StarsTransactionsListPanelComponent: Component { let itemTitle: String let itemSubtitle: String? let itemDate: String - let itemLabel: NSAttributedString switch item.transaction.peer { case let .peer(peer): itemTitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast) itemSubtitle = item.transaction.title - itemLabel = NSAttributedString(string: "- \(item.transaction.count * -1)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDestructiveColor) case .appStore: - itemTitle = "Stars Top-Up" - itemSubtitle = "via App Store" - itemLabel = NSAttributedString(string: "+ \(item.transaction.count)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDisclosureActions.constructive.fillColor) + itemTitle = environment.strings.Stars_Intro_Transaction_AppleTopUp_Title + itemSubtitle = environment.strings.Stars_Intro_Transaction_AppleTopUp_Subtitle case .playMarket: - itemTitle = "Stars Top-Up" - itemSubtitle = "via Play Market" - itemLabel = NSAttributedString(string: "+ \(item.transaction.count)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDisclosureActions.constructive.fillColor) + itemTitle = environment.strings.Stars_Intro_Transaction_GoogleTopUp_Title + itemSubtitle = environment.strings.Stars_Intro_Transaction_GoogleTopUp_Subtitle case .fragment: - itemTitle = "Stars Top-Up" - itemSubtitle = "via Fragment" - itemLabel = NSAttributedString(string: "+ \(item.transaction.count)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDisclosureActions.constructive.fillColor) + itemTitle = environment.strings.Stars_Intro_Transaction_FragmentTopUp_Title + itemSubtitle = environment.strings.Stars_Intro_Transaction_FragmentTopUp_Subtitle case .premiumBot: - itemTitle = "Stars Top-Up" - itemSubtitle = "via Premium Bot" - itemLabel = NSAttributedString(string: "+ \(item.transaction.count)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDisclosureActions.constructive.fillColor) + itemTitle = environment.strings.Stars_Intro_Transaction_PremiumBotTopUp_Title + itemSubtitle = environment.strings.Stars_Intro_Transaction_PremiumBotTopUp_Subtitle case .unsupported: - itemTitle = "Unsupported" + itemTitle = environment.strings.Stars_Intro_Transaction_Unsupported_Title itemSubtitle = nil - itemLabel = NSAttributedString(string: "+ \(item.transaction.count)", font: Font.medium(fontBaseDisplaySize), textColor: environment.theme.list.itemDisclosureActions.constructive.fillColor) } + + let itemLabel: NSAttributedString + let labelString: String + + let formattedLabel = presentationStringsFormattedNumber(abs(Int32(item.transaction.count)), environment.dateTimeFormat.decimalSeparator) + if item.transaction.count < 0 { + labelString = "- \(formattedLabel)" + } else { + labelString = "+ \(formattedLabel)" + } + itemLabel = NSAttributedString(string: labelString, font: Font.medium(fontBaseDisplaySize), textColor: labelString.hasPrefix("-") ? environment.theme.list.itemDestructiveColor : environment.theme.list.itemDisclosureActions.constructive.fillColor) + itemDate = stringForMediumCompactDate(timestamp: item.transaction.date, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat) var titleComponents: [AnyComponentWithIdentity] = [] @@ -577,7 +582,7 @@ private final class LabelComponent: CombinedComponent { let iconSize = CGSize(width: 20.0, height: 20.0) let icon = icon.update( component: BundleIconComponent( - name: "Premium/Stars/Star", + name: "Premium/Stars/StarLarge", tintColor: nil ), availableSize: iconSize, @@ -592,7 +597,7 @@ private final class LabelComponent: CombinedComponent { .position(CGPoint(x: text.size.width / 2.0, y: size.height / 2.0)) ) context.add(icon - .position(CGPoint(x: totalWidth - iconSize.width / 2.0, y: size.height / 2.0)) + .position(CGPoint(x: totalWidth - iconSize.width / 2.0, y: size.height / 2.0 - UIScreenPixel)) ) return size } diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsPanelContainerComponent.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsPanelContainerComponent.swift index e295255123..0176aca27d 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsPanelContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsPanelContainerComponent.swift @@ -623,7 +623,9 @@ final class StarsTransactionsPanelContainerComponent: Component { } } - let _ = self.header.update( + let sideInset: CGFloat = 16.0 + let condensedPanelWidth: CGFloat = availableSize.width - sideInset * 2.0 + let headerSize = self.header.update( transition: transition, component: AnyComponent(StarsTransactionsHeaderComponent( theme: component.theme, @@ -648,13 +650,13 @@ final class StarsTransactionsPanelContainerComponent: Component { } )), environment: {}, - containerSize: topPanelFrame.size + containerSize: CGSize(width: condensedPanelWidth, height: topPanelFrame.size.height) ) if let headerView = self.header.view { if headerView.superview == nil { self.addSubview(headerView) } - transition.setFrame(view: headerView, frame: topPanelFrame) + transition.setFrame(view: headerView, frame: CGRect(origin: topPanelFrame.origin.offsetBy(dx: sideInset, dy: 0.0), size: headerSize)) } let childEnvironment = StarsTransactionsPanelEnvironment( diff --git a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift index 2398bbfd58..c65b493a29 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransactionsScreen/Sources/StarsTransactionsScreen.swift @@ -15,6 +15,7 @@ import BalancedTextComponent import Markdown import PremiumStarComponent import ListSectionComponent +import BundleIconComponent import TextFormat final class StarsTransactionsScreenComponent: Component { @@ -90,7 +91,9 @@ final class StarsTransactionsScreenComponent: Component { private let balanceView = ComponentView() - private let topBalanceView = ComponentView() + private let topBalanceTitleView = ComponentView() + private let topBalanceValueView = ComponentView() + private let topBalanceIconView = ComponentView() private let panelContainer = ComponentView() @@ -241,8 +244,15 @@ final class StarsTransactionsScreenComponent: Component { panelContainerView.updateNavigationMergeFactor(value: 1.0 - expansionDistanceFactor, transition: transition) } - if let topBalanceView = self.topBalanceView.view { - topBalanceView.alpha = 1.0 - expansionDistanceFactor + let topBalanceAlpha = 1.0 - expansionDistanceFactor + if let view = self.topBalanceTitleView.view { + view.alpha = topBalanceAlpha + } + if let view = self.topBalanceValueView.view { + view.alpha = topBalanceAlpha + } + if let view = self.topBalanceIconView.view { + view.alpha = topBalanceAlpha } } @@ -408,36 +418,69 @@ final class StarsTransactionsScreenComponent: Component { starTransition.setBounds(view: titleView, bounds: CGRect(origin: .zero, size: titleSize)) } - let textFont = Font.regular(14.0) - let boldTextFont = Font.semibold(14.0) - let textColor = environment.theme.actionSheet.primaryTextColor - let linkColor = environment.theme.actionSheet.controlAccentColor - let markdownAttributes = MarkdownAttributes(body: MarkdownAttributeSet(font: textFont, textColor: textColor), bold: MarkdownAttributeSet(font: boldTextFont, textColor: textColor), link: MarkdownAttributeSet(font: textFont, textColor: linkColor), linkAttribute: { contents in - return (TelegramTextAttributes.URL, contents) - }) - let balanceAttributedString = parseMarkdownIntoAttributedString(" \(environment.strings.Stars_Intro_Balance)\n # **\(self.starsState?.balance ?? 0)**", attributes: markdownAttributes, textAlignment: .right).mutableCopy() as! NSMutableAttributedString - if let range = balanceAttributedString.string.range(of: "#"), let chevronImage = generateTintedImage(image: UIImage(bundleImageName: "Item List/PremiumIcon"), color: UIColor(rgb: 0xf09903)) { - balanceAttributedString.addAttribute(.attachment, value: chevronImage, range: NSRange(range, in: balanceAttributedString.string)) - balanceAttributedString.addAttribute(.foregroundColor, value: UIColor(rgb: 0xf09903), range: NSRange(range, in: balanceAttributedString.string)) - balanceAttributedString.addAttribute(.baselineOffset, value: 2.0, range: NSRange(range, in: balanceAttributedString.string)) - } - let topBalanceSize = self.topBalanceView.update( + let topBalanceTitleSize = self.topBalanceTitleView.update( transition: .immediate, component: AnyComponent(MultilineTextComponent( - text: .plain(balanceAttributedString), + text: .plain(NSAttributedString( + string: environment.strings.Stars_Intro_Balance, + font: Font.regular(14.0), + textColor: environment.theme.actionSheet.primaryTextColor + )), horizontalAlignment: .right, - maximumNumberOfLines: 0, - lineSpacing: 0.1 + maximumNumberOfLines: 1 )), environment: {}, containerSize: CGSize(width: 120.0, height: 100.0) ) - if let topBalanceView = self.topBalanceView.view { - if topBalanceView.superview == nil { - topBalanceView.alpha = 0.0 - self.addSubview(topBalanceView) + + let topBalanceValueSize = self.topBalanceValueView.update( + transition: .immediate, + component: AnyComponent(MultilineTextComponent( + text: .plain(NSAttributedString( + string: presentationStringsFormattedNumber(Int32(self.starsState?.balance ?? 0), environment.dateTimeFormat.decimalSeparator), + font: Font.semibold(14.0), + textColor: environment.theme.actionSheet.primaryTextColor + )), + horizontalAlignment: .right, + maximumNumberOfLines: 1 + )), + environment: {}, + containerSize: CGSize(width: 120.0, height: 100.0) + ) + let topBalanceIconSize = self.topBalanceIconView.update( + transition: .immediate, + component: AnyComponent(BundleIconComponent(name: "Premium/Stars/StarSmall", tintColor: nil)), + environment: {}, + containerSize: availableSize + ) + + let navigationHeight = environment.navigationHeight - environment.statusBarHeight + let topBalanceOriginY = environment.statusBarHeight + (navigationHeight - topBalanceTitleSize.height - topBalanceValueSize.height) / 2.0 + let topBalanceTitleFrame = CGRect(origin: CGPoint(x: availableSize.width - topBalanceTitleSize.width - 16.0, y: topBalanceOriginY), size: topBalanceTitleSize) + if let topBalanceTitleView = self.topBalanceTitleView.view { + if topBalanceTitleView.superview == nil { + topBalanceTitleView.alpha = 0.0 + self.addSubview(topBalanceTitleView) } - starTransition.setFrame(view: topBalanceView, frame: CGRect(origin: CGPoint(x: availableSize.width - topBalanceSize.width - 16.0, y: 56.0), size: topBalanceSize)) + starTransition.setFrame(view: topBalanceTitleView, frame: topBalanceTitleFrame) + } + + let topBalanceValueFrame = CGRect(origin: CGPoint(x: availableSize.width - topBalanceValueSize.width - 16.0, y: topBalanceTitleFrame.maxY), size: topBalanceValueSize) + if let topBalanceValueView = self.topBalanceValueView.view { + if topBalanceValueView.superview == nil { + topBalanceValueView.alpha = 0.0 + self.addSubview(topBalanceValueView) + } + starTransition.setFrame(view: topBalanceValueView, frame: topBalanceValueFrame) + } + + let topBalanceIconFrame = CGRect(origin: CGPoint(x: topBalanceValueFrame.minX - topBalanceIconSize.width - 2.0, y: floorToScreenPixels(topBalanceValueFrame.midY - topBalanceIconSize.height / 2.0) - UIScreenPixel), size: topBalanceIconSize) + if let topBalanceIconView = self.topBalanceIconView.view { + if topBalanceIconView.superview == nil { + topBalanceIconView.alpha = 0.0 + self.addSubview(topBalanceIconView) + } + starTransition.setFrame(view: topBalanceIconView, frame: topBalanceIconFrame) } contentHeight += 181.0 diff --git a/submodules/TelegramUI/Components/Stars/StarsTransferScreen/Sources/StarsTransferScreen.swift b/submodules/TelegramUI/Components/Stars/StarsTransferScreen/Sources/StarsTransferScreen.swift index abf0a3408d..186639df2d 100644 --- a/submodules/TelegramUI/Components/Stars/StarsTransferScreen/Sources/StarsTransferScreen.swift +++ b/submodules/TelegramUI/Components/Stars/StarsTransferScreen/Sources/StarsTransferScreen.swift @@ -262,11 +262,12 @@ private final class SheetContent: CombinedComponent { contentSize.height += 28.0 if state.cachedChevronImage == nil || state.cachedChevronImage?.1 !== theme { - state.cachedChevronImage = (generateTintedImage(image: UIImage(bundleImageName: "Premium/Stars/Star"), color: UIColor(rgb: 0xf09903))!, theme) + state.cachedChevronImage = (generateTintedImage(image: UIImage(bundleImageName: "Premium/Stars/StarLarge"), color: UIColor(rgb: 0xf09903))!, theme) } + let balanceValue = presentationStringsFormattedNumber(Int32(state.balance ?? 0), environment.dateTimeFormat.decimalSeparator) let balanceAttributedString = NSMutableAttributedString(string: strings.Stars_Transfer_Balance, font: Font.regular(14.0), textColor: textColor) - balanceAttributedString.append(NSMutableAttributedString(string: "\n # \(state.balance ?? 0)", font: Font.semibold(16.0), textColor: textColor)) + balanceAttributedString.append(NSMutableAttributedString(string: "\n # \(balanceValue)", font: Font.semibold(16.0), textColor: textColor)) if let range = balanceAttributedString.string.range(of: "#"), let chevronImage = state.cachedChevronImage?.0 { balanceAttributedString.addAttribute(.attachment, value: chevronImage, range: NSRange(range, in: balanceAttributedString.string)) balanceAttributedString.addAttribute(.foregroundColor, value: UIColor(rgb: 0xf09903), range: NSRange(range, in: balanceAttributedString.string)) @@ -336,7 +337,7 @@ private final class SheetContent: CombinedComponent { let resultController = UndoOverlayController( presentationData: presentationData, content: .image( - image: UIImage(bundleImageName: "Premium/Stars/Star")!, + image: UIImage(bundleImageName: "Premium/Stars/StarLarge")!, title: presentationData.strings.Stars_Transfer_PurchasedTitle, text: presentationData.strings.Stars_Transfer_PurchasedText(invoice.title, botTitle, presentationData.strings.Stars_Transfer_Purchased_Stars(Int32(invoice.totalAmount))).string, round: false, diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Stars/BalanceStar.imageset/Contents.json similarity index 71% rename from submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/Contents.json rename to submodules/TelegramUI/Images.xcassets/Premium/Stars/BalanceStar.imageset/Contents.json index d4ec011d84..ac82493b96 100644 --- a/submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stars/BalanceStar.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "transactionstar_20 (2).pdf", + "filename" : "balancestar_48 (2).pdf", "idiom" : "universal" } ], diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/balancestar_48 (2).pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stars/BalanceStar.imageset/balancestar_48 (2).pdf similarity index 100% rename from submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/balancestar_48 (2).pdf rename to submodules/TelegramUI/Images.xcassets/Premium/Stars/BalanceStar.imageset/balancestar_48 (2).pdf diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/transactionstar_20 (2).pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stars/Star.imageset/transactionstar_20 (2).pdf deleted file mode 100644 index aefce12699347477249d8e934a8715fc2576b1d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12891 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 bDE#Vg`F$h?yR{!6Fcc0W=jJ|pQT~4bqBtVv diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Contents.json index ac82493b96..653a52e723 100644 --- a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "balancestar_48 (2).pdf", + "filename" : "Star20.pdf", "idiom" : "universal" } ], diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Star20.pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarLarge.imageset/Star20.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad28ef79f1f5d23fee06bf5f786d737f2f9f918e GIT binary patch literal 17487 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/Contents.json new file mode 100644 index 0000000000..bea582e947 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "star_18.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/star_18.pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarMedium.imageset/star_18.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3f23ba8d2b9c713d6c45957b32b3618f50023133 GIT binary patch literal 17373 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/Contents.json new file mode 100644 index 0000000000..0c43076025 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "star_16 (2).pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/star_16 (2).pdf b/submodules/TelegramUI/Images.xcassets/Premium/Stars/StarSmall.imageset/star_16 (2).pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea68a6d3804f894074377066781fc363e122a0d7 GIT binary patch literal 15774 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Sources/CreateChannelController.swift b/submodules/TelegramUI/Sources/CreateChannelController.swift index 88091d0eb9..c5f11b6048 100644 --- a/submodules/TelegramUI/Sources/CreateChannelController.swift +++ b/submodules/TelegramUI/Sources/CreateChannelController.swift @@ -191,7 +191,7 @@ private enum CreateChannelEntry: ItemListNodeEntry { let arguments = arguments as! CreateChannelArguments switch self { case let .channelInfo(_, _, dateTimeFormat, peer, state, avatar): - return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer.flatMap(EnginePeer.init), presence: nil, memberCount: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer.flatMap(EnginePeer.init), presence: nil, memberCount: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, editingNameCompleted: { arguments.focusOnDescription() diff --git a/submodules/TelegramUI/Sources/CreateGroupController.swift b/submodules/TelegramUI/Sources/CreateGroupController.swift index a47f348bc9..d1108c444d 100644 --- a/submodules/TelegramUI/Sources/CreateGroupController.swift +++ b/submodules/TelegramUI/Sources/CreateGroupController.swift @@ -318,7 +318,7 @@ private enum CreateGroupEntry: ItemListNodeEntry { let arguments = arguments as! CreateGroupArguments switch self { case let .groupInfo(_, _, dateTimeFormat, peer, state, avatar): - return ItemListAvatarAndNameInfoItem(accountContext: arguments.context, presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer.flatMap(EnginePeer.init), presence: nil, memberCount: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in + return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, dateTimeFormat: dateTimeFormat, mode: .editSettings, peer: peer.flatMap(EnginePeer.init), presence: nil, memberCount: nil, state: state, sectionId: ItemListSectionId(self.section), style: .blocks(withTopInset: false, withExtendedBottomInset: false), editingNameUpdated: { editingName in arguments.updateEditingName(editingName) }, editingNameCompleted: { arguments.done()