From 3d22de75fc6d0962d6412f1f0af12132823fa191 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 02:14:16 +0400 Subject: [PATCH 1/8] Boost improvements --- .../Telegram-iOS/en.lproj/Localizable.strings | 3 + .../Sources/AccountContext.swift | 9 +- submodules/PremiumUI/BUILD | 1 + .../Sources/CreateGiveawayController.swift | 6 +- .../Sources/PremiumBoostScreen.swift | 3 +- .../Sources/PremiumGiftCodeScreen.swift | 384 +++++++++++++----- .../Sources/ReplaceBoostScreen.swift | 53 ++- .../Sources/ChannelStatsController.swift | 82 ++-- .../Sources/State/ChannelBoost.swift | 23 +- .../TelegramUI/Sources/OpenResolvedUrl.swift | 2 +- 10 files changed, 400 insertions(+), 166 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 84d31a91ec..745f4e8845 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10152,3 +10152,6 @@ Sorry for the inconvenience."; "Chat.ErrorQuoteOutdatedActionEdit" = "Edit"; "Premium.BoostByGiftDescription" = "Boost your channel by gifting your subscribers Telegram Premium. [Get boosts >]()"; + +"Stats.Boosts.ShowMoreBoosts_1" = "Show %@ More Boost"; +"Stats.Boosts.ShowMoreBoosts_any" = "Show %@ More Boosts"; diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index 550c56c2f0..f140b6eae9 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -1062,19 +1062,21 @@ public protocol AccountContext: AnyObject { public struct PremiumConfiguration { public static var defaultValue: PremiumConfiguration { - return PremiumConfiguration(isPremiumDisabled: false, showPremiumGiftInAttachMenu: false, showPremiumGiftInTextField: false, giveawayGiftsPurchaseAvailable: false) + return PremiumConfiguration(isPremiumDisabled: false, showPremiumGiftInAttachMenu: false, showPremiumGiftInTextField: false, giveawayGiftsPurchaseAvailable: false, boostsPerGiftCount: 3) } public let isPremiumDisabled: Bool public let showPremiumGiftInAttachMenu: Bool public let showPremiumGiftInTextField: Bool public let giveawayGiftsPurchaseAvailable: Bool + public let boostsPerGiftCount: Int32 - fileprivate init(isPremiumDisabled: Bool, showPremiumGiftInAttachMenu: Bool, showPremiumGiftInTextField: Bool, giveawayGiftsPurchaseAvailable: Bool) { + fileprivate init(isPremiumDisabled: Bool, showPremiumGiftInAttachMenu: Bool, showPremiumGiftInTextField: Bool, giveawayGiftsPurchaseAvailable: Bool, boostsPerGiftCount: Int32) { self.isPremiumDisabled = isPremiumDisabled self.showPremiumGiftInAttachMenu = showPremiumGiftInAttachMenu self.showPremiumGiftInTextField = showPremiumGiftInTextField self.giveawayGiftsPurchaseAvailable = giveawayGiftsPurchaseAvailable + self.boostsPerGiftCount = boostsPerGiftCount } public static func with(appConfiguration: AppConfiguration) -> PremiumConfiguration { @@ -1083,7 +1085,8 @@ public struct PremiumConfiguration { isPremiumDisabled: data["premium_purchase_blocked"] as? Bool ?? false, showPremiumGiftInAttachMenu: data["premium_gift_attach_menu_icon"] as? Bool ?? false, showPremiumGiftInTextField: data["premium_gift_text_field_icon"] as? Bool ?? false, - giveawayGiftsPurchaseAvailable: data["giveaway_gifts_purchase_available"] as? Bool ?? false + giveawayGiftsPurchaseAvailable: data["giveaway_gifts_purchase_available"] as? Bool ?? false, + boostsPerGiftCount: Int32(data["boosts_per_sent_gift"] as? Double ?? 3) ) } else { return .defaultValue diff --git a/submodules/PremiumUI/BUILD b/submodules/PremiumUI/BUILD index 0cf15d47b7..4f360fed21 100644 --- a/submodules/PremiumUI/BUILD +++ b/submodules/PremiumUI/BUILD @@ -108,6 +108,7 @@ swift_library( "//submodules/TelegramUI/Components/Utils/RoundedRectWithTailPath", "//submodules/CountrySelectionUI", "//submodules/TelegramUI/Components/Stories/PeerListItemComponent", + "//submodules/InvisibleInkDustNode", ], visibility = [ "//visibility:public", diff --git a/submodules/PremiumUI/Sources/CreateGiveawayController.swift b/submodules/PremiumUI/Sources/CreateGiveawayController.swift index 4be43057ca..fde0cc2f57 100644 --- a/submodules/PremiumUI/Sources/CreateGiveawayController.swift +++ b/submodules/PremiumUI/Sources/CreateGiveawayController.swift @@ -361,7 +361,7 @@ private enum CreateGiveawayEntry: ItemListNodeEntry { default: color = .blue } - return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, subtitle: subtitle, label: .boosts(prepaidGiveaway.quantity), sectionId: self.section, action: nil) + return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, titleBadge: "\(prepaidGiveaway.quantity * 4)", subtitle: subtitle, sectionId: self.section, action: nil) case let .subscriptionsHeader(_, text, additionalText): return ItemListSectionHeaderItem(presentationData: presentationData, text: text, accessoryText: ItemListSectionHeaderAccessoryText(value: additionalText, color: .generic), sectionId: self.section) case let .subscriptions(_, value): @@ -543,7 +543,7 @@ private func createGiveawayControllerEntries( if case .giveaway = state.mode { if case .generic = subject { - entries.append(.subscriptionsHeader(presentationData.theme, "QUANTITY OF PRIZES".uppercased(), "\(state.subscriptions) BOOSTS")) + entries.append(.subscriptionsHeader(presentationData.theme, "QUANTITY OF PRIZES".uppercased(), "\(state.subscriptions * 4) BOOSTS")) entries.append(.subscriptions(presentationData.theme, state.subscriptions)) entries.append(.subscriptionsInfo(presentationData.theme, "Choose how many Premium subscriptions to give away and boosts to receive.")) } @@ -553,7 +553,7 @@ private func createGiveawayControllerEntries( let channels = [peerId] + state.channels for channelId in channels { if let channel = peers[channelId] { - entries.append(.channel(index, presentationData.theme, channel, channel.id == peerId ? state.subscriptions : nil, false)) + entries.append(.channel(index, presentationData.theme, channel, channel.id == peerId ? state.subscriptions * 4 : nil, false)) } index += 1 } diff --git a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift index ac46b5f30a..7c553d8ab9 100644 --- a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift @@ -182,11 +182,12 @@ public func PremiumBoostScreen( } } else { if isPremium { + let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with({ $0 })) let controller = textAlertController( sharedContext: context.sharedContext, updatedPresentationData: nil, title: "More Boosts Needed", - text: "To boost **\(peer.compactDisplayTitle)**, get more boosts by gifting **Telegram Premium** to a friend.", + text: "To boost **\(peer.compactDisplayTitle)** again, gift **Telegram Premium** to a friend and get **\(premiumConfiguration.boostsPerGiftCount)** additional boosts.", actions: [ TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {}) ], diff --git a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift index ad2fb7f0a2..359dbbe29e 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift @@ -20,44 +20,48 @@ import AvatarNode import TextFormat import TelegramStringFormatting import UndoUI +import InvisibleInkDustNode private final class PremiumGiftCodeSheetContent: CombinedComponent { typealias EnvironmentType = ViewControllerComponentContainer.Environment let context: AccountContext - let giftCode: PremiumGiftCodeInfo + let subject: PremiumGiftCodeScreen.Subject let action: () -> Void let cancel: (Bool) -> Void let openPeer: (EnginePeer) -> Void let openMessage: (EngineMessage.Id) -> Void let copyLink: (String) -> Void let shareLink: (String) -> Void + let displayHiddenTooltip: () -> Void init( context: AccountContext, - giftCode: PremiumGiftCodeInfo, + subject: PremiumGiftCodeScreen.Subject, action: @escaping () -> Void, cancel: @escaping (Bool) -> Void, openPeer: @escaping (EnginePeer) -> Void, openMessage: @escaping (EngineMessage.Id) -> Void, copyLink: @escaping (String) -> Void, - shareLink: @escaping (String) -> Void + shareLink: @escaping (String) -> Void, + displayHiddenTooltip: @escaping () -> Void ) { self.context = context - self.giftCode = giftCode + self.subject = subject self.action = action self.cancel = cancel self.openPeer = openPeer self.openMessage = openMessage self.copyLink = copyLink self.shareLink = shareLink + self.displayHiddenTooltip = displayHiddenTooltip } static func ==(lhs: PremiumGiftCodeSheetContent, rhs: PremiumGiftCodeSheetContent) -> Bool { if lhs.context !== rhs.context { return false } - if lhs.giftCode != rhs.giftCode { + if lhs.subject != rhs.subject { return false } return true @@ -72,15 +76,23 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { var cachedCloseImage: (UIImage, PresentationTheme)? - init(context: AccountContext, giftCode: PremiumGiftCodeInfo) { + init(context: AccountContext, subject: PremiumGiftCodeScreen.Subject) { self.context = context super.init() var peerIds: [EnginePeer.Id] = [] - peerIds.append(giftCode.fromPeerId) - if let toPeerId = giftCode.toPeerId { - peerIds.append(toPeerId) + switch subject { + case let .giftCode(giftCode): + peerIds.append(giftCode.fromPeerId) + if let toPeerId = giftCode.toPeerId { + peerIds.append(toPeerId) + } + case let .boost(channelId, boost): + peerIds.append(channelId) + if let peerId = boost.peer?.id { + peerIds.append(peerId) + } } self.disposable = (context.engine.data.get( @@ -111,7 +123,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { } func makeState() -> State { - return State(context: self.context, giftCode: self.giftCode) + return State(context: self.context, subject: self.subject) } static var body: Body { @@ -133,7 +145,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { let accountContext = context.component.context let state = context.state - let giftCode = component.giftCode + let subject = component.subject let sideInset: CGFloat = 16.0 + environment.safeInsets.left let textSideInset: CGFloat = 32.0 + environment.safeInsets.left @@ -161,17 +173,60 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { let descriptionText: String let additionalText: String let buttonText: String - if let usedDate = giftCode.usedDate { - let dateString = stringForMediumDate(timestamp: usedDate, strings: strings, dateTimeFormat: dateTimeFormat) - titleText = "Used Gift Link" - descriptionText = "This link was used to activate a **Telegram Premium** subscription." - additionalText = "This link was used on \(dateString)." - buttonText = strings.Common_OK - } else { + + let link: String? + let date: Int32 + let fromPeer: EnginePeer? + var toPeerId: EnginePeer.Id? + let toPeer: EnginePeer? + let months: Int32 + + var gloss = false + switch subject { + case let .giftCode(giftCode): + gloss = !giftCode.isUsed + if let usedDate = giftCode.usedDate { + let dateString = stringForMediumDate(timestamp: usedDate, strings: strings, dateTimeFormat: dateTimeFormat) + titleText = "Used Gift Link" + descriptionText = "This link was used to activate a **Telegram Premium** subscription." + additionalText = "This link was used on \(dateString)." + buttonText = strings.Common_OK + } else { + titleText = "Gift Link" + descriptionText = "This link allows you to activate a **Telegram Premium** subscription." + additionalText = "You can also [send this link]() to a friend as a gift." + buttonText = "Use Link" + } + link = "https://t.me/giftcode/\(giftCode.slug)" + date = giftCode.date + fromPeer = state.peerMap[giftCode.fromPeerId] + toPeerId = giftCode.toPeerId + if let toPeerId = giftCode.toPeerId { + toPeer = state.peerMap[toPeerId] + } else { + toPeer = nil + } + months = giftCode.months + case let .boost(channelId, boost): titleText = "Gift Link" - descriptionText = "This link allows you to activate a **Telegram Premium** subscription." - additionalText = "You can also [send this link]() to a friend as a gift." - buttonText = "Use Link" + if let peer = boost.peer, !boost.flags.contains(.isUnclaimed) { + toPeer = boost.peer + descriptionText = "This link allows \(peer.compactDisplayTitle) to activate a **Telegram Premium** subscription." + } else { + toPeer = nil + descriptionText = "This link allows to activate a **Telegram Premium** subscription." + } + if boost.slug == nil { + additionalText = "This link hasn't been used yet." + } else { + additionalText = "" + } + buttonText = strings.Common_OK + link = nil + date = boost.date + toPeerId = boost.peer?.id + fromPeer = state.peerMap[channelId] + months = Int32(round(Float(boost.expires - boost.date) / (86400.0 * 30.0))) } let title = title.update( @@ -213,14 +268,17 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { transition: .immediate ) - let link = "https://t.me/giftcode/\(giftCode.slug)" let linkButton = linkButton.update( component: Button( content: AnyComponent( LinkButtonContentComponent(theme: environment.theme, text: link) ), action: { - component.copyLink(link) + if let link { + component.copyLink(link) + } else { + component.displayHiddenTooltip() + } } ), availableSize: CGSize(width: context.availableSize.width - sideInset * 2.0, height: 50.0), @@ -231,8 +289,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { let tableTextColor = theme.list.itemPrimaryTextColor let tableLinkColor = theme.list.itemAccentColor var tableItems: [TableComponent.Item] = [] - - let fromPeer = state.peerMap[giftCode.fromPeerId] + tableItems.append(.init( id: "from", title: "From", @@ -250,8 +307,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { ) ) )) - if let toPeerId = giftCode.toPeerId { - let toPeer = state.peerMap[toPeerId] + if let toPeer { tableItems.append(.init( id: "to", title: "To", @@ -259,8 +315,8 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { Button( content: AnyComponent(PeerCellComponent(context: context.component.context, textColor: tableLinkColor, peer: toPeer)), action: { - if let peer = toPeer, peer.id != accountContext.account.peerId { - component.openPeer(peer) + if toPeer.id != accountContext.account.peerId { + component.openPeer(toPeer) Queue.mainQueue().after(1.0, { component.cancel(false) }) @@ -269,7 +325,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { ) ) )) - } else if giftCode.isGiveaway { + } else if toPeerId == nil { tableItems.append(.init( id: "to", title: "To", @@ -278,12 +334,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { ) )) } - let giftTitle: String - if giftCode.months == 12 { - giftTitle = "Telegram Premium for 1 year" - } else { - giftTitle = "Telegram Premium for \(giftCode.months) months" - } + let giftTitle = "Telegram Premium for \(months) months" tableItems.append(.init( id: "gift", title: "Gift", @@ -292,35 +343,37 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { ) )) - let giftReason: String - if giftCode.toPeerId == nil { - giftReason = "Incomplete Giveaway" - } else { - giftReason = giftCode.isGiveaway ? "Giveaway" : "You were selected by the channel" - } - tableItems.append(.init( - id: "reason", - title: "Reason", - component: AnyComponent( - Button( - content: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: giftReason, font: tableFont, textColor: giftCode.messageId != nil ? tableLinkColor : tableTextColor)))), - isEnabled: true, - action: { - if let messageId = giftCode.messageId { - component.openMessage(messageId) + if case let .giftCode(giftCode) = component.subject { + let giftReason: String + if giftCode.toPeerId == nil { + giftReason = "Incomplete Giveaway" + } else { + giftReason = giftCode.isGiveaway ? "Giveaway" : "You were selected by the channel" + } + tableItems.append(.init( + id: "reason", + title: "Reason", + component: AnyComponent( + Button( + content: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: giftReason, font: tableFont, textColor: giftCode.messageId != nil ? tableLinkColor : tableTextColor)))), + isEnabled: true, + action: { + if let messageId = giftCode.messageId { + component.openMessage(messageId) + } + Queue.mainQueue().after(1.0) { + component.cancel(false) + } } - Queue.mainQueue().after(1.0) { - component.cancel(false) - } - } + ) ) - ) - )) + )) + } tableItems.append(.init( id: "date", title: "Date", component: AnyComponent( - MultilineTextComponent(text: .plain(NSAttributedString(string: stringForMediumDate(timestamp: giftCode.date, strings: strings, dateTimeFormat: dateTimeFormat), font: tableFont, textColor: tableTextColor))) + MultilineTextComponent(text: .plain(NSAttributedString(string: stringForMediumDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat), font: tableFont, textColor: tableTextColor))) ) )) @@ -348,7 +401,9 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { } }, tapAction: { attributes, _ in - component.shareLink("https://t.me/giftcode/\(giftCode.slug)") + if let link { + component.shareLink(link) + } } ), availableSize: CGSize(width: context.availableSize.width - textSideInset * 2.0, height: context.availableSize.height), @@ -363,15 +418,15 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { fontSize: 17.0, height: 50.0, cornerRadius: 10.0, - gloss: !giftCode.isUsed, + gloss: gloss, iconName: nil, animationName: nil, iconPosition: .left, action: { - if giftCode.isUsed { - component.cancel(true) - } else { + if gloss { component.action() + } else { + component.cancel(true) } } ), @@ -430,36 +485,39 @@ private final class PremiumGiftCodeSheetComponent: CombinedComponent { typealias EnvironmentType = ViewControllerComponentContainer.Environment let context: AccountContext - let giftCode: PremiumGiftCodeInfo + let subject: PremiumGiftCodeScreen.Subject let action: () -> Void let openPeer: (EnginePeer) -> Void let openMessage: (EngineMessage.Id) -> Void let copyLink: (String) -> Void let shareLink: (String) -> Void + let displayHiddenTooltip: () -> Void init( context: AccountContext, - giftCode: PremiumGiftCodeInfo, + subject: PremiumGiftCodeScreen.Subject, action: @escaping () -> Void, openPeer: @escaping (EnginePeer) -> Void, openMessage: @escaping (EngineMessage.Id) -> Void, copyLink: @escaping (String) -> Void, - shareLink: @escaping (String) -> Void + shareLink: @escaping (String) -> Void, + displayHiddenTooltip: @escaping () -> Void ) { self.context = context - self.giftCode = giftCode + self.subject = subject self.action = action self.openPeer = openPeer self.openMessage = openMessage self.copyLink = copyLink self.shareLink = shareLink + self.displayHiddenTooltip = displayHiddenTooltip } static func ==(lhs: PremiumGiftCodeSheetComponent, rhs: PremiumGiftCodeSheetComponent) -> Bool { if lhs.context !== rhs.context { return false } - if lhs.giftCode != rhs.giftCode { + if lhs.subject != rhs.subject { return false } return true @@ -477,7 +535,7 @@ private final class PremiumGiftCodeSheetComponent: CombinedComponent { component: SheetComponent( content: AnyComponent(PremiumGiftCodeSheetContent( context: context.component.context, - giftCode: context.component.giftCode, + subject: context.component.subject, action: context.component.action, cancel: { animate in if animate { @@ -493,7 +551,8 @@ private final class PremiumGiftCodeSheetComponent: CombinedComponent { openPeer: context.component.openPeer, openMessage: context.component.openMessage, copyLink: context.component.copyLink, - shareLink: context.component.shareLink + shareLink: context.component.shareLink, + displayHiddenTooltip: context.component.displayHiddenTooltip )), backgroundColor: .color(environment.theme.actionSheet.opaqueItemBackgroundColor), animateOut: animateOut @@ -534,6 +593,11 @@ private final class PremiumGiftCodeSheetComponent: CombinedComponent { } public class PremiumGiftCodeScreen: ViewControllerComponentContainer { + public enum Subject: Equatable { + case giftCode(PremiumGiftCodeInfo) + case boost(EnginePeer.Id, ChannelBoostersContext.State.Boost) + } + private let context: AccountContext public var disposed: () -> Void = {} @@ -541,7 +605,7 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { public init( context: AccountContext, - giftCode: PremiumGiftCodeInfo, + subject: PremiumGiftCodeScreen.Subject, forceDark: Bool = false, action: @escaping () -> Void, openPeer: @escaping (EnginePeer) -> Void = { _ in }, @@ -551,9 +615,27 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { self.context = context var copyLinkImpl: ((String) -> Void)? - super.init(context: context, component: PremiumGiftCodeSheetComponent(context: context, giftCode: giftCode, action: action, openPeer: openPeer, openMessage: openMessage, copyLink: { link in - copyLinkImpl?(link) - }, shareLink: shareLink), navigationBarAppearance: .none, statusBarStyle: .ignore, theme: forceDark ? .dark : .default) + var displayHiddenTooltipImpl: (() -> Void)? + super.init( + context: context, + component: PremiumGiftCodeSheetComponent( + context: context, + subject: subject, + action: action, + openPeer: openPeer, + openMessage: openMessage, + copyLink: { link in + copyLinkImpl?(link) + }, + shareLink: shareLink, + displayHiddenTooltip: { + displayHiddenTooltipImpl?() + } + ), + navigationBarAppearance: .none, + statusBarStyle: .ignore, + theme: forceDark ? .dark : .default + ) self.navigationPresentation = .flatModal @@ -563,9 +645,21 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { guard let self else { return } + self.dismissAllTooltips() + let presentationData = context.sharedContext.currentPresentationData.with { $0 } self.present(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.Conversation_LinkCopied), elevatedLayout: false, position: .top, action: { _ in return true }), in: .window(.root)) } + + displayHiddenTooltipImpl = { [weak self] in + guard let self else { + return + } + self.dismissAllTooltips() + + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "Only the recipient can see the code.", timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { _ in return true }), in: .window(.root)) + } } required public init(coder aDecoder: NSCoder) { @@ -581,15 +675,34 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { self.view.disablesInteractiveModalDismiss = true } + + public override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.dismissAllTooltips() + } + + fileprivate func dismissAllTooltips() { + self.window?.forEachController({ controller in + if let controller = controller as? UndoOverlayController { + controller.dismiss() + } + }) + self.forEachController({ controller in + if let controller = controller as? UndoOverlayController { + controller.dismiss() + } + return true + }) + } } private final class LinkButtonContentComponent: CombinedComponent { let theme: PresentationTheme - let text: String + let text: String? public init( theme: PresentationTheme, - text: String + text: String? ) { self.theme = theme self.text = text @@ -609,6 +722,7 @@ private final class LinkButtonContentComponent: CombinedComponent { let background = Child(RoundedRectangle.self) let text = Child(MultilineTextComponent.self) let icon = Child(BundleIconComponent.self) + let dust = Child(DustComponent.self) return { context in let component = context.component @@ -621,36 +735,48 @@ private final class LinkButtonContentComponent: CombinedComponent { transition: context.transition ) - let text = text.update( - component: MultilineTextComponent( - text: .plain(NSAttributedString( - string: component.text.replacingOccurrences(of: "https://", with: ""), - font: Font.regular(17.0), - textColor: component.theme.list.itemPrimaryTextColor, - paragraphAlignment: .natural - )), - horizontalAlignment: .center, - maximumNumberOfLines: 1 - ), - availableSize: CGSize(width: context.availableSize.width - sideInset - sideInset, height: CGFloat.greatestFiniteMagnitude), - transition: .immediate - ) - - let icon = icon.update( - component: BundleIconComponent(name: "Chat/Context Menu/Copy", tintColor: component.theme.list.itemAccentColor), - availableSize: context.availableSize, - transition: context.transition - ) - context.add(background .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) ) - context.add(text - .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) - ) - context.add(icon - .position(CGPoint(x: context.availableSize.width - icon.size.width / 2.0 - 14.0, y: context.availableSize.height / 2.0)) - ) + + if let _ = component.text { + let text = text.update( + component: MultilineTextComponent( + text: .plain(NSAttributedString( + string: (component.text ?? "").replacingOccurrences(of: "https://", with: ""), + font: Font.regular(17.0), + textColor: component.theme.list.itemPrimaryTextColor, + paragraphAlignment: .natural + )), + horizontalAlignment: .center, + maximumNumberOfLines: 1 + ), + availableSize: CGSize(width: context.availableSize.width - sideInset - sideInset, height: CGFloat.greatestFiniteMagnitude), + transition: .immediate + ) + + let icon = icon.update( + component: BundleIconComponent(name: "Chat/Context Menu/Copy", tintColor: component.theme.list.itemAccentColor), + availableSize: context.availableSize, + transition: context.transition + ) + context.add(icon + .position(CGPoint(x: context.availableSize.width - icon.size.width / 2.0 - 14.0, y: context.availableSize.height / 2.0)) + ) + context.add(text + .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) + ) + } else { + let dust = dust.update( + component: DustComponent(color: component.theme.list.itemSecondaryTextColor), + availableSize: CGSize(width: context.availableSize.width * 0.8, height: context.availableSize.height * 0.54), + transition: context.transition + ) + context.add(dust + .position(CGPoint(x: context.availableSize.width / 2.0, y: context.availableSize.height / 2.0)) + ) + } + return context.availableSize } } @@ -955,3 +1081,53 @@ private final class PeerCellComponent: Component { return view.update(component: self, availableSize: availableSize, state: state, environment: environment, transition: transition) } } + +private final class DustComponent: Component { + let color: UIColor + + init(color: UIColor) { + self.color = color + } + + static func ==(lhs: DustComponent, rhs: DustComponent) -> Bool { + if lhs.color != rhs.color { + return false + } + return true + } + + final class View: UIView { + private let dustView = InvisibleInkDustView(textNode: nil, enableAnimations: true) + + private var component: DustComponent? + private weak var state: EmptyComponentState? + + override init(frame: CGRect) { + super.init(frame: frame) + + self.addSubview(self.dustView) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func update(component: DustComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: Transition) -> CGSize { + self.component = component + self.state = state + + let rects: [CGRect] = [CGRect(origin: .zero, size: availableSize).insetBy(dx: 5.0, dy: 5.0)] + self.dustView.update(size: availableSize, color: component.color, textColor: component.color, rects: rects, wordRects: rects) + + return availableSize + } + } + + func makeView() -> View { + return View(frame: CGRect()) + } + + func update(view: View, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: Transition) -> CGSize { + return view.update(component: self, availableSize: availableSize, state: state, environment: environment, transition: transition) + } +} diff --git a/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift b/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift index 568c184d45..4091d712b8 100644 --- a/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift +++ b/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift @@ -104,7 +104,6 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { } static var body: Body { -// let closeButton = Child(Button.self) let header = Child(ReplaceBoostHeaderComponent.self) let description = Child(MultilineTextComponent.self) let boostsBackground = Child(RoundedRectangle.self) @@ -117,7 +116,6 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { let theme = environment.theme let strings = environment.strings -// let topInset: CGFloat = environment.navigationHeight + 22.0 let textSideInset: CGFloat = 32.0 let sideInset: CGFloat = 16.0 + environment.safeInsets.left @@ -168,8 +166,13 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { return (TelegramTextAttributes.URL, contents) }) - let channelName = state.peer?.compactDisplayTitle ?? "" - let descriptionString = "To boost **\(channelName)**, reassign a previous boost or gift **Telegram Premium** to a friend to get **3** additional boosts." + let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.component.context.currentAppConfiguration.with({ $0 })) + + var channelName = state.peer?.compactDisplayTitle ?? "" + if channelName.count > 48 { + channelName = "\(channelName.prefix(48))..." + } + let descriptionString = "To boost **\(channelName)**, reassign a previous boost or gift **Telegram Premium** to a friend to get **\(premiumConfiguration.boostsPerGiftCount)** additional boosts." let description = description.update( component: MultilineTextComponent( @@ -254,7 +257,7 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { let boosts = boosts.update( component: List(boostItems), environment: {}, - availableSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 1000.0), + availableSize: CGSize(width: availableSize.width - sideInset * 2.0, height: 100000.0), transition: context.transition ) @@ -272,9 +275,7 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { .position(CGPoint(x: availableSize.width / 2.0, y: 226 + boosts.size.height / 2.0)) ) - let contentSize = CGSize(width: availableSize.width, height: 226.0 + boosts.size.height) - - return contentSize + return CGSize(width: availableSize.width, height: 226.0 + boosts.size.height + environment.safeInsets.bottom + 91.0) } } } @@ -293,6 +294,8 @@ public class ReplaceBoostScreen: ViewController { let hostView: ComponentHostView private let footerView: FooterView + private var footerHeight: CGFloat = 0.0 + private var bottomOffset: CGFloat = 1000.0 private(set) var isExpanded = false private var panGestureRecognizer: UIPanGestureRecognizer? @@ -350,6 +353,7 @@ public class ReplaceBoostScreen: ViewController { } self.controller?.replaceBoosts?(self.selectedSlots) } + self.footerView.updateBackgroundAlpha(1.0, transition: .immediate) } override func didLoad() { @@ -382,9 +386,22 @@ public class ReplaceBoostScreen: ViewController { return true } + private func updateFooterAlpha() { + guard let (layout, _) = self.currentLayout else { + return + } + let contentFrame = self.scrollView.convert(self.hostView.frame, to: self.view) + let bottomOffset = contentFrame.maxY - layout.size.height + + let backgroundAlpha: CGFloat = min(30.0, max(0.0, bottomOffset)) / 30.0 + self.footerView.updateBackgroundAlpha(backgroundAlpha, transition: .immediate) + } + func scrollViewDidScroll(_ scrollView: UIScrollView) { let contentOffset = self.scrollView.contentOffset.y self.controller?.navigationBar?.updateBackgroundAlpha(min(30.0, contentOffset) / 30.0, transition: .immediate) + + self.updateFooterAlpha() } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { @@ -429,6 +446,7 @@ public class ReplaceBoostScreen: ViewController { } func containerLayoutUpdated(layout: ContainerViewLayout, navigationHeight: CGFloat, transition: Transition) { + let hadLayout = self.currentLayout != nil self.currentLayout = (layout, navigationHeight) if let controller = self.controller, let navigationBar = controller.navigationBar, navigationBar.view.superview !== self.wrappingView { @@ -541,9 +559,11 @@ public class ReplaceBoostScreen: ViewController { let footerInsets = UIEdgeInsets(top: 0.0, left: layout.safeInsets.left, bottom: layout.intrinsicInsets.bottom, right: layout.safeInsets.right) transition.setFrame(view: self.footerView, frame: CGRect(origin: CGPoint(x: 0.0, y: -topInset), size: layout.size)) - let _ = self.footerView.update(size: layout.size, insets: footerInsets, theme: self.presentationData.theme, count: Int32(self.selectedSlots.count)) + self.footerHeight = self.footerView.update(size: layout.size, insets: footerInsets, theme: self.presentationData.theme, count: Int32(self.selectedSlots.count)) - self.footerView.updateBackgroundAlpha(0.0, transition: .immediate) + if !hadLayout { + self.updateFooterAlpha() + } } private var didPlayAppearAnimation = false @@ -574,7 +594,7 @@ public class ReplaceBoostScreen: ViewController { factor = 0.15 } if self.scrollView.contentSize.height > 0.0 && self.scrollView.contentSize.height < layout.size.height / 2.0 { - return layout.size.height - self.scrollView.contentSize.height - layout.intrinsicInsets.bottom - 154.0 + return layout.size.height - self.scrollView.contentSize.height - layout.intrinsicInsets.bottom - 30.0 } else { return floor(max(layout.size.width, layout.size.height) * factor) } @@ -673,6 +693,8 @@ public class ReplaceBoostScreen: ViewController { self.bounds = bounds self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: .immediate) + + self.updateFooterAlpha() case .ended: guard let (currentTopInset, panOffset, scrollView, listNode) = self.panGestureArguments else { return @@ -760,10 +782,14 @@ public class ReplaceBoostScreen: ViewController { self.bounds = bounds self.layer.animateBounds(from: previousBounds, to: self.bounds, duration: 0.3, timingFunction: CAMediaTimingFunctionName.easeInEaseOut.rawValue) } + + self.updateFooterAlpha() case .cancelled: self.panGestureArguments = nil self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: Transition(.animated(duration: 0.3, curve: .easeInOut))) + + self.updateFooterAlpha() default: break } @@ -890,6 +916,11 @@ public class ReplaceBoostScreen: ViewController { self.node.updateIsVisible(isVisible: true) } + override open func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.dismissAllTooltips() + } + override open func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) diff --git a/submodules/StatisticsUI/Sources/ChannelStatsController.swift b/submodules/StatisticsUI/Sources/ChannelStatsController.swift index 5c46b22f65..22e1f4084a 100644 --- a/submodules/StatisticsUI/Sources/ChannelStatsController.swift +++ b/submodules/StatisticsUI/Sources/ChannelStatsController.swift @@ -22,7 +22,7 @@ import ShareController import ItemListPeerActionItem import PremiumUI -private let maxUsersDisplayedLimit: Int32 = 50 +private let maxUsersDisplayedLimit: Int32 = 5 private final class ChannelStatsControllerArguments { let context: AccountContext @@ -31,20 +31,20 @@ private final class ChannelStatsControllerArguments { let contextAction: (MessageId, ASDisplayNode, ContextGesture?) -> Void let copyBoostLink: (String) -> Void let shareBoostLink: (String) -> Void - let openPeer: (EnginePeer) -> Void + let openBoost: (ChannelBoostersContext.State.Boost) -> Void let expandBoosters: () -> Void let openGifts: () -> Void let createPrepaidGiveaway: (PrepaidGiveaway) -> Void let updateGiftsSelected: (Bool) -> Void - init(context: AccountContext, loadDetailedGraph: @escaping (StatsGraph, Int64) -> Signal, openMessage: @escaping (MessageId) -> Void, contextAction: @escaping (MessageId, ASDisplayNode, ContextGesture?) -> Void, copyBoostLink: @escaping (String) -> Void, shareBoostLink: @escaping (String) -> Void, openPeer: @escaping (EnginePeer) -> Void, expandBoosters: @escaping () -> Void, openGifts: @escaping () -> Void, createPrepaidGiveaway: @escaping (PrepaidGiveaway) -> Void, updateGiftsSelected: @escaping (Bool) -> Void) { + init(context: AccountContext, loadDetailedGraph: @escaping (StatsGraph, Int64) -> Signal, openMessage: @escaping (MessageId) -> Void, contextAction: @escaping (MessageId, ASDisplayNode, ContextGesture?) -> Void, copyBoostLink: @escaping (String) -> Void, shareBoostLink: @escaping (String) -> Void, openBoost: @escaping (ChannelBoostersContext.State.Boost) -> Void, expandBoosters: @escaping () -> Void, openGifts: @escaping () -> Void, createPrepaidGiveaway: @escaping (PrepaidGiveaway) -> Void, updateGiftsSelected: @escaping (Bool) -> Void) { self.context = context self.loadDetailedGraph = loadDetailedGraph self.openMessageStats = openMessage self.contextAction = contextAction self.copyBoostLink = copyBoostLink self.shareBoostLink = shareBoostLink - self.openPeer = openPeer + self.openBoost = openBoost self.expandBoosters = expandBoosters self.openGifts = openGifts self.createPrepaidGiveaway = createPrepaidGiveaway @@ -118,7 +118,7 @@ private enum StatsEntry: ItemListNodeEntry { case boostersTitle(PresentationTheme, String) case boostersPlaceholder(PresentationTheme, String) case boosterTabs(PresentationTheme, String, String, Bool) - case booster(Int32, PresentationTheme, PresentationDateTimeFormat, EnginePeer?, Int32, ChannelBoostersContext.State.Boost.Flags, Int32, Int32) + case booster(Int32, PresentationTheme, PresentationDateTimeFormat, ChannelBoostersContext.State.Boost) case boostersExpand(PresentationTheme, String) case boostersInfo(PresentationTheme, String) @@ -232,7 +232,7 @@ private enum StatsEntry: ItemListNodeEntry { return 2102 case .boosterTabs: return 2103 - case let .booster(index, _, _, _, _, _, _, _): + case let .booster(index, _, _, _): return 2104 + index case .boostersExpand: return 10000 @@ -439,8 +439,8 @@ private enum StatsEntry: ItemListNodeEntry { } else { return false } - case let .booster(lhsIndex, lhsTheme, lhsDateTimeFormat, lhsPeer, lhsCount, lhsFlags, lhsDate, lhsExpires): - if case let .booster(rhsIndex, rhsTheme, rhsDateTimeFormat, rhsPeer, rhsCount, rhsFlags, rhsDate, rhsExpires) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, lhsPeer == rhsPeer, lhsCount == rhsCount, lhsFlags == rhsFlags, lhsDate == rhsDate, lhsExpires == rhsExpires { + case let .booster(lhsIndex, lhsTheme, lhsDateTimeFormat, lhsBoost): + if case let .booster(rhsIndex, rhsTheme, rhsDateTimeFormat, rhsBoost) = rhs, lhsIndex == rhsIndex, lhsTheme === rhsTheme, lhsDateTimeFormat == rhsDateTimeFormat, lhsBoost == rhsBoost { return true } else { return false @@ -548,38 +548,49 @@ private enum StatsEntry: ItemListNodeEntry { return BoostsTabsItem(theme: presentationData.theme, boostsText: boostText, giftsText: giftText, selectedTab: giftSelected ? .gifts : .boosts, sectionId: self.section, selectionUpdated: { tab in arguments.updateGiftsSelected(tab == .gifts) }) - case let .booster(_, _, _, peer, count, flags, date, expires): - let expiresValue = stringForDate(timestamp: expires, strings: presentationData.strings) + case let .booster(_, _, _, boost): + let count = boost.multiplier + let expiresValue = stringForDate(timestamp: boost.expires, strings: presentationData.strings) let expiresString: String - let durationMonths = Int32(round(Float(expires - date) / (86400.0 * 30.0))) + let durationMonths = Int32(round(Float(boost.expires - boost.date) / (86400.0 * 30.0))) let durationString = "\(durationMonths)m" let title: String let icon: GiftOptionItem.Icon var label: String? - if flags.contains(.isGiveaway) { + if boost.flags.contains(.isGiveaway) { label = "🏆 Giveaway" - } else if flags.contains(.isGift) { + } else if boost.flags.contains(.isGift) { label = "🎁 Gift" } - if let peer { + + let color: GiftOptionItem.Icon.Color + if durationMonths > 11 { + color = .red + } else if durationMonths > 5 { + color = .blue + } else { + color = .green + } + + if boost.flags.contains(.isUnclaimed) { + title = "Unclaimed" + icon = .image(color: color, name: "Premium/Unclaimed") + expiresString = "\(durationString) • \(expiresValue)" + } else if let peer = boost.peer { title = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder) icon = .peer(peer) - expiresString = presentationData.strings.Stats_Boosts_ExpiresOn(expiresValue).string - } else { - let color: GiftOptionItem.Icon.Color - if durationMonths > 11 { - color = .red - } else if durationMonths > 5 { - color = .blue + if let _ = label { + expiresString = expiresValue } else { - color = .green + expiresString = presentationData.strings.Stats_Boosts_ExpiresOn(expiresValue).string } - if flags.contains(.isUnclaimed) { + } else { + if boost.flags.contains(.isUnclaimed) { title = "Unclaimed" icon = .image(color: color, name: "Premium/Unclaimed") - } else if flags.contains(.isGiveaway) { + } else if boost.flags.contains(.isGiveaway) { title = "To be distributed" icon = .image(color: color, name: "Premium/ToBeDistributed") } else { @@ -588,9 +599,9 @@ private enum StatsEntry: ItemListNodeEntry { } expiresString = "\(durationString) • \(expiresValue)" } - return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: icon, title: title, titleFont: .bold, titleBadge: count > 1 ? "\(count)" : nil, subtitle: expiresString, label: label.flatMap { .semitransparent($0) }, sectionId: self.section, action: peer != nil && peer?.id != arguments.context.account.peerId ? { - arguments.openPeer(peer!) - } : nil) + return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: icon, title: title, titleFont: .bold, titleBadge: count > 1 ? "\(count)" : nil, subtitle: expiresString, label: label.flatMap { .semitransparent($0) }, sectionId: self.section, action: { + arguments.openBoost(boost) + }) case let .boostersExpand(theme, title): return ItemListPeerActionItem(presentationData: presentationData, icon: PresentationResourcesItemList.downArrowImage(theme), title: title, sectionId: self.section, editing: false, action: { arguments.expandBoosters() @@ -626,7 +637,7 @@ private enum StatsEntry: ItemListNodeEntry { default: color = .blue } - return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, titleBadge: "\(prepaidGiveaway.quantity)", subtitle: subtitle, label: nil, sectionId: self.section, action: { + return GiftOptionItem(presentationData: presentationData, context: arguments.context, icon: .image(color: color, name: "Premium/Giveaway"), title: title, titleFont: .bold, titleBadge: "\(prepaidGiveaway.quantity * 4)", subtitle: subtitle, label: nil, sectionId: self.section, action: { arguments.createPrepaidGiveaway(prepaidGiveaway) }) } @@ -824,12 +835,12 @@ private func channelStatsControllerEntries(state: ChannelStatsControllerState, p } for booster in boosters { - entries.append(.booster(boosterIndex, presentationData.theme, presentationData.dateTimeFormat, booster.peer, booster.multiplier, booster.flags, booster.date, booster.expires)) + entries.append(.booster(boosterIndex, presentationData.theme, presentationData.dateTimeFormat, booster)) boosterIndex += 1 } if !effectiveExpanded { - entries.append(.boostersExpand(presentationData.theme, presentationData.strings.PeopleNearby_ShowMorePeople(Int32(selectedState.count) - maxUsersDisplayedLimit))) + entries.append(.boostersExpand(presentationData.theme, presentationData.strings.Stats_Boosts_ShowMoreBoosts(Int32(selectedState.count) - maxUsersDisplayedLimit))) } } @@ -899,7 +910,6 @@ public func channelStatsController(context: AccountContext, updatedPresentationD var presentImpl: ((ViewController) -> Void)? var pushImpl: ((ViewController) -> Void)? - var navigateToProfileImpl: ((EnginePeer) -> Void)? let arguments = ChannelStatsControllerArguments(context: context, loadDetailedGraph: { graph, x -> Signal in return statsContext.loadDetailedGraph(graph, x: x) @@ -954,8 +964,9 @@ public func channelStatsController(context: AccountContext, updatedPresentationD } presentImpl?(shareController) }, - openPeer: { peer in - navigateToProfileImpl?(peer) + openBoost: { boost in + let controller = PremiumGiftCodeScreen(context: context, subject: .boost(peerId, boost), action: {}) + pushImpl?(controller) }, expandBoosters: { updateState { $0.withUpdatedBoostersExpanded(true) } @@ -1087,11 +1098,6 @@ public func channelStatsController(context: AccountContext, updatedPresentationD pushImpl = { [weak controller] c in controller?.push(c) } - navigateToProfileImpl = { [weak controller] peer in - if let navigationController = controller?.navigationController as? NavigationController, let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: nil, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: peer.largeProfileImage != nil, fromChat: false, requestsContext: nil) { - navigationController.pushViewController(controller) - } - } return controller } diff --git a/submodules/TelegramCore/Sources/State/ChannelBoost.swift b/submodules/TelegramCore/Sources/State/ChannelBoost.swift index 3a6295d86f..d8f029873a 100644 --- a/submodules/TelegramCore/Sources/State/ChannelBoost.swift +++ b/submodules/TelegramCore/Sources/State/ChannelBoost.swift @@ -10,6 +10,14 @@ public struct MyBoostStatus: Equatable { public let date: Int32 public let expires: Int32 public let cooldownUntil: Int32? + + public init(slot: Int32, peer: EnginePeer?, date: Int32, expires: Int32, cooldownUntil: Int32?) { + self.slot = slot + self.peer = peer + self.date = date + self.expires = expires + self.cooldownUntil = cooldownUntil + } } public let boosts: [Boost] @@ -175,7 +183,7 @@ private final class ChannelBoostersContextImpl { var result: [ChannelBoostersContext.State.Boost] = [] for boost in cachedResult.boosts { let peer = boost.peerId.flatMap { transaction.getPeer($0) } - result.append(ChannelBoostersContext.State.Boost(flags: ChannelBoostersContext.State.Boost.Flags(rawValue: boost.flags), id: boost.id, peer: peer.flatMap { EnginePeer($0) }, date: boost.date, expires: boost.expires, multiplier: boost.multiplier)) + result.append(ChannelBoostersContext.State.Boost(flags: ChannelBoostersContext.State.Boost.Flags(rawValue: boost.flags), id: boost.id, peer: peer.flatMap { EnginePeer($0) }, date: boost.date, expires: boost.expires, multiplier: boost.multiplier, slug: boost.slug)) } return (result, cachedResult.count, true) } else { @@ -256,7 +264,6 @@ private final class ChannelBoostersContextImpl { switch boost { case let .boost(flags, id, userId, giveawayMessageId, date, expires, usedGiftSlug, multiplier): let _ = giveawayMessageId - let _ = usedGiftSlug var boostFlags: ChannelBoostersContext.State.Boost.Flags = [] var boostPeer: EnginePeer? if let userId = userId { @@ -274,7 +281,7 @@ private final class ChannelBoostersContextImpl { if (flags & (1 << 3)) != 0 { boostFlags.insert(.isUnclaimed) } - resultBoosts.append(ChannelBoostersContext.State.Boost(flags: boostFlags, id: id, peer: boostPeer, date: date, expires: expires, multiplier: multiplier ?? 1)) + resultBoosts.append(ChannelBoostersContext.State.Boost(flags: boostFlags, id: id, peer: boostPeer, date: date, expires: expires, multiplier: multiplier ?? 1, slug: usedGiftSlug)) } } if populateCache { @@ -357,6 +364,7 @@ public final class ChannelBoostersContext { public var date: Int32 public var expires: Int32 public var multiplier: Int32 + public var slug: String? } public var boosts: [Boost] public var isLoadingMore: Bool @@ -418,6 +426,7 @@ private final class CachedChannelBoosters: Codable { case date case expires case multiplier + case slug } var flags: Int32 @@ -426,14 +435,16 @@ private final class CachedChannelBoosters: Codable { var date: Int32 var expires: Int32 var multiplier: Int32 + var slug: String? - init(flags: Int32, id: String, peerId: EnginePeer.Id?, date: Int32, expires: Int32, multiplier: Int32) { + init(flags: Int32, id: String, peerId: EnginePeer.Id?, date: Int32, expires: Int32, multiplier: Int32, slug: String?) { self.flags = flags self.id = id self.peerId = peerId self.date = date self.expires = expires self.multiplier = multiplier + self.slug = slug } init(from decoder: Decoder) throws { @@ -445,6 +456,7 @@ private final class CachedChannelBoosters: Codable { self.date = try container.decode(Int32.self, forKey: .date) self.expires = try container.decode(Int32.self, forKey: .expires) self.multiplier = try container.decode(Int32.self, forKey: .multiplier) + self.slug = try container.decodeIfPresent(String.self, forKey: .slug) } func encode(to encoder: Encoder) throws { @@ -456,6 +468,7 @@ private final class CachedChannelBoosters: Codable { try container.encode(self.date, forKey: .date) try container.encode(self.expires, forKey: .expires) try container.encode(self.multiplier, forKey: .multiplier) + try container.encodeIfPresent(self.slug, forKey: .slug) } } @@ -469,7 +482,7 @@ private final class CachedChannelBoosters: Codable { } init(boosts: [ChannelBoostersContext.State.Boost], count: Int32) { - self.boosts = boosts.map { CachedBoost(flags: $0.flags.rawValue, id: $0.id, peerId: $0.peer?.id, date: $0.date, expires: $0.expires, multiplier: $0.multiplier) } + self.boosts = boosts.map { CachedBoost(flags: $0.flags.rawValue, id: $0.id, peerId: $0.peer?.id, date: $0.date, expires: $0.expires, multiplier: $0.multiplier, slug: $0.slug) } self.count = count } diff --git a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift index e9f59997e2..f87ae12873 100644 --- a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift @@ -896,7 +896,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur var dismissImpl: (() -> Void)? let controller = PremiumGiftCodeScreen( context: context, - giftCode: giftCode, + subject: .giftCode(giftCode), forceDark: forceDark, action: { dismissImpl?() From 983e7204538cd63db57c7356bc31b55df22fa925 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 02:36:57 +0400 Subject: [PATCH 2/8] Cleanup --- Telegram/BUILD | 3 - .../PremiumCoffee@2x.png | Bin 26417 -> 0 bytes .../PremiumCoffee@3x.png | Bin 49188 -> 0 bytes .../PremiumDuck.alticon/PremiumDuck@2x.png | Bin 19872 -> 0 bytes .../PremiumDuck.alticon/PremiumDuck@3x.png | Bin 32968 -> 0 bytes .../PremiumSteam.alticon/PremiumSteam@2x.png | Bin 27906 -> 0 bytes .../PremiumSteam.alticon/PremiumSteam@3x.png | Bin 45528 -> 0 bytes .../Telegram-iOS/en.lproj/Localizable.strings | 4 - .../Sources/AppIconsDemoComponent.swift | 145 ++++++------------ .../Sources/PremiumIntroScreen.swift | 7 +- .../Themes/ThemeSettingsAppIconItem.swift | 6 - .../Premium/Icons/Coffee.imageset/Coffee.png | Bin 93810 -> 0 bytes .../Icons/Coffee.imageset/Contents.json | 21 --- .../Premium/Icons/Duck.imageset/Contents.json | 21 --- .../Premium/Icons/Duck.imageset/Duck.png | Bin 49117 -> 0 bytes .../Icons/Steam.imageset/Contents.json | 21 --- .../Premium/Icons/Steam.imageset/Steam.png | Bin 73476 -> 0 bytes .../TelegramUI/Sources/AppDelegate.swift | 6 +- 18 files changed, 46 insertions(+), 188 deletions(-) delete mode 100644 Telegram/Telegram-iOS/PremiumCoffee.alticon/PremiumCoffee@2x.png delete mode 100644 Telegram/Telegram-iOS/PremiumCoffee.alticon/PremiumCoffee@3x.png delete mode 100644 Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@2x.png delete mode 100644 Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@3x.png delete mode 100644 Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@2x.png delete mode 100644 Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@3x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Coffee.imageset/Coffee.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Coffee.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Duck.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Duck.imageset/Duck.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Steam.png diff --git a/Telegram/BUILD b/Telegram/BUILD index 94ae56d601..bd8e5cbd95 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -329,9 +329,6 @@ alternate_icon_folders = [ "Premium", "PremiumBlack", "PremiumTurbo", - "PremiumCoffee", - "PremiumDuck", - "PremiumSteam", ] [ diff --git a/Telegram/Telegram-iOS/PremiumCoffee.alticon/PremiumCoffee@2x.png b/Telegram/Telegram-iOS/PremiumCoffee.alticon/PremiumCoffee@2x.png deleted file mode 100644 index abdd22ae69600b5d8c426981a2e1a54d628076ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26417 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 QegFUf07*qoM6N<$f>{}cl>h($ diff --git a/Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@2x.png b/Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@2x.png deleted file mode 100644 index eeb7340627a7879f4dddb825bbabf3cc656d9bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19872 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

A%U&M2s{bbfnoCC~Y zn^lk^(heweyC^NieL0$z~?r@>WJ) zb0cn&OwrtTn8jOu$l@(uW#Q{Tf(WwfKzblbgd|Zs(^2;_IYG;o%Du4t(=TM?6_*h& z970I&ye05TK;6mTI3S7(s5TJ^Qw|P0vYFT^gISC03y@jQfov5q9^|sf!+VjLCA5I! z;!FPkdD5T#6acPI!Dr5fXvx`gv0$%z8QMGQ;-%Rlth*2|mjg4-M?ZQCfApXKo+FdX zw$+a^sU>;pCdFDl}(plz`(>h z77iR>X6HW2^Hs8a5cr11ev5|Cf8A5aZ#j$F&iiTXe30-!-K~&oKza;e(~>06oA(*$ z$xz4|d@KuW%kPKYO+R6PTiz-GmO#(FnE1kL zFbgwIt6q05rZ|KI|Ixs;PVXI5l3Qu*=i zJn+I75e!1p!r1yXoO#K)&WVr-&}M_FJqJ1X(0;-&BG)5$qC}IBRNYGF4FGvaRET25 zh@rROv8F%AP{BiN0&xQ3OtJ$@2?xrS;fAGfKa79meD?j?%lPK~oB845#T;&oQ;v%m z5!Pf5^P+YCo0m;|3~de*B^jWxLc7Lcol|7aLk{?mQ3P?|_vDd7)3ED^<6;Hb{vR>d zeE5_h0;aq_{^LJ>JJ54VUn}i|+uz{gqfOABBFRP9I7OjegMqb3{}?7a#CLDMmtXnS zkMi=DznX!8J`Nl>aLilo-hGhWyLa=FU-~7Csh~-!dZLKLh&Rs6r$5Ewmv6@(2U~|T z&)rOBU;sUG2$~HtDbpFL^tkY~IXw4_?e-+(*_6Df%_Cev`Rqg#SBvJ$Vl< z9r_Byy=Xfbp_P!3cFPJBEYu8AH{h!?@e_sKA}lRIBXRS4{(fZB3z5Pp^I`STnMrrQ z+imIs2k`k9LAK!Hx|s|Nj$(|{B;WS-Pw<8}{th4d;9n9&5!YOE4d4ClcaM47Pkri( zJm=Y;tEBXy5n8?rgYWNPgeKKsVk@ZGCk z!ol+|!pvHR=O)?E(_k@7D5a%qM1=K)3L}|5KCC)WouuE{@ zjl@Vf;{X?2&?1|G^=sk5eW^9p#NPR5c+dK$Q-gIwsRrKKuyXQ$)}oaJQA^$zHm>W%HnJESJ3s@M7_ZfYJyQt>=7l{K zkGUmFWg(>O#+~bLx{6&d`W3#q^|>sLucO$E8Q*`Hs8MAmQsT&P-e8`~hYO77eGXP5 z{_S9i{-8|8jPdQc=W^-L|Hbn|=chB8=3$EiO@L6KCvjKRckL5_W(Y(5E;3baKo)fG z=h4z`r0?WD^~VPAjt{!9o&X8h&F7+C;8I$%d9=SD!aC&g%*;hB&X?Hn;JsXUflD^~ z&Ue0Z!rPyB-ey1{sk>3Iu9=P9chTH8OEBUxXY-pTpl`sX%shA(8rC7{ai*EIXz09A zlChYqg*ahxF=6M7<-sXo_kv-v5`czeiO2yAt|5BvO&odAFZ1s6p8^KPmgZQue=oC* zh&{0~k_)(cJkPTxdbx76*a;N_yUGoIG_#1!!nf_Uyrobe@JckJJV=5Fs91=_IXs#I ziJ(IXQu8{l^dtcS7$1S9gQ>r#fxYLwcu)K5Q-bT%08ScizmUP{4!uR}nhB&{h1jA) zeGqtPJp>Yp`3w;Aj(7YvmC7vN{N^{g_10UDd;1M%jPb5NehV;%O`ReVD6p2L+wLN% zL8btv1ifdS?KJfxhtTPRDMy45#~4Wo}U(5XSUP)u)2D}I+j!a@J6{aIg%?f7}175PZm+QuRIIHj2Ri`!;GJGc3%DQaA z#fx7@?(m@G6Er>Wb7;|`J&NtO(3fEQEfOgdEt0hmc}~L?aeW!=hn^XzHqk8Tj!)uU z@h-^puNtyb19;CryP!fE3e+<**~RN$|N0Z& zdc%e>Zn@=sOic8k^*xB+g9L-XI!d?y8;9TfNwVV*#ctzZp_qd+wxYWpf>;Hu)dSC>4rJ&vFK<* zG9Hnv3t=L{+wFDb6DnkVWONw2csQMjv)G6J0dv8dR}I;z0lfEL++ze}1Uoi?#F29) z^%q>iSu=EjfM$(Mew+(0TF>4096sS~pZlE4`0s!97Pf931E!JuCLo}>?-0|U{(FwR z|3ip@>^ehr(K5avhq?bY^gVxq?7AN*00T-?sdM*!<@SBTo*AK*7;;7#mpXZM&ZpY? zO&ol|t5|%_FVQ&v5{zdEX6Eq@9AvH;QO2+~pW#KL1)eq0$Av?y^CDG&ix+O;o%>$M zcrk>`S&;LcUXsRwLDNvGAQeFt1I(@fvo^p^#AwkXjn+;`oVhmK2m7ZWavKEfBmaC# z0I%K-uIzJ;4cmko=-3+Ki=T#RG@V8`u@)`l(*Sk=D)e~)OoL2d(>9z&^Y>F)_RfAbKgR)tap`e4@P z`QDy{JNLn%iXrO>eSxLWXyOBr2<2xyn}rv?n({R_60I2{w^YZQn`5cgU@o*|Jj1zz zIj$Y=3};Vm?njMTf=^ut;S%(n;}Y^3q|HGfM;y?qWVnm`@CY8N>AxJv?K)hpX52Jn9UH;K6@@r6VwQv6G*X zkZfsUM-vBVEJ#(L?BOkXNXc_cc21$sLfIhm20P@GF&9`g z_!Kz!Td#rLpK=ZvhE#*xjhM7`V4<}{drH2UMCRtRz#$d3_)35p?;>A@uk zH*xD#hTU)f2c|y!B~ZwWJI92@F@Yi!0*^Jl0c+Rz;Dt=jCVX?JaQj|EIW`Psl>VsE z@&Ho1_{l81@Kr26@1=wrCkV<3nW-rnwJI}_`^<)(49^_zU1ZQ6x0Tl7~4G;7tZlG2kijMRo8DQgx0G5{1AAwb&o; zLYt9uYo2)%!SnyW)wFDt9Nd_JnIE|4F)%s=84s!@%-Mg9^j(2%3}EfM-PTRbfCyrI zqGm*3X9)5I7dnjQu=Ob_ ztkn71!*J^^pZTURC?Q)&@Iz<@8RoBlA&W1$nbMWdzz+2hEY!$9w4X|~!C?zQ;BoPA zj%QEw^7OSm6i%Wvt(u~mTbhHs%g5@qB@FE%jN4}4i_91;6PujHA0X+93S4IKAf*o9gP3ADUtw`S$ z0H{6awC9$AoIVxth?5w~l{6~kVT_ODhB^3`|HP4x+(G}7AQqusRr-qoqXQnjIU%bG z`2>vRdk+i$_F%w~vap64TLBbmo6chXB{#ElkInlvb_DVN%GojukZiUo;Mu(Our>;|Yo8sc_Jbbm<|F$U=?k{nue zQOfEOboz&<5#aeByGNUTqmV(u60+`j=?4-t{2D6x6y%m4Ii0#n8Xa=^NT#=sX!bCZ zAHId$8DNbeX)0%qWf|-7oZN|G$R#u*_`4qme1ET{pE~E@MA70ESF`Zan<+i>g+yz| z2+9$KJqM`P8XS%kjBx%?o~y=+JZqwtk=*LKy0g?IFv7;3%*j98q97010?aodXPkez zA=rLJB90Ami>qTnDrtcjPtlxW%7SVqaZnQrJz1Bvl)5yZE4*tN)k*VPm;@^jSvjj$sew&U#kFEp}fmIwLm`S+)2qAlHGrT z`gdae1GogZR-&7@5Sak&4yKRd0TK0w598&)8X+IRnw&x-!6KMU0+HokzW{p`Hl24d zhhKa%3(tB9;l@pv7;=ZEh)X4oL`n_Ark)J1Sl7cd#(UX(D%=O$a=6UL9-e1cxygoN zz$2xQf7rRu2DqIy)&*?qeFIDZUkIMbZ<_bJl%R}{IhetmnI^q2lfx$-YCJ_fMH1=c zeaF zSi9jZ?rjZKlyrk&hxcHCHgZS=MUznM;1@u#`V4JrrRz+JKWn+ zgkZ4>pAW9%rG@jD2oFJaBT}+>dve6*){*c8T-==kt|_R#g{12{){PZ~9GaBfSIURb zrQOKTIVbGn$pJ3!fyQj-w{pE`V;`pP2K;kBj7=USnSULaS&%*;PRGC?noiqRRvae9 zJt4QLpSTI0XVEhFRhMiwxo#t0x$^iO*h`MXEvS&U*f^<*jdhFWCVvDDyA=Zx^GGY8ul*(*61I%Xjz+%5F~5UT49-?->T?tIa! z`PN0xX0~sXHPw*e!-rU`H#rnqe9z;&p#s;A_i){KFGJZ?$hKq9U2}ClxMP+d&ed68 z@Y&XvMOCQBmK~)Azq)OhH=Z*BKx{ihY`fVveWoc3Pt`*Po0EKY=nXu3>CQB0Q-nqJ~5*3;#4L4iauInQm&YVCV3A3J%Xn@$dJWnbq< z0s+q=nn40L2*i8AE`nK$^Ma%b7B2SL0U5x2u@L8A9 z2m*$dN}RoK7o{-fq1e!$^|*1pi{dGHZGN*kADO{V&JFRp`xPW-@p?a>VC0 zkVOv>@Cq3;w%8~}Ot(ptUb2FBMNpeMJv@WP7V*F??LDaqcXEIm)9n;e`~Zwa@gU;{ zLX-W@KW$n&ygOhz8LKE+GJXXz^PpLF%$~#7=db2luX``k`C)oBVa?(UVWq-cWGNfN z`eKfo*7kDaL@(U8rD^e;|(*E%8KyOe2R^$U@SMOE-Hc==r*!gr=` z;0seXaL?lTl%oQ}gLO944^k>s*%J#H&*SpZ9&T9Yxb@L^np&Jn@kNL=1^28WekpLX4i`H;GvZ`y zdoM4jZB?6VnMWRo16L%%D?Y^C3s2z#yWYxOr3)x}4JPvQ3})t;Tuhj@${EERFB>cH ztchN>_n&%_clY48hUp*oEbxhk=P5_ZroIfG2(i_+q=_v&xYXpeXASXN=Z#`jsV92W zzDDi()BTgZL>i{%xtBxldt9$b7Gt=F>`qJ#{j10SN@Z zFH5x0Kx1_>xuuvM)ky_k+)8QPOKs)Foq$dbaNKnhF(`_twl!nbChf{LEuBFXqZYsT z2;ZK54)47GJ*dFhz5B7Y$)PHQR=8j=$1}!zxPH8kk=*K)reoQqo(KZ$EQkEh`=_~M zy2@zIXIp=kNG-8-;Q1-g4=y!$)tUXg?YvPeO0^5zZa|kw;;yCIrv97RW=J(k$oW1Q zRW@({nm);RfFjFHF=Mmo{=+6Z9dn(>asCa>Po&)Y9p zL!wG8?#SHs?{z6so!{^LZmTT^sxeJ#$$5ElRG3KiKt2y8!JgS9t{VJ1@-Sdwz#>Z? z+1vUEuPhN2ngmG>2~5kt=p1x(Ohy*BOs6wXyRbPPtJ^3p4V?3=A41mIs8uqEb3$+z#TI+-oImp9ZOBl$P4*Q5Bqc- z7wDZ7sIZ%J$Vo`7w!JLB?fg+h~LCkMEzzM`mg zUKNeN*4%qiq_gARxb$9sj)m$b_SVj2G_%CMDm;6lhu^>O#9`;|eu*CKL250H8Bg5u z*ogV)!}EN0-xB=+oZlxLWIYEp&l{8f!YB*;Z+SDG5v*DsTnxE+%OJmf{wQIh)U0*c ztX;nktqG;a;9&P?aa9bhDwFjXUxWmY5nW(_MHfmHg-|d{hWOGNSnwXs!cYSJ7AbjT zZtEkwyo?Q+n9%Pm&&QR+j?3E_K<4D|t>P2Kbi`c`MZr}|ck93Lx2IFT3X)GpBP2nv z8X)3iTgDhlVN749^OIWI3kPq7#a*t{f|rHi^GVKrm0OBz2Xs|8s9Dc-{#%n3-t)jL z`zj$@`wST`&wX}+H5}mm$*&^f@ki!=BPLI;o#uh1h}WDoz;B;7Mrf5vY%$W(mX~wr z(JM#m(akaoWQm@U82Rzv5MBQ@22;ldy&YCFK*JzbiJx3U z0>$jgI;CqcMizbiyLyN&tGGae6^s?k;7C2@v-_6#(!ml7&4_J12J826uN`9(`}n=&om{J* z;`8P$yvutJXEH}VndhD*<@MW!_ z0XR3B-VK*=AIC_~2rSN$?EN$JtO3M~x@Fr4Zqu_Rs&C-RkMoL7e}m6l{tw(gxxf#n7npA*tScx3 zy;=6L5mk7F{Qz&Ye?U^tSS90U$f#w#J?PSLj3NnL@}&bZks-RUhF?hV9x8xByshpM z^~2N-wk;vs`EfA@ZN?BMoiKZD@H7D2v#|?cbvqa|MuH;Zp9|V>oZH%FA|MizsG#Ld zT($0B_~7VXmcBH~WpiJF-mPGJU@<`l6PI~7l%QEfYT*B{h^YvSY(oxwj(@h_=11Af zxJa68=_@kD7_*w=VtX&YX5Yq>^=klp(SH+vYu?UwCb4maT@}m!bM6Sgx^;+Blu(Nm zUtAZCw*Bgg7j@T4FDG>x&Q_VLsWY}6p16WVO>x=S)N>G zGy-2}vWc_4yA!4#hM}|FnbeJh`0N_Vxh~&|y12d3!q5bohC@-`OfV~g(LV8igzjs3i2;{ZDr8x%7_(eqtkLAA3y>k6Pnmo3R6t}F}! zO{*-`6Be2YR+YSOh^?~FbP7)-8HRL7YtvTEn-31Y2)* zY`UO;=|3F+7bc*1h67kY>J4Xy83U0bO+kBFMk?*dlMY$T-T?p3JPbvS!3x5pf zznHB5>m)Pp#fINN{8Y}Tv)+y*cnb-bGgucb@elQ<)1R4iMNDK2<=iy+VF?;Jew=$M z83T)rn9V&|erZ!5Q}vL!X2L=U1F8U=T3YFMWjbkdY zb(*sgd=Y$sa%5Qw6K5_VtkG$Z2AUaY?^0O~upS5W4#2Mb=8BSzN@`_*E!R7fqh~#4 z@Z^Vaog82>?x4o`yHl0l?cj5P2X)&n2Az|`jSz01Yb*rc&!r`t6_#>D+wVrtzKC4! zr_yysuzUUubTHMzoeiixNg6c}#47!^1ZEhUW{e=|_Ks!@L;WoAuxgw>3Felp~KiJO|^tE#A=;iU5u;R?|z-4F)TJ>mO@M5 zc__k!-3vyD125eN+&zf89MqMMt)aGp#4c#j{Vy>F5{oT0X?ZHWflbbD@R$Jx7{1({ zw_rfR2vcvk)5lDLGz=OWx?Mt=SG>EkFz>-g0_7Zb;t0t(MY02*0poIu;v;{8NFGZB_L{nYNti5zq(5)`u+B&W+ts+RhiHb?9xQnynT0ztR zq$K#e0w`LD1kHtnTMrZT{XXKmWhFWM7PN93WX@RLTa^yir@fTO$!@6$VufTpA-*ss zS|31C;lk{pj$n_ zy`9nlrc!kVcPpo;n%>5OW-R7_@7~KR)IE|7Q_$aomv`G9?b5%J%>O-7*g#9cYSS{M zqwDR0CD{-YUDzbq8bLNj%L=stUbyysOymx8sJVd+#e^Tv*Ll}nlk6;otS|UvJQtX^ zD7IZ-wCmp5;pjx&XKV{e)n)&;xU|BVMv~?}WEj+W&ahM9XWS0{R<^*gWbrY;ZSOv8 zdYx3+^g%>WwZ!w4R2c-xk7Cw6X;sjz4&eM67bAXDhC{qk@@uGG<`& zs-RnaPRzuOsdNVkV@$b%c)pu)O+jiNno(HtTm`qhg{ELfL$nZJ>{{aKcM|S?G8!F5 zf-~rxP|-y#4^B(NRnV+sA*rO|pgjPBwFzk9!!AhPPT<)bbKc)KvMy7M(+RT5R=#631*Wg$!mjHMw3`t>j#vk+um zD7CY;cdpj!qsaZPH2ltq1g)V!kgQKKSH+g2R>?5@&DXCQw$%eXevJzqwrt&{vNJVI znj=(os-JoaYGBESrjQJ^LW~CSM$>DUc2TgEBtR@3$BCr(jJtsC8bDDcQ3&f>xP0&% ze7Nr_t_r`-18gMrhd8UK>|AQ{SNG3y>tu!Dz|a?%W!&86Qc_M$flXAgR zD4`x(d@&?ySf>X;>R7{aAiF_60Rj>mB<$MR-yRF6AjDH;x6q|3zrXpqRl~M=fP1&V zx^(6QAmuVNnn>WgO@mbrDI2t4i7u^TMha*Wpl7gJI z%Q>M%ZIGSIFKldOES%@B?Df3UzJ)S5c5)UQiatdz=99Y@dH+N6R3giGAwWcET5W@x zSSNoI+X2?LWU?wTiZQ}clu(N;#`q}8273TJ!FuVg!jmXe-K0h_bswzh*tiIyf@D2x zxk)rxa)t)ropBXr?EF>3c4}#hn_lW3eIQh1VaeIa9**NGJ|-0GnuzFW72`akN1xMV5wDlnjEhRu6;mu&o{FtL!R9F|kRP zXFclk68J=uCE{x009FXLzm#LRxsLx6tNtXwnXiC?E4e@bGCz;T2^c{<@G4H(lBOVa z<94?vq?+N$dfRG^V#;27Hfz?R8H==zXy{({R>(Ptg=DCP&1Ru-0q4s7e9%6HH`zaB zT1VK&RyO1XA?A}i=lR6W1?sUfn)R{jWOJg5#X4}c>$0s2N@0SvmQZqJs55FG0pqzI zwkqkYqPrMH>i*HuBXAZ1vZ58ynUxBR#g&=#A>P_V*E~xLquZm5TD^i8461i-Un1CT& zU|8nB^H&cnfTu{*#l5W|z{N97E<-d`BAIVEr=Nx3f>$AFe0;TZ>Y3%|ym?s~kC~o! zi2$C58Zc$wg~VD*PPZm=vX#XH(@1Mn7~Fp3p2Y38i)Fdp(tUL;5KcTNLNXH^rBee!Rv2BBqi>Hrtl z!^Ri8=NX{dgvBK^n}xJYpILIJZys$Ao}l-NGqcJDsf#N@V!-y<&a!uc?=D-a8wT~2 zcw>`fw1JI4qqE6Kfj8+p`19n2jOwnGn|oNBwcI`5;FG%-d1$H0V8)R3g~)d7-$<3L z5tf=UQ;nFsQR?EeRv!TtNlv9IyJs;?4{3VfwR~)Ce=1VU5>JhL2a>@lDd=I1}N} zJ`o3ZO(`s)*-GSTr7( z#CW)nw+YBT{SQ`;PZvEpfCsk2w%54<&4AQG%*>4AVw0M03z<~*0Z$FE@>-5ojC46S zD=yd_fj1Yp!zyBf_E>D*b_#>7l({SK+x;H6)ud*y1xvg!LgLp9zpCg9Htbos@J9?>B$SznT9?uQXYw2dTtL-FggWJbE*RQkbw5 zT84s{k_@t+5k6>N#FOIxi)PLt8mzdL=R_1(q>{lbWx%&CHMm6-RjW<(bEHc42WnT<|;TQVJxBcla>vQ$T%-sbr8!fO__54z}6}^Q5+}Oa>i? zujgt>EnDJOd$p)r`HEZ#UoFJM;|*+Y9gPAsIiEgh@_Y6TyeqkxqE7PwTS$Uo`ZI=R z5;9q95GD}=8DZ9}V;3X5$^I9fWd9A=iZ$_ZbJg4ATcqLRl{0BY*%j?Hg5*5v_Z}gs zTTEKcKYRI`A1%19-;e3k6&u3mE``PWT_fvYH>^X)#-LusIZq)OuA_lP;x10?O7GDg z=efyzGu6%$(1C>T@+uO_$vI;s>53;SKzH1%n39jTkVO(72}0muO1hShm_OuJc_m9S z+%8aOam^Ui1>R_XpXb{Tfo#Dhd2F#x(ib`F;aJV_EfRZpb9q2J`;S@_Tg*^_X!jiD z?;gPPIzBP|o9TJ;JxJzJZ+t%uN4(G60iSNd_D4l(FRK zSfIff^bd&gL=TlZ1lLTvCCvY4t5et?(*p!4jP z3;1`riCuCYRffq@=4^h*Gwf$rt2-RH~r&L&h)Pl+ydnf|mY!kr2o3-n_FopQ5^#j9rUmoljO7(W7LK^Jh_ zWb-)xX#_d~GMdJVt;-%7X}W%`SZN&R8oc=&SV26c-I)|z$@oa#r~HkbMAKEge$WK6 zSN;b1=lsnncKj$hP3H$+`v1b_m$@051F1AH`}esTi^fO21gzlA=Umo8OD4CR9|}aq zC5BfFc1?)p(nN50>@xT`av7X#HnG7LBcjndnrotwhqdEaIUCpr3;`QZ&cVtUwq>&= z1`X6L`70)n1{T7UbCcArXGMQ}gY;*q{qP{s;VND)kbpOKA-U@w^v;C@ ziEL(B3knoo{%It8@@*-rp+|SDPB-oOCwFr7!hN*s`xqbx=Fk+@ z575Cu2%D&nGxAG0Y#d^HLeKJHs$cxoY%QEOrot%pmlAZ{g zP4Jeon1F8o)@w6$gJmbtCADVU)G;qDo#KRArnoAQQ* z!gK!?Z*=>k>%cMSu>t(UKX7L#0qvwarCl%+3(U>I;E+=bRh{EQ1yju;v4<@*oqZSz zYSQAJiL`^;r$mnu*fzDfS=!ueY96K*K%5qKOLc^}zlkk`NSv0k@GTMxW+CTRDBn$p z)_1zwXNC&I`xmI(z8{l!VRB6%cio?mx%9+mTbwFAdVr7I+5uN_?nDE4=~N7zV}ZdT z_j=j30R=xnLJvR6WAhQV5T*9#_J zMgz?RkS{>AB0Z7&IE&Bo5x**f3grv-LvIgV2`CFt7Kr{ZL;Z(Yc5 zDTCJv`=x<-=z6pYzQGLS33ty?y=@<4yTCo~WfWibe;$`^JUW2mYNrBT1oZWx8#bju z)Cjx)%@y6c6GgaDIR;Xi{_zqg*Oqc(0q&ru^UwTC_GxHi_&FSRb7HyJ;2m_jGEN#n0BsP z8B{F>Eal*-6R1I=Zj zQFoiAl=iG_g~OKR9Ul*?)JB$8yfg@~*%-~m>23$bMZkINO4aeGWv&`m^-fhV4IfkY z+<_Xc{UhFS8lVbBFntAVEu!-6{ltgMnEq5-PMpjwzWmdVQwKWq=j)p5~qfN?(46WV(#kG9)bIp7BRN5pdzL z1RLTieD;#gVI6hQ!2xu`2FJP0rt5G^wyg9&9}C$N0i<0^v}c_+EU>AqnYcVKqqxnV zC%YN6%PlHSzFKG75{om5(n|p`4)k^rvQ8&DWEBZKq$i85HmTn?MPt_-CIGLHx(NI{ z`RBcl%q72i;zAXsuJStUX$ZIHt~Zk~OzASF9}G zq-D}`4qCF(OWjv1*Qag;$Qn!{Y0*A$fr75=MrnnSj`jU+vWoZ~Qp`YNY3`Y$ao-e4 zJ;v*EZB`5Z`YXx5=p%Tikkfn`=rjZyc74hnngtGkrhC+ZA#`{IvU&G@dhF{l^RiaM z-N%yKEhVp&#kNe_KAwC$#?PmU`f(N6mEUQbd4kCYfDliWs6Q}8JX1q5AZbJhh0K+| zN$$EoMY4Uz`GLocPE$1Lz!%`(-{i79S{|*mE{hg>VPFu==iSNH%jB@quBkvvhNjUY zkBydH3ECta;&MgZ;-5yWIQxZh$kyF9!Y`qQee~XdSe%oz5d+< z+n#rfoBu@UGyx2-^bmaix8dLy-D|_r`A(wMkCgaS5)}Gq#(Ns-s>cs6u zR*UraLNSk6g*d^+aVq0i-^5b~HT@&vmf?)&Dz4W;qRA4?ee)!9uB4;M;}YZ&kW3Gm zC%u{M)qi-}f(DP0P9wlA+V@#_;BTEPlg=0s12$DQTFb35Xd7VK+NfHK%UN|{H=Mw+avW-LXxc6@f&`vB@H(+*Ga;F;5Kop}LV7hu z{B|XZRPq=y7u`(uX}^ydIr}jT;%TGD0bp>3-oY=S4}BbFz6aGK?(No}uCSeU=UhR1 zlQYmR`_Y;p8m6)`mqGf9nBF23b4W3VbUO>IO=~)8$9y>!i4zCT^f9g$Ml1AZ6KthH zTyBueRY?}AB&E<*Y|Nxrsz9mn3C_NW?3KTTx8bVOI+Tx*9w&gisXhsZzkyEPjvl!U zDtjR;IdEZ_W_!%nq@ID+ztWvxn#Lx?2eMhDkUN~=J*0-a60DJP}D z3Gr~U-K5L7@zPR6DLS?VZjx>Wb`|83khZ%~jFYLYBNv_M01&*5R}-B5B7*Z@h4ifb zi45JNq@OUrkCAllUhJW7V-I`-J#q(HIq2SB;Stjm@a`;*_Gi)+xZ4M#LOWr;92MKzR{4mn94l}SB={o~6a3=Vte)`MLApHUX`~)3~PE*?K6ZA7n zPXPQ2PEP>*3r)tS XOULmEJjtQ&00000NkvXXu0mjf2Bv8x diff --git a/Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@3x.png b/Telegram/Telegram-iOS/PremiumDuck.alticon/PremiumDuck@3x.png deleted file mode 100644 index dea2849f51b7aac004b1dda9e0d26cac66947be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32968 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 Ef*J`S#{d8T diff --git a/Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@2x.png b/Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@2x.png deleted file mode 100644 index 4e0cf791fb465493524f931ae4c23b29581a079c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27906 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 diff --git a/Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@3x.png b/Telegram/Telegram-iOS/PremiumSteam.alticon/PremiumSteam@3x.png deleted file mode 100644 index 0d59ed2b68331d920e56caaf331996af154214e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45528 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

PglY+muF}okR1N^oiNArZUCSH1dv( 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�rT|^$JSaL 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 diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 745f4e8845..8abf2049b6 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10105,10 +10105,6 @@ Sorry for the inconvenience."; "ChatContextMenu.TextSelectionTip2" = "Hold on a word, then move cursor to select more| text to copy or quote."; -"Appearance.AppIconCoffee" = "Coffee"; -"Appearance.AppIconDuck" = "Duck"; -"Appearance.AppIconSteam" = "Steam"; - "Notification.GiftLink" = "You received a gift"; "MESSAGE_GIFTCODE" = "%1$@ sent you a Gift Code for %2$@ months of Telegram Premium"; diff --git a/submodules/PremiumUI/Sources/AppIconsDemoComponent.swift b/submodules/PremiumUI/Sources/AppIconsDemoComponent.swift index 595b5bb4e8..7c0fb63798 100644 --- a/submodules/PremiumUI/Sources/AppIconsDemoComponent.swift +++ b/submodules/PremiumUI/Sources/AppIconsDemoComponent.swift @@ -38,7 +38,6 @@ final class AppIconsDemoComponent: Component { private var component: AppIconsDemoComponent? private var containerView: UIView - private var axisView = UIView() private var imageViews: [UIImageView] = [] private var isVisible = false @@ -50,7 +49,6 @@ final class AppIconsDemoComponent: Component { super.init(frame: frame) self.addSubview(self.containerView) - self.containerView.addSubview(self.axisView) } required init?(coder: NSCoder) { @@ -64,11 +62,7 @@ final class AppIconsDemoComponent: Component { self.containerView.frame = CGRect(origin: CGPoint(x: -availableSize.width / 2.0, y: 0.0), size: CGSize(width: availableSize.width * 2.0, height: availableSize.height)) - self.axisView.bounds = CGRect(origin: .zero, size: availableSize) - self.axisView.center = CGPoint(x: availableSize.width, y: availableSize.height / 2.0) - if self.imageViews.isEmpty { - var i = 0 for icon in component.appIcons { let image: UIImage? switch icon.imageName { @@ -78,12 +72,6 @@ final class AppIconsDemoComponent: Component { image = UIImage(bundleImageName: "Premium/Icons/Black") case "PremiumTurbo": image = UIImage(bundleImageName: "Premium/Icons/Turbo") - case "PremiumDuck": - image = UIImage(bundleImageName: "Premium/Icons/Duck") - case "PremiumCoffee": - image = UIImage(bundleImageName: "Premium/Icons/Coffee") - case "PremiumSteam": - image = UIImage(bundleImageName: "Premium/Icons/Steam") default: image = nil } @@ -95,37 +83,31 @@ final class AppIconsDemoComponent: Component { imageView.layer.cornerCurve = .continuous } imageView.image = image - if i == 0 { - self.containerView.addSubview(imageView) - } else { - self.axisView.addSubview(imageView) - } + self.containerView.addSubview(imageView) self.imageViews.append(imageView) - - i += 1 } } } - let radius: CGFloat = availableSize.width * 0.33 - let angleIncrement: CGFloat = 2 * .pi / CGFloat(self.imageViews.count - 1) - var i = 0 for view in self.imageViews { let position: CGPoint - if i == 0 { - position = CGPoint(x: availableSize.width, y: availableSize.height / 2.0) - } else { - let angle = CGFloat(i - 1) * angleIncrement - let xPosition = radius * cos(angle) + availableSize.width / 2.0 - let yPosition = radius * sin(angle) + availableSize.height / 2.0 - - position = CGPoint(x: xPosition, y: yPosition) + switch i { + case 0: + position = CGPoint(x: availableSize.width * 0.5, y: availableSize.height * 0.333) + case 1: + position = CGPoint(x: availableSize.width * 0.333, y: availableSize.height * 0.667) + case 2: + position = CGPoint(x: availableSize.width * 0.667, y: availableSize.height * 0.667) + default: + position = CGPoint(x: availableSize.width * 0.5, y: availableSize.height * 0.5) + } + + if !self.animating { + view.center = position.offsetBy(dx: availableSize.width / 2.0, dy: 0.0) } - view.center = position - i += 1 } @@ -143,48 +125,6 @@ final class AppIconsDemoComponent: Component { } self.isVisible = isDisplaying - let rotationDuration: Double = 12.0 - if isDisplaying { - if self.axisView.layer.animation(forKey: "rotationAnimation") == nil { - let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") - rotationAnimation.fromValue = 0.0 - rotationAnimation.toValue = 2.0 * CGFloat.pi - rotationAnimation.duration = rotationDuration - rotationAnimation.repeatCount = Float.infinity - self.axisView.layer.add(rotationAnimation, forKey: "rotationAnimation") - - var i = 0 - for view in self.imageViews { - if i == 0 { - let animation = CABasicAnimation(keyPath: "transform.scale") - animation.duration = 2.0 - animation.fromValue = 1.0 - animation.toValue = 1.15 - animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) - animation.autoreverses = true - animation.repeatCount = .infinity - view.layer.add(animation, forKey: "scale") - } else { - view.transform = CGAffineTransformMakeScale(0.8, 0.8) - - let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") - rotationAnimation.fromValue = 0.0 - rotationAnimation.toValue = -2.0 * CGFloat.pi - rotationAnimation.duration = rotationDuration - rotationAnimation.repeatCount = Float.infinity - view.layer.add(rotationAnimation, forKey: "rotationAnimation") - } - - i += 1 - } - } - } else { - self.axisView.layer.removeAllAnimations() - for view in self.imageViews { - view.layer.removeAllAnimations() - } - } - return availableSize } @@ -192,37 +132,38 @@ final class AppIconsDemoComponent: Component { func animateIn(availableSize: CGSize) { self.animating = true - let radius: CGFloat = availableSize.width * 2.5 - let angleIncrement: CGFloat = 2 * .pi / CGFloat(self.imageViews.count - 1) - var i = 0 for view in self.imageViews { - if i > 0 { - let delay: Double = 0.033 * Double(i - 1) - - let angle = CGFloat(i - 1) * angleIncrement - let xPosition = radius * cos(angle) - let yPosition = radius * sin(angle) - - let from = CGPoint(x: xPosition, y: yPosition) - let initialPosition = view.layer.position - view.layer.position = initialPosition.offsetBy(dx: xPosition, dy: yPosition) - view.alpha = 0.0 - - Queue.mainQueue().after(delay) { - view.alpha = 1.0 - view.layer.position = initialPosition - view.layer.animateScale(from: 3.0, to: 0.8, duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring) - view.layer.animatePosition(from: from, to: CGPoint(), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, additive: true) - view.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.15) - - if i == self.imageViews.count - 1 { - self.animating = false - } - } - } else { - + let from: CGPoint + let delay: Double + switch i { + case 0: + from = CGPoint(x: -availableSize.width * 0.333, y: -availableSize.height * 0.8) + delay = 0.1 + case 1: + from = CGPoint(x: -availableSize.width * 0.55, y: availableSize.height * 0.75) + delay = 0.15 + case 2: + from = CGPoint(x: availableSize.width * 0.9, y: availableSize.height * 0.75) + delay = 0.0 + default: + from = CGPoint(x: availableSize.width * 0.5, y: availableSize.height * 0.5) + delay = 0.0 } + + let initialPosition = view.layer.position + view.layer.position = initialPosition.offsetBy(dx: from.x, dy: from.y) + + Queue.mainQueue().after(delay) { + view.layer.position = initialPosition + view.layer.animateScale(from: 3.0, to: 1.0, duration: 0.5, delay: 0.0, timingFunction: kCAMediaTimingFunctionSpring) + view.layer.animatePosition(from: from, to: CGPoint(), duration: 0.5, delay: 0.0, timingFunction: kCAMediaTimingFunctionSpring, additive: true) + + if i == 2 { + self.animating = false + } + } + i += 1 } } diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index c08a532aeb..7f5efd8006 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -1522,10 +1522,7 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { guard let self else { return } - var newPerks: [String] = [] - if !dismissedPremiumAppIconsBadge { - newPerks.append(PremiumPerk.appIcons.identifier) - } + let newPerks: [String] = [] self.newPerks = newPerks self.updated() }) @@ -1856,7 +1853,7 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent { demoSubject = .animatedUserpics case .appIcons: demoSubject = .appIcons - let _ = ApplicationSpecificNotice.setDismissedPremiumAppIconsBadge(accountManager: accountContext.sharedContext.accountManager).startStandalone() +// let _ = ApplicationSpecificNotice.setDismissedPremiumAppIconsBadge(accountManager: accountContext.sharedContext.accountManager).startStandalone() case .animatedEmoji: demoSubject = .animatedEmoji case .emojiStatus: diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift index ab34ed2885..b88e7e4a58 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsAppIconItem.swift @@ -365,12 +365,6 @@ class ThemeSettingsAppIconItemNode: ListViewItemNode, ItemListItemNode { name = item.strings.Appearance_AppIconBlack case "PremiumTurbo": name = item.strings.Appearance_AppIconTurbo - case "PremiumDuck": - name = item.strings.Appearance_AppIconDuck - case "PremiumCoffee": - name = item.strings.Appearance_AppIconCoffee - case "PremiumSteam": - name = item.strings.Appearance_AppIconSteam default: name = icon.name } diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Icons/Coffee.imageset/Coffee.png b/submodules/TelegramUI/Images.xcassets/Premium/Icons/Coffee.imageset/Coffee.png deleted file mode 100644 index 60c199314aaaaf1a956104b4a96887017a336338..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93810 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

Ku@W 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 z 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 diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Contents.json deleted file mode 100644 index 3313751950..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "filename" : "Steam.png", - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Steam.png b/submodules/TelegramUI/Images.xcassets/Premium/Icons/Steam.imageset/Steam.png deleted file mode 100644 index eaf5a8361adc753ba21df54277feba2ad42ffbdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73476 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

p4qpZB=DK-uy26fAspw{)V{ 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 iulVdz@p{iRp85Z$3a$YAWZBLD0000 Date: Wed, 25 Oct 2023 06:21:02 +0400 Subject: [PATCH 3/8] Update localization --- .../Telegram-iOS/en.lproj/Localizable.strings | 147 ++++++++++++++++ submodules/PremiumUI/BUILD | 1 + .../Sources/CreateGiveawayController.swift | 76 +++++---- .../Sources/CreateGiveawayHeaderItem.swift | 6 +- .../Sources/GiveawayInfoController.swift} | 159 +++++++++++++++++- .../Sources/PremiumBoostScreen.swift | 4 +- .../Sources/PremiumGiftCodeScreen.swift | 1 + .../Sources/ReplaceBoostScreen.swift | 29 ++-- .../Sources/ChannelStatsController.swift | 27 ++- .../ChatMessageGiftBubbleContentNode.swift | 13 +- .../Sources/ShareWithPeersScreen.swift | 33 ++-- .../MediaNavigationStripComponent.swift | 3 - .../Sources/StoryContainerScreen.swift | 8 + .../StoryInteractionGuideComponent.swift | 25 +-- .../Sources/StoryItemContentComponent.swift | 14 +- .../StoryItemSetContainerComponent.swift | 2 +- .../TelegramUI/Sources/ChatController.swift | 158 +---------------- 17 files changed, 443 insertions(+), 263 deletions(-) rename submodules/{TelegramUI/Sources/GiveawayInfoAlertController.swift => PremiumUI/Sources/GiveawayInfoController.swift} (57%) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 8abf2049b6..6816843e53 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10151,3 +10151,150 @@ Sorry for the inconvenience."; "Stats.Boosts.ShowMoreBoosts_1" = "Show %@ More Boost"; "Stats.Boosts.ShowMoreBoosts_any" = "Show %@ More Boosts"; + +"ReassignBoost.Title" = "Reassign Boosts"; +"ReassignBoost.Description" = "To boost **%1$@**, reassign a previous boost or gift **Telegram Premium** to a friend to get **%2$@** additional boosts."; +"ReassignBoost.ReassignBoosts" = "Reassign Boosts"; +"ReassignBoost.AvailableIn" = "Available in %@"; +"ReassignBoost.ExpiresOn" = "Boost expires on %@"; +"ReassignBoost.WaitForCooldown" = "Wait until the boost is available or get **%1$@** more boosts by gifting a **Telegram Premium** subscription."; + +"ReassignBoost.Success" = "Wait until the boost is available or get **%1$@** more boosts by gifting a **Telegram Premium** subscription."; + +//"\(replacedBoosts) boosts are reassigned from \(inChannels) other channel." + +"ChannelBoost.MoreBoosts.Title" = "More Boosts Needed"; +"ChannelBoost.MoreBoosts.Text" = "To boost **%1$@** again, gift **Telegram Premium** to a friend and get **%2$@** additional boosts."; + +"BoostGift.Title" = "Boosts via Gifts"; +"BoostGift.Description" = "Get more boosts for your channel by gifting\nPremium to your subscribers."; +"BoostGift.PrepaidGiveawayTitle" = "PREPAID GIVEAWAY"; +"BoostGift.PrepaidGiveawayCount_1" = "%@ Telegram Premium"; +"BoostGift.PrepaidGiveawayCount_any" = "%@ Telegram Premium"; +"BoostGift.PrepaidGiveawayMonths" = "%@-month subscriptions"; +"BoostGift.CreateGiveaway" = "Create Giveaway"; +"BoostGift.CreateGiveawayInfo" = "winners are chosen randomly"; +"BoostGift.AwardSpecificUsers" = "Award Specific Users"; +"BoostGift.SelectRecipients" = "select recipients"; +"BoostGift.QuantityTitle" = "QUANTITY OF PRIZES"; +"BoostGift.QuantityBoosts_1" = "%@ BOOST"; +"BoostGift.QuantityBoosts_any" = "%@ BOOSTS"; +"BoostGift.QuantityInfo" = "Choose how many Premium subscriptions to give away and boosts to receive."; +"BoostGift.ChannelsTitle" = "CHANNELS INCLUDED IN THE GIVEAWAY"; +"BoostGift.AddChannel" = "Add Channel"; +"BoostGift.ChannelsBoosts_1" = "this channel will receive %@ boost"; +"BoostGift.ChannelsBoosts_any" = "this channel will receive %@ boosts"; +"BoostGift.ChannelsInfo" = "Choose the channels users need to be subscribed to take part in the giveaway"; +"BoostGift.UsersTitle" = "USERS ELIGIBLE FOR THE GIVEAWAY"; +"BoostGift.FromCountries_1" = "from %@ country"; +"BoostGift.FromCountries_any" = "from %@ countries"; +"BoostGift.FromTwoCountries" = "from %1$@ and %2$@"; +"BoostGift.FromOneCountry" = "from %1$@"; +"BoostGift.FromAllCountries" = "from all countries"; +"BoostGift.AllSubscribers" = "All subscribers"; +"BoostGift.OnlyNewSubscribers" = "Only new subscribers"; +"BoostGift.LimitSubscribersInfo" = "Choose if you want to limit the giveaway only to those who joined the channel after the giveaway started."; +"BoostGift.DateTitle" = "DATE WHEN GIVEAWAY ENDS"; +"BoostGift.DateEnds" = "Ends"; +"BoostGift.DateInfo" = "Choose when %1$@ of your channel will be randomly selected to receive Telegram Premium."; +"BoostGift.DateInfoSubscribers_1" = "%@ subscriber"; +"BoostGift.DateInfoSubscribers_any" = "%@ subscribers"; +"BoostGift.DurationTitle" = "DURATION OF PREMIUM SUBSCRIPTIONS"; +"BoostGift.PremiumInfo" = "You can review the list of features and terms of use for Telegram Premium [here]()."; +"BoostGift.GiftPremium" = "Gift Premium"; +"BoostGift.StartGiveaway" = "Start Giveaway"; +"BoostGift.ReduceQuantity.Title" = "Reduce Quantity"; +"BoostGift.ReduceQuantity.Text" = "You can't acquire %1$@ %2$@-month subscriptions in the app. Do you want to reduce quantity to %3$@?"; +"BoostGift.ReduceQuantity.Reduce" = "Reduce"; +"BoostGift.GiveawayCreated.Title" = "Giveaway Created"; +"BoostGift.GiveawayCreated.Text" = "Check your channel's [Statistics]() to see how this giveaway boosted your channel."; +"BoostGift.PremiumGifted.Title" = "Premium Subscriptions Gifted"; +"BoostGift.PremiumGifted.Text" = "Check your channel's [Statistics]() to see how gifts boosted your channel."; + +"BoostGift.Subscribers.Title" = "Gift Premium"; +"BoostGift.Subscribers.Subtitle" = "select up to %@ subscribers"; +"BoostGift.Subscribers.SectionTitle" = "SUBSCRIBERS"; +"BoostGift.Subscribers.Joined" = "joined %@"; +"BoostGift.Subscribers.Search" = "Search Subscribers"; +"BoostGift.Subscribers.MaximumReached" = "You can select maximum %@ subscribers."; +"BoostGift.Subscribers.Save" = "Save Recipients"; + +"BoostGift.Channels.Title" = "Add Channels"; +"BoostGift.Channels.Subtitle" = "select up to %@ channels"; +"BoostGift.Channels.SectionTitle" = "CHANNELS"; +"BoostGift.Channels.Search" = "Search Channels"; +"BoostGift.Channels.MaximumReached" = "You can select maximum %@ channels."; +"BoostGift.Channels.PrivateChannel.Title" = "Channel is Private"; +"BoostGift.Channels.PrivateChannel.Text" = "Are you sure you want to add a private channel? Users won't be able to join it without an invite link."; +"BoostGift.Channels.PrivateChannel.Add" = "Add"; +"BoostGift.Channels.Save" = "Save Channels"; + +"Stats.Boosts.PrepaidGiveawaysTitle" = "PREPAID GIVEAWAYS"; +"Stats.Boosts.PrepaidGiveawayCount_any" = "%@ Telegram Premium"; +"Stats.Boosts.PrepaidGiveawayMonths" = "%@-month subscriptions"; +"Stats.Boosts.PrepaidGiveawaysInfo" = "Select a giveaway you already paid for to set it up."; +"Stats.Boosts.ShortMonth" = "%@m"; +"Stats.Boosts.Giveaway" = "Giveaway"; +"Stats.Boosts.Gift" = "Gift"; +"Stats.Boosts.TabBoosts_1" = "%@ Boost"; +"Stats.Boosts.TabBoosts_any" = "%@ Boosts"; +"Stats.Boosts.TabGifts_1" = "%@ Boost"; +"Stats.Boosts.TabGifts_any" = "%@ Boosts"; +"Stats.Boosts.ToBeDistributed" = "To Be Distributed"; +"Stats.Boosts.Unclaimed" = "Unclaimed"; +"Stats.Boosts.GetBoosts" = "Get Boosts via Gifts"; +"Stats.Boosts.GetBoostsInfo" = "Get more boosts for your channel by gifting Premium to your subscribers."; + +"Notification.PremiumPrize.Title" = "Congratulations!"; +"Notification.PremiumPrize.UnclaimedText" = "You have an unclaimed prize from a giveaway by **%1$@**.\n\nThis prize is a **Telegram Premium** subscription for %2$@."; +"Notification.PremiumPrize.GiveawayText" = "You won a prize in a giveaway organized by **%1$@**.\n\nYour prize is a **Telegram Premium** subscription for %2$@."; +"Notification.PremiumPrize.GiftText" = "You've received a gift from **%1$@**.\n\nYour gift is a **Telegram Premium** subscription for %2$@."; +"Notification.PremiumPrize.Months_1" = "**%@** month"; +"Notification.PremiumPrize.Months_any" = "**%@** months"; +"Notification.PremiumPrize.View" = "Open Gift Link"; +"Notification.PremiumPrize.Unclaimed" = "Unclaimed Prize"; + +"Story.SlideToSeek" = "Slide left or right to seek"; +"Story.Guide.Title" = "Watching Stories"; +"Story.Guide.Description" = "You can use these gestures to control playback."; +"Story.Guide.ForwardTitle" = "Go forward"; +"Story.Guide.ForwardDescription" = "Tap the screen"; +"Story.Guide.PauseTitle" = "Pause and Seek"; +"Story.Guide.PauseDescription" = "Hold and move sideways"; +"Story.Guide.BackTitle" = "Go back"; +"Story.Guide.BackDescription" = "Tap the left edge"; +"Story.Guide.MoveTitle" = "Move between stories"; +"Story.Guide.MoveDescription" = "Swipe left or right"; +"Story.Guide.Proceed" = "Tap to keep watching"; + +"Chat.Giveaway.Info.Title" = "About This Giveaway"; +"Chat.Giveaway.Info.EndedTitle" = "Giveaway Ended"; + +"Chat.Giveaway.Info.AlmostOver" = "The giveaway is almost over."; + +"Chat.Giveaway.Info.Subscriptions_1" = "**%@ Telegram Premium** subscription"; +"Chat.Giveaway.Info.Subscriptions_any" = "**%@ Telegram Premium** subscriptions"; + +"Chat.Giveaway.Info.RandomUsers_1" = "**%@** random user"; +"Chat.Giveaway.Info.RandomUsers_any" = "**%@** random user"; + +"Chat.Giveaway.Info.RandomSubscribers_1" = "**%@** random subscriber"; +"Chat.Giveaway.Info.RandomSubscribers_any" = "**%@** random subscribers"; + +"Chat.Giveaway.Info.Months_1" = "**%@** month"; +"Chat.Giveaway.Info.Months_any" = "**%@** months"; + +"Chat.Giveaway.Info.ActivatedLinks_1" = "%@ winner already used their gift link."; +"Chat.Giveaway.Info.ActivatedLinks_any" = "%@ of the winners already used their gift links."; + +"Chat.Giveaway.Info.Refunded" = "The channel cancelled the prizes by reversing the payment for them."; +"Chat.Giveaway.Info.Won" = "You won a prize in this giveaway. %@"; +"Chat.Giveaway.Info.DidntWin" = "You didn't win a prize in this giveaway."; +"Chat.Giveaway.Info.ViewPrize" = "View My Prize"; + +"Chat.Giveaway.Toast.NotAllowed" = "You can't participate in this giveaway."; +"Chat.Giveaway.Toast.Participating" = "You are participating in this giveaway."; +"Chat.Giveaway.Toast.NotQualified" = "You are not qualified for this giveaway yet."; +"Chat.Giveaway.Toast.AlmostOver" = "The giveaway is almost over."; +"Chat.Giveaway.Toast.Ended" = "The giveaway is ended."; +"Chat.Giveaway.Toast.LearnMore" = "Learn More"; diff --git a/submodules/PremiumUI/BUILD b/submodules/PremiumUI/BUILD index 4f360fed21..b6cff081e2 100644 --- a/submodules/PremiumUI/BUILD +++ b/submodules/PremiumUI/BUILD @@ -109,6 +109,7 @@ swift_library( "//submodules/CountrySelectionUI", "//submodules/TelegramUI/Components/Stories/PeerListItemComponent", "//submodules/InvisibleInkDustNode", + "//submodules/AlertUI", ], visibility = [ "//visibility:public", diff --git a/submodules/PremiumUI/Sources/CreateGiveawayController.swift b/submodules/PremiumUI/Sources/CreateGiveawayController.swift index fde0cc2f57..817742e941 100644 --- a/submodules/PremiumUI/Sources/CreateGiveawayController.swift +++ b/submodules/PremiumUI/Sources/CreateGiveawayController.swift @@ -377,8 +377,7 @@ private enum CreateGiveawayEntry: ItemListNodeEntry { case let .channelsHeader(_, text): return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section) case let .channel(_, _, peer, boosts, isRevealed): - return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), nameDisplayOrder: presentationData.nameDisplayOrder, context: arguments.context, peer: peer, presence: nil, text: boosts.flatMap { .text("this channel will receive \($0) boosts", .secondary) } ?? .none, label: .none, editing: ItemListPeerItemEditing(editable: boosts == nil, editing: false, revealed: isRevealed), switchValue: nil, enabled: true, selectable: peer.id != arguments.context.account.peerId, sectionId: self.section, action: { -// arguments.openPeer(peer) + return ItemListPeerItem(presentationData: presentationData, dateTimeFormat: PresentationDateTimeFormat(), nameDisplayOrder: presentationData.nameDisplayOrder, context: arguments.context, peer: peer, presence: nil, text: boosts.flatMap { .text(presentationData.strings.BoostGift_ChannelsBoosts($0), .secondary) } ?? .none, label: .none, editing: ItemListPeerItemEditing(editable: boosts == nil, editing: false, revealed: isRevealed), switchValue: nil, enabled: true, selectable: peer.id != arguments.context.account.peerId, sectionId: self.section, action: { }, setPeerIdWithRevealedOptions: { lhs, rhs in arguments.setItemIdWithRevealedOptions(lhs, rhs) }, removePeer: { id in @@ -433,7 +432,7 @@ private enum CreateGiveawayEntry: ItemListNodeEntry { } else { text = presentationData.strings.InviteLink_Create_TimeLimitExpiryDateNever } - return ItemListDisclosureItem(presentationData: presentationData, title: "Ends", label: text, labelStyle: active ? .coloredText(theme.list.itemAccentColor) : .text, sectionId: self.section, style: .blocks, disclosureStyle: .none, action: { + return ItemListDisclosureItem(presentationData: presentationData, title: presentationData.strings.BoostGift_DateEnds, label: text, labelStyle: active ? .coloredText(theme.list.itemAccentColor) : .text, sectionId: self.section, style: .blocks, disclosureStyle: .none, action: { arguments.dismissInput() var focus = false arguments.updateState { state in @@ -515,7 +514,7 @@ private func createGiveawayControllerEntries( switch subject { case .generic: - entries.append(.createGiveaway(presentationData.theme, "Create Giveaway", "winners are chosen randomly", state.mode == .giveaway)) + entries.append(.createGiveaway(presentationData.theme, presentationData.strings.BoostGift_CreateGiveaway, presentationData.strings.BoostGift_CreateGiveawayInfo, state.mode == .giveaway)) let recipientsText: String if !state.peers.isEmpty { @@ -533,22 +532,22 @@ private func createGiveawayControllerEntries( recipientsText = presentationData.strings.PremiumGift_LabelRecipients(Int32(peersCount)) } } else { - recipientsText = "select recipients" + recipientsText = presentationData.strings.BoostGift_SelectRecipients } - entries.append(.awardUsers(presentationData.theme, "Award Specific Users", recipientsText, state.mode == .gift)) + entries.append(.awardUsers(presentationData.theme, presentationData.strings.BoostGift_AwardSpecificUsers, recipientsText, state.mode == .gift)) case let .prepaid(prepaidGiveaway): - entries.append(.prepaidHeader(presentationData.theme, "PREPAID GIVEAWAY")) - entries.append(.prepaid(presentationData.theme, "\(prepaidGiveaway.quantity) Telegram Premium", "\(prepaidGiveaway.months)-month subscriptions", prepaidGiveaway)) + entries.append(.prepaidHeader(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayTitle)) + entries.append(.prepaid(presentationData.theme, presentationData.strings.BoostGift_PrepaidGiveawayCount(prepaidGiveaway.quantity), presentationData.strings.BoostGift_PrepaidGiveawayMonths("\(prepaidGiveaway.months)").string, prepaidGiveaway)) } if case .giveaway = state.mode { if case .generic = subject { - entries.append(.subscriptionsHeader(presentationData.theme, "QUANTITY OF PRIZES".uppercased(), "\(state.subscriptions * 4) BOOSTS")) + entries.append(.subscriptionsHeader(presentationData.theme, presentationData.strings.BoostGift_QuantityTitle.uppercased(), presentationData.strings.BoostGift_QuantityBoosts(state.subscriptions * 4))) entries.append(.subscriptions(presentationData.theme, state.subscriptions)) - entries.append(.subscriptionsInfo(presentationData.theme, "Choose how many Premium subscriptions to give away and boosts to receive.")) + entries.append(.subscriptionsInfo(presentationData.theme, presentationData.strings.BoostGift_QuantityInfo)) } - entries.append(.channelsHeader(presentationData.theme, "CHANNELS INCLUDED IN THE GIVEAWAY".uppercased())) + entries.append(.channelsHeader(presentationData.theme, presentationData.strings.BoostGift_ChannelsTitle.uppercased())) var index: Int32 = 0 let channels = [peerId] + state.channels for channelId in channels { @@ -557,35 +556,44 @@ private func createGiveawayControllerEntries( } index += 1 } - entries.append(.channelAdd(presentationData.theme, "Add Channel")) - entries.append(.channelsInfo(presentationData.theme, "Choose the channels users need to be subscribed to take part in the giveaway")) + entries.append(.channelAdd(presentationData.theme, presentationData.strings.BoostGift_AddChannel)) + entries.append(.channelsInfo(presentationData.theme, presentationData.strings.BoostGift_ChannelsInfo)) - entries.append(.usersHeader(presentationData.theme, "USERS ELIGIBLE FOR THE GIVEAWAY".uppercased())) + entries.append(.usersHeader(presentationData.theme, presentationData.strings.BoostGift_UsersTitle.uppercased())) let countriesText: String if state.countries.count > 2 { - countriesText = "from \(state.countries.count) countries" + countriesText = presentationData.strings.BoostGift_FromCountries(Int32(state.countries.count)) } else if !state.countries.isEmpty { - let allCountries = state.countries.map { locale.localizedString(forRegionCode: $0) ?? $0 }.joined(separator: " and ") - countriesText = "from \(allCountries)" + if state.countries.count == 2 { + let firstCountryCode = state.countries.first ?? "" + let secondCountryCode = state.countries.last ?? "" + let firstCountryName = locale.localizedString(forRegionCode: firstCountryCode) ?? firstCountryCode + let secondCountryName = locale.localizedString(forRegionCode: secondCountryCode) ?? secondCountryCode + countriesText = presentationData.strings.BoostGift_FromTwoCountries(firstCountryName, secondCountryName).string + } else { + let countryCode = state.countries.first ?? "" + let countryName = locale.localizedString(forRegionCode: countryCode) ?? countryCode + countriesText = presentationData.strings.BoostGift_FromOneCountry(countryName).string + } } else { - countriesText = "from all countries" + countriesText = presentationData.strings.BoostGift_FromAllCountries } - entries.append(.usersAll(presentationData.theme, "All subscribers", countriesText, !state.onlyNewEligible)) - entries.append(.usersNew(presentationData.theme, "Only new subscribers", countriesText, state.onlyNewEligible)) - entries.append(.usersInfo(presentationData.theme, "Choose if you want to limit the giveaway only to those who joined the channel after the giveaway started.")) + entries.append(.usersAll(presentationData.theme, presentationData.strings.BoostGift_AllSubscribers, countriesText, !state.onlyNewEligible)) + entries.append(.usersNew(presentationData.theme, presentationData.strings.BoostGift_OnlyNewSubscribers, countriesText, state.onlyNewEligible)) + entries.append(.usersInfo(presentationData.theme, presentationData.strings.BoostGift_LimitSubscribersInfo)) - entries.append(.timeHeader(presentationData.theme, "DATE WHEN GIVEAWAY ENDS".uppercased())) + entries.append(.timeHeader(presentationData.theme, presentationData.strings.BoostGift_DateTitle.uppercased())) entries.append(.timeExpiryDate(presentationData.theme, presentationData.dateTimeFormat, state.time, state.pickingTimeLimit)) if state.pickingTimeLimit { entries.append(.timeCustomPicker(presentationData.theme, presentationData.dateTimeFormat, state.time, minDate, maxDate)) } - entries.append(.timeInfo(presentationData.theme, "Choose when \(state.subscriptions) subscribers of your channel will be randomly selected to receive Telegram Premium.")) + entries.append(.timeInfo(presentationData.theme, presentationData.strings.BoostGift_DateInfo(presentationData.strings.BoostGift_DateInfoSubscribers(Int32(state.subscriptions))).string)) } if case .generic = subject { - entries.append(.durationHeader(presentationData.theme, "DURATION OF PREMIUM SUBSCRIPTIONS".uppercased())) + entries.append(.durationHeader(presentationData.theme, presentationData.strings.BoostGift_DurationTitle.uppercased())) let recipientCount: Int switch state.mode { @@ -628,7 +636,7 @@ private func createGiveawayControllerEntries( i += 1 } - entries.append(.durationInfo(presentationData.theme, "You can review the list of features and terms of use for Telegram Premium [here]().")) + entries.append(.durationInfo(presentationData.theme, presentationData.strings.BoostGift_PremiumInfo)) } return entries @@ -776,7 +784,7 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio let (state, peersMap) = stateAndPeersMap - let headerItem = CreateGiveawayHeaderItem(theme: presentationData.theme, title: "Boosts via Gifts", text: "Get more boosts for your channel by gifting\nPremium to your subscribers.", cancel: { + let headerItem = CreateGiveawayHeaderItem(theme: presentationData.theme, strings: presentationData.strings, title: presentationData.strings.BoostGift_Title, text: presentationData.strings.BoostGift_Description, cancel: { dismissImpl?() }) @@ -787,7 +795,7 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio case .gift: badgeCount = Int32(state.peers.count) } - let footerItem = CreateGiveawayFooterItem(theme: presentationData.theme, title: state.mode == .gift ? "Gift Premium" : "Start Giveaway", badgeCount: badgeCount, isLoading: state.updating, action: { + let footerItem = CreateGiveawayFooterItem(theme: presentationData.theme, title: state.mode == .gift ? presentationData.strings.BoostGift_GiftPremium : presentationData.strings.BoostGift_StartGiveaway, badgeCount: badgeCount, isLoading: state.updating, action: { buyActionImpl?() }) let leftNavigationButton = ItemListNavigationButton(content: .none, style: .regular, enabled: false, action: {}) @@ -857,7 +865,7 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio } guard let selectedProduct else { - let alertController = textAlertController(context: context, title: "Reduce Quantity", text: "You can't acquire \(state.subscriptions) \(selectedMonths)-month subscriptions in the app. Do you want to reduce quantity to 25?", actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: "Reduce", action: { + let alertController = textAlertController(context: context, title: presentationData.strings.BoostGift_ReduceQuantity_Title, text: presentationData.strings.BoostGift_ReduceQuantity_Text("\(state.subscriptions)", "\(selectedMonths)", "\(25)").string, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: presentationData.strings.BoostGift_ReduceQuantity_Reduce, action: { updateState { state in var updatedState = state updatedState.subscriptions = 25 @@ -915,11 +923,11 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio let text: String switch state.mode { case .giveaway: - title = "Giveaway Created" - text = "Check your channel's [Statistics]() to see how this giveaway boosted your channel." + title = presentationData.strings.BoostGift_GiveawayCreated_Title + text = presentationData.strings.BoostGift_GiveawayCreated_Text case .gift: - title = "Premium Subscriptions Gifted" - text = "Check your channel's [Statistics]() to see how gifts boosted your channel." + title = presentationData.strings.BoostGift_PremiumGifted_Title + text = presentationData.strings.BoostGift_PremiumGifted_Text } let tooltipController = UndoOverlayController(presentationData: presentationData, content: .premiumPaywall(title: title, text: text, customUndoText: nil, timeout: nil, linkAction: { [weak navigationController] _ in @@ -992,8 +1000,8 @@ public func createGiveawayController(context: AccountContext, updatedPresentatio controllers.removeLast(count) navigationController.setViewControllers(controllers, animated: true) - let title = "Giveaway Created" - let text = "Check your channel's [Statistics]() to see how this giveaway boosted your channel." + let title = presentationData.strings.BoostGift_GiveawayCreated_Title + let text = presentationData.strings.BoostGift_GiveawayCreated_Text let tooltipController = UndoOverlayController(presentationData: presentationData, content: .premiumPaywall(title: title, text: text, customUndoText: nil, timeout: nil, linkAction: { [weak navigationController] _ in let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.StatsDatacenterId(id: peerId)) diff --git a/submodules/PremiumUI/Sources/CreateGiveawayHeaderItem.swift b/submodules/PremiumUI/Sources/CreateGiveawayHeaderItem.swift index 7e540dbaa5..daeb42a2e0 100644 --- a/submodules/PremiumUI/Sources/CreateGiveawayHeaderItem.swift +++ b/submodules/PremiumUI/Sources/CreateGiveawayHeaderItem.swift @@ -11,12 +11,14 @@ import ComponentFlow final class CreateGiveawayHeaderItem: ItemListControllerHeaderItem { let theme: PresentationTheme + let strings: PresentationStrings let title: String let text: String let cancel: () -> Void - init(theme: PresentationTheme, title: String, text: String, cancel: @escaping () -> Void) { + init(theme: PresentationTheme, strings: PresentationStrings, title: String, text: String, cancel: @escaping () -> Void) { self.theme = theme + self.strings = strings self.title = title self.text = text self.cancel = cancel @@ -132,7 +134,7 @@ class CreateGiveawayHeaderItemNode: ItemListControllerHeaderItemNode { self.titleNode.attributedText = attributedTitle self.textNode.attributedText = attributedText - self.cancelNode.setAttributedTitle(NSAttributedString(string: "Cancel", font: Font.regular(17.0), textColor: self.item.theme.rootController.navigationBar.accentTextColor), for: .normal) + self.cancelNode.setAttributedTitle(NSAttributedString(string: self.item.strings.Common_Cancel, font: Font.regular(17.0), textColor: self.item.theme.rootController.navigationBar.accentTextColor), for: .normal) } override func updateContentOffset(_ contentOffset: CGFloat, transition: ContainedViewLayoutTransition) { diff --git a/submodules/TelegramUI/Sources/GiveawayInfoAlertController.swift b/submodules/PremiumUI/Sources/GiveawayInfoController.swift similarity index 57% rename from submodules/TelegramUI/Sources/GiveawayInfoAlertController.swift rename to submodules/PremiumUI/Sources/GiveawayInfoController.swift index 8234b52419..63f22ffc38 100644 --- a/submodules/TelegramUI/Sources/GiveawayInfoAlertController.swift +++ b/submodules/PremiumUI/Sources/GiveawayInfoController.swift @@ -4,12 +4,161 @@ import AsyncDisplayKit import Display import SwiftSignalKit import TelegramCore -import TelegramPresentationData -import TextFormat import AccountContext -import AlertUI -import PresentationDataUtils +import TelegramStringFormatting +import TelegramPresentationData import Markdown +import AlertUI + +public func giveawayInfoController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, message: EngineMessage, giveawayInfo: PremiumGiveawayInfo) -> ViewController? { + guard let giveaway = message.media.first(where: { $0 is TelegramMediaGiveaway }) as? TelegramMediaGiveaway else { + return nil + } + + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + var peerName = "" + if let peerId = giveaway.channelPeerIds.first, let peer = message.peers[peerId] { + peerName = EnginePeer(peer).compactDisplayTitle + } + + let untilDate = stringForDate(timestamp: giveaway.untilDate, strings: presentationData.strings) + + let title: String + let text: String + var warning: String? + + var dismissImpl: (() -> Void)? + + var actions: [TextAlertAction] = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: { + dismissImpl?() + })] + + switch giveawayInfo { + case let .ongoing(start, status): + let startDate = stringForDate(timestamp: start, strings: presentationData.strings) + + title = presentationData.strings.Chat_Giveaway_Info_Title + + let intro: String + if case .almostOver = status { + intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + } else { + intro = "The giveaway is sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + } + + let ending: String + if giveaway.flags.contains(.onlyNewSubscribers) { + if giveaway.channelPeerIds.count > 1 { + ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels after **\(startDate)**." + } else { + ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." + } + } else { + if giveaway.channelPeerIds.count > 1 { + ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels." + } else { + ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)**." + } + } + + var participation: String + switch status { + case .notQualified: + if giveaway.channelPeerIds.count > 1 { + participation = "To take part in this giveaway please join the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels) before **\(untilDate)**." + } else { + participation = "To take part in this giveaway please join the channel **\(peerName)** before **\(untilDate)**." + } + case let .notAllowed(reason): + switch reason { + case let .joinedTooEarly(joinedOn): + let joinDate = stringForDate(timestamp: joinedOn, strings: presentationData.strings) + participation = "You are not eligible to participate in this giveaway, because you joined this channel on **\(joinDate)**, which is before the contest started." + case let .channelAdmin(adminId): + let _ = adminId + participation = "You are not eligible to participate in this giveaway, because you are an admin of participating channel (**\(peerName)**)." + case let .disallowedCountry(countryCode): + let _ = countryCode + participation = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway." + } + case .participating: + if giveaway.channelPeerIds.count > 1 { + participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels)." + } else { + participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)**." + } + case .almostOver: + participation = presentationData.strings.Chat_Giveaway_Info_AlmostOver + } + + if !participation.isEmpty { + participation = "\n\n\(participation)" + } + + text = "\(intro)\n\n\(ending)\(participation)" + case let .finished(status, start, finish, _, activatedCount): + let startDate = stringForDate(timestamp: start, strings: presentationData.strings) + let finishDate = stringForDate(timestamp: finish, strings: presentationData.strings) + title = presentationData.strings.Chat_Giveaway_Info_EndedTitle + + let intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + + var ending: String + if giveaway.flags.contains(.onlyNewSubscribers) { + if giveaway.channelPeerIds.count > 1 { + ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** and other listed channels after **\(startDate)**." + } else { + ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." + } + } else { + if giveaway.channelPeerIds.count > 1 { + ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)** and other listed channels." + } else { + ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)**." + } + } + + if activatedCount > 0 { + ending += " " + presentationData.strings.Chat_Giveaway_Info_ActivatedLinks(activatedCount) + } + + var result: String + switch status { + case .refunded: + result = "" + warning = presentationData.strings.Chat_Giveaway_Info_Refunded + actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_Close, action: { + dismissImpl?() + })] + case .notWon: + result = "\n\n" + presentationData.strings.Chat_Giveaway_Info_DidntWin + case let .won(slug): + result = "\n\n" + presentationData.strings.Chat_Giveaway_Info_Won("🏆").string + let _ = slug + actions = [TextAlertAction(type: .defaultAction, title: presentationData.strings.Chat_Giveaway_Info_ViewPrize, action: { + dismissImpl?() + }), TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { + dismissImpl?() + })] + } + + text = "\(intro)\n\n\(ending)\(result)" + } + + let alertController = giveawayInfoAlertController( + context: context, + updatedPresentationData: updatedPresentationData, + title: title, + text: text, + warning: warning, + actions: actions + ) + dismissImpl = { [weak alertController] in + alertController?.dismissAnimated() + } + return alertController +} private final class GiveawayInfoAlertContentNode: AlertContentNode { private let title: String @@ -229,7 +378,7 @@ private final class GiveawayInfoAlertContentNode: AlertContentNode { } } -func giveawayInfoAlertController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, title: String, text: String, warning: String?, actions: [TextAlertAction]) -> AlertController { +private func giveawayInfoAlertController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal)? = nil, title: String, text: String, warning: String?, actions: [TextAlertAction]) -> AlertController { let presentationData = updatedPresentationData?.initial ?? context.sharedContext.currentPresentationData.with { $0 } let contentNode = GiveawayInfoAlertContentNode(theme: AlertControllerTheme(presentationData: presentationData), ptheme: presentationData.theme, title: title, text: text, warning: warning, actions: actions) diff --git a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift index 7c553d8ab9..43e9185b8d 100644 --- a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift @@ -186,8 +186,8 @@ public func PremiumBoostScreen( let controller = textAlertController( sharedContext: context.sharedContext, updatedPresentationData: nil, - title: "More Boosts Needed", - text: "To boost **\(peer.compactDisplayTitle)** again, gift **Telegram Premium** to a friend and get **\(premiumConfiguration.boostsPerGiftCount)** additional boosts.", + title: presentationData.strings.ChannelBoost_MoreBoosts_Title, + text: presentationData.strings.ChannelBoost_MoreBoosts_Text(peer.compactDisplayTitle, "\(premiumConfiguration.boostsPerGiftCount)").string, actions: [ TextAlertAction(type: .defaultAction, title: presentationData.strings.Common_OK, action: {}) ], diff --git a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift index 359dbbe29e..e0b8045319 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift @@ -22,6 +22,7 @@ import TelegramStringFormatting import UndoUI import InvisibleInkDustNode +//TODO:localize private final class PremiumGiftCodeSheetContent: CombinedComponent { typealias EnvironmentType = ViewControllerComponentContainer.Environment diff --git a/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift b/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift index 4091d712b8..b87262f2c0 100644 --- a/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift +++ b/submodules/PremiumUI/Sources/ReplaceBoostScreen.swift @@ -19,8 +19,6 @@ import PeerListItemComponent import TelegramStringFormatting import AvatarNode -//TODO:localize - private final class ReplaceBoostScreenComponent: CombinedComponent { typealias EnvironmentType = ViewControllerComponentContainer.Environment @@ -172,7 +170,7 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { if channelName.count > 48 { channelName = "\(channelName.prefix(48))..." } - let descriptionString = "To boost **\(channelName)**, reassign a previous boost or gift **Telegram Premium** to a friend to get **\(premiumConfiguration.boostsPerGiftCount)** additional boosts." + let descriptionString = strings.ReassignBoost_Description(channelName, "\(premiumConfiguration.boostsPerGiftCount)").string let description = description.update( component: MultilineTextComponent( @@ -204,11 +202,11 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { if let cooldownUntil = boost.cooldownUntil, cooldownUntil > state.currentTime { let duration = cooldownUntil - state.currentTime let durationValue = stringForDuration(duration, position: nil) - subtitle = "Available in \(durationValue)" + subtitle = strings.ReassignBoost_AvailableIn(durationValue).string isEnabled = false } else { let expiresValue = stringForDate(timestamp: boost.expires, strings: strings) - subtitle = "Boost expires on \(expiresValue)" + subtitle = strings.ReassignBoost_ExpiresOn(expiresValue).string } let accountContext = context.component.context @@ -245,7 +243,8 @@ private final class ReplaceBoostScreenComponent: CombinedComponent { selectedSlotsUpdated(state.selectedSlots) } else { let presentationData = accountContext.sharedContext.currentPresentationData.with { $0 } - let undoController = UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "Wait until the boost is available or get **3** more boosts by gifting a **Telegram Premium** subscription.", timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { _ in return true }) + + let undoController = UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: strings.ReassignBoost_WaitForCooldown("\(premiumConfiguration.boostsPerGiftCount)").string, timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { _ in return true }) presentController(undoController) } }) @@ -559,7 +558,7 @@ public class ReplaceBoostScreen: ViewController { let footerInsets = UIEdgeInsets(top: 0.0, left: layout.safeInsets.left, bottom: layout.intrinsicInsets.bottom, right: layout.safeInsets.right) transition.setFrame(view: self.footerView, frame: CGRect(origin: CGPoint(x: 0.0, y: -topInset), size: layout.size)) - self.footerHeight = self.footerView.update(size: layout.size, insets: footerInsets, theme: self.presentationData.theme, count: Int32(self.selectedSlots.count)) + self.footerHeight = self.footerView.update(size: layout.size, insets: footerInsets, theme: self.presentationData.theme, strings: self.presentationData.strings, count: Int32(self.selectedSlots.count)) if !hadLayout { self.updateFooterAlpha() @@ -838,9 +837,9 @@ public class ReplaceBoostScreen: ViewController { presentControllerImpl?(c) })) - self.title = "Reassign Boosts" + self.title = presentationData.strings.ReassignBoost_Title - self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: presentationData.strings.Common_Close, style: .plain, target: self, action: #selector(self.cancelPressed)) + self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: presentationData.strings.Common_Cancel, style: .plain, target: self, action: #selector(self.cancelPressed)) self.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .all, compactSize: .portrait) @@ -984,10 +983,10 @@ private final class FooterView: UIView { fileprivate var inProgress = false - private var currentLayout: (CGSize, UIEdgeInsets, PresentationTheme, Int32)? - func update(size: CGSize, insets: UIEdgeInsets, theme: PresentationTheme, count: Int32) -> CGFloat { + private var currentLayout: (CGSize, UIEdgeInsets, PresentationTheme, PresentationStrings, Int32)? + func update(size: CGSize, insets: UIEdgeInsets, theme: PresentationTheme, strings: PresentationStrings, count: Int32) -> CGFloat { let hadLayout = self.currentLayout != nil - self.currentLayout = (size, insets, theme, count) + self.currentLayout = (size, insets, theme, strings, count) self.backgroundNode.updateColor(color: theme.rootController.tabBar.backgroundColor, transition: .immediate) self.separatorView.backgroundColor = theme.rootController.tabBar.separatorColor @@ -1019,7 +1018,7 @@ private final class FooterView: UIView { content: AnyComponentWithIdentity( id: AnyHashable(0), component: AnyComponent(ButtonTextContentComponent( - text: "Reassign Boosts", + text: strings.ReassignBoost_ReassignBoosts, badge: Int(count), textColor: theme.list.itemCheckColors.foregroundColor, badgeBackground: theme.list.itemCheckColors.foregroundColor, @@ -1036,8 +1035,8 @@ private final class FooterView: UIView { return } self.inProgress = true - if let (size, insets, theme, count) = self.currentLayout { - let _ = self.update(size: size, insets: insets, theme: theme, count: count) + if let (size, insets, theme, strings, count) = self.currentLayout { + let _ = self.update(size: size, insets: insets, theme: theme, strings: strings, count: count) } self.action() } diff --git a/submodules/StatisticsUI/Sources/ChannelStatsController.swift b/submodules/StatisticsUI/Sources/ChannelStatsController.swift index 22e1f4084a..30fb591c75 100644 --- a/submodules/StatisticsUI/Sources/ChannelStatsController.swift +++ b/submodules/StatisticsUI/Sources/ChannelStatsController.swift @@ -554,15 +554,15 @@ private enum StatsEntry: ItemListNodeEntry { let expiresString: String let durationMonths = Int32(round(Float(boost.expires - boost.date) / (86400.0 * 30.0))) - let durationString = "\(durationMonths)m" - + let durationString = presentationData.strings.Stats_Boosts_ShortMonth("\(durationMonths)").string + let title: String let icon: GiftOptionItem.Icon var label: String? if boost.flags.contains(.isGiveaway) { - label = "🏆 Giveaway" + label = "🏆 \(presentationData.strings.Stats_Boosts_Giveaway)" } else if boost.flags.contains(.isGift) { - label = "🎁 Gift" + label = "🎁 \(presentationData.strings.Stats_Boosts_Gift)" } let color: GiftOptionItem.Icon.Color @@ -575,7 +575,7 @@ private enum StatsEntry: ItemListNodeEntry { } if boost.flags.contains(.isUnclaimed) { - title = "Unclaimed" + title = presentationData.strings.Stats_Boosts_Unclaimed icon = .image(color: color, name: "Premium/Unclaimed") expiresString = "\(durationString) • \(expiresValue)" } else if let peer = boost.peer { @@ -588,10 +588,10 @@ private enum StatsEntry: ItemListNodeEntry { } } else { if boost.flags.contains(.isUnclaimed) { - title = "Unclaimed" + title = presentationData.strings.Stats_Boosts_Unclaimed icon = .image(color: color, name: "Premium/Unclaimed") } else if boost.flags.contains(.isGiveaway) { - title = "To be distributed" + title = presentationData.strings.Stats_Boosts_ToBeDistributed icon = .image(color: color, name: "Premium/ToBeDistributed") } else { title = "Unknown" @@ -774,15 +774,14 @@ private func channelStatsControllerEntries(state: ChannelStatsControllerState, p entries.append(.boostOverviewTitle(presentationData.theme, presentationData.strings.Stats_Boosts_OverviewHeader)) entries.append(.boostOverview(presentationData.theme, boostData)) -//TODO:localize if !boostData.prepaidGiveaways.isEmpty { - entries.append(.boostPrepaidTitle(presentationData.theme, "PREPAID GIVEAWAYS")) + entries.append(.boostPrepaidTitle(presentationData.theme, presentationData.strings.Stats_Boosts_PrepaidGiveawaysTitle)) var i: Int32 = 0 for giveaway in boostData.prepaidGiveaways { - entries.append(.boostPrepaid(i, presentationData.theme, "\(giveaway.quantity) Telegram Premium", "\(giveaway.months)-month subscriptions", giveaway)) + entries.append(.boostPrepaid(i, presentationData.theme, presentationData.strings.Stats_Boosts_PrepaidGiveawayCount(giveaway.quantity), presentationData.strings.Stats_Boosts_PrepaidGiveawayMonths("\(giveaway.months)").string, giveaway)) i += 1 } - entries.append(.boostPrepaidInfo(presentationData.theme, "Select a giveaway you already paid for to set it up.")) + entries.append(.boostPrepaidInfo(presentationData.theme, presentationData.strings.Stats_Boosts_PrepaidGiveawaysInfo)) } let boostersTitle: String @@ -813,7 +812,7 @@ private func channelStatsControllerEntries(state: ChannelStatsControllerState, p } if boostsCount > 0 && giftsCount > 0 && boostsCount != giftsCount { - entries.append(.boosterTabs(presentationData.theme, "\(boostsCount) Boosts", "\(giftsCount) Gifts", state.giftsSelected)) + entries.append(.boosterTabs(presentationData.theme, presentationData.strings.Stats_Boosts_TabBoosts(boostsCount), presentationData.strings.Stats_Boosts_TabGifts(giftsCount), state.giftsSelected)) } let selectedState: ChannelBoostersContext.State? @@ -853,8 +852,8 @@ private func channelStatsControllerEntries(state: ChannelStatsControllerState, p entries.append(.boostLinkInfo(presentationData.theme, presentationData.strings.Stats_Boosts_LinkInfo)) if giveawayAvailable { - entries.append(.gifts(presentationData.theme, "Get Boosts via Gifts")) - entries.append(.giftsInfo(presentationData.theme, "Get more boosts for your channel by gifting Premium to your subscribers.")) + entries.append(.gifts(presentationData.theme, presentationData.strings.Stats_Boosts_GetBoosts)) + entries.append(.giftsInfo(presentationData.theme, presentationData.strings.Stats_Boosts_GetBoostsInfo)) } } } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift index c1adef884e..a66d96e2dc 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageGiftBubbleContentNode/Sources/ChatMessageGiftBubbleContentNode.swift @@ -189,7 +189,6 @@ public class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { } } - //TODO:localize override public func asyncLayoutContent() -> (_ item: ChatMessageBubbleContentItem, _ layoutConstants: ChatMessageItemLayoutConstants, _ preparePosition: ChatMessageBubblePreparePosition, _ messageSelection: Bool?, _ constrainedSize: CGSize, _ avatarInset: CGFloat) -> (ChatMessageBubbleContentProperties, unboundSize: CGSize?, maxWidth: CGFloat, layout: (CGSize, ChatMessageBubbleContentPosition) -> (CGFloat, (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation, Bool, ListViewItemApply?) -> Void))) { let makeLabelLayout = TextNode.asyncLayout(self.labelNode) let makeTitleLayout = TextNode.asyncLayout(self.titleNode) @@ -226,24 +225,24 @@ public class ChatMessageGiftBubbleContentNode: ChatMessageBubbleContentNode { textSpacing += 13.0 if unclaimed { - title = "Unclaimed Prize" + title = item.presentationData.strings.Notification_PremiumPrize_Unclaimed } else { - title = "Congratulations!" + title = item.presentationData.strings.Notification_PremiumPrize_Title } var peerName = "" if let channelId, let channel = item.message.peers[channelId] { peerName = EnginePeer(channel).compactDisplayTitle } if unclaimed { - text = "You have an unclaimed prize from a giveaway by **\(peerName)**.\n\nThis prize is a **Telegram Premium** subscription for **\(monthsValue)** months." + text = item.presentationData.strings.Notification_PremiumPrize_UnclaimedText(peerName, item.presentationData.strings.Notification_PremiumPrize_Months(monthsValue)).string } else if fromGiveaway { - text = "You won a prize in a giveaway organized by **\(peerName)**.\n\nYour prize is a **Telegram Premium** subscription for **\(monthsValue)** months." + text = item.presentationData.strings.Notification_PremiumPrize_GiveawayText(peerName, item.presentationData.strings.Notification_PremiumPrize_Months(monthsValue)).string } else { - text = "You've received a gift from **\(peerName)**.\n\nYour gift is a **Telegram Premium** subscription for **\(monthsValue)** months." + text = item.presentationData.strings.Notification_PremiumPrize_GiftText(peerName, item.presentationData.strings.Notification_PremiumPrize_Months(monthsValue)).string } months = monthsValue - buttonTitle = "Open Gift Link" + buttonTitle = item.presentationData.strings.Notification_PremiumPrize_View hasServiceMessage = false default: break diff --git a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift index c16977a4f9..c30cf65537 100644 --- a/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift +++ b/submodules/TelegramUI/Components/ShareWithPeersScreen/Sources/ShareWithPeersScreen.swift @@ -25,7 +25,6 @@ import TelegramUIPreferences import UndoUI import TelegramStringFormatting -//TODO:localize final class ShareWithPeersScreenComponent: Component { typealias EnvironmentType = ViewControllerComponentContainer.Environment @@ -941,9 +940,9 @@ final class ShareWithPeersScreenComponent: Component { sectionTitle = environment.strings.Story_Privacy_WhoCanViewHeader } else if section.id == 1 { if case .members = component.stateContext.subject { - sectionTitle = "SUBSCRIBERS" + sectionTitle = environment.strings.BoostGift_Subscribers_SectionTitle } else if case .channels = component.stateContext.subject { - sectionTitle = "CHANNELS" + sectionTitle = environment.strings.BoostGift_Channels_SectionTitle } else { sectionTitle = environment.strings.Story_Privacy_ContactsHeader } @@ -1390,7 +1389,7 @@ final class ShareWithPeersScreenComponent: Component { } else { if case .members = component.stateContext.subject { if let invitedAt = stateValue.invitedAt[peer.id] { - subtitle = "joined \(stringForMediumDate(timestamp: invitedAt, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat))" + subtitle = environment.strings.BoostGift_Subscribers_Joined(stringForMediumDate(timestamp: invitedAt, strings: environment.strings, dateTimeFormat: environment.dateTimeFormat)).string } else { subtitle = nil } @@ -1445,7 +1444,7 @@ final class ShareWithPeersScreenComponent: Component { self.hapticFeedback.error() let presentationData = component.context.sharedContext.currentPresentationData.with { $0 } - controller.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "You can select maximum \(component.context.userLimits.maxGiveawayChannelsCount) channels.", timeout: nil, customUndoText: nil), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current) + controller.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: environment.strings.BoostGift_Channels_MaximumReached("\(component.context.userLimits.maxGiveawayChannelsCount)").string, timeout: nil, customUndoText: nil), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current) return } if case .channels = component.stateContext.subject { @@ -1453,11 +1452,11 @@ final class ShareWithPeersScreenComponent: Component { let alertController = textAlertController( context: component.context, forceTheme: environment.theme, - title: "Channel is Private", - text: "Are you sure you want to add a private channel? Users won't be able to join it without an invite link.", + title: environment.strings.BoostGift_Channels_PrivateChannel_Title, + text: environment.strings.BoostGift_Channels_PrivateChannel_Text, actions: [ TextAlertAction(type: .genericAction, title: environment.strings.Common_Cancel, action: {}), - TextAlertAction(type: .defaultAction, title: "Add", action: { + TextAlertAction(type: .defaultAction, title: environment.strings.BoostGift_Channels_PrivateChannel_Add, action: { togglePeer() }) ] @@ -1475,7 +1474,7 @@ final class ShareWithPeersScreenComponent: Component { self.hapticFeedback.error() let presentationData = component.context.sharedContext.currentPresentationData.with { $0 } - controller.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "You can select maximum 10 subscribers.", timeout: nil, customUndoText: nil), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current) + controller.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: environment.strings.BoostGift_Subscribers_MaximumReached("\(10)").string, timeout: nil, customUndoText: nil), elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { _ in return false }), in: .current) return } togglePeer() @@ -2018,9 +2017,9 @@ final class ShareWithPeersScreenComponent: Component { let placeholder: String switch component.stateContext.subject { case .members: - placeholder = "Search Subscribers" + placeholder = environment.strings.BoostGift_Subscribers_Search case .channels: - placeholder = "Search Channels" + placeholder = environment.strings.BoostGift_Channels_Search case .chats: placeholder = environment.strings.Story_Privacy_SearchChats default: @@ -2367,13 +2366,13 @@ final class ShareWithPeersScreenComponent: Component { case .contactsSearch: title = "" case .members: - title = "Gift Premium" - actionButtonTitle = "Save Recipients" - subtitle = "select up to 10 subscribers" + title = environment.strings.BoostGift_Subscribers_Title + subtitle = environment.strings.BoostGift_Subscribers_Subtitle("\(10)").string + actionButtonTitle = environment.strings.BoostGift_Subscribers_Save case .channels: - title = "Add Channels" - actionButtonTitle = "Save Channels" - subtitle = "select up to \(component.context.userLimits.maxGiveawayChannelsCount) channels" + title = environment.strings.BoostGift_Channels_Title + subtitle = environment.strings.BoostGift_Channels_Subtitle("\(component.context.userLimits.maxGiveawayChannelsCount)").string + actionButtonTitle = environment.strings.BoostGift_Channels_Save } let titleComponent: AnyComponent diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaNavigationStripComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaNavigationStripComponent.swift index eaed466fe9..1fad133d46 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaNavigationStripComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/MediaNavigationStripComponent.swift @@ -180,8 +180,6 @@ final class MediaNavigationStripComponent: Component { let itemHeight: CGFloat = 2.0 let minItemWidth: CGFloat = 2.0 - var size = CGSize(width: availableSize.width, height: itemHeight) - var didSetCompletion = false var validIndices: [Int] = [] @@ -223,7 +221,6 @@ final class MediaNavigationStripComponent: Component { var itemFrame = CGRect(origin: CGPoint(x: -globalOffset + CGFloat(i) * (itemWidth + spacing), y: 0.0), size: CGSize(width: itemWidth, height: itemHeight)) if component.isSeeking { itemFrame = CGRect(origin: .zero, size: CGSize(width: availableSize.width, height: 6.0)) - size.height = itemFrame.height } if itemFrame.maxX < 0.0 || itemFrame.minX >= availableSize.width { continue diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift index cd9f452654..7f2e080d87 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryContainerScreen.swift @@ -546,6 +546,14 @@ private final class StoryContainerScreenComponent: Component { } self.initialSeekTimestamp = nil self.previousSeekTime = nil + + guard let stateValue = self.stateValue, let slice = stateValue.slice, let itemSetView = self.visibleItemSetViews[slice.peer.id], let itemSetComponentView = itemSetView.view.view as? StoryItemSetContainerComponent.View else { + return + } + guard let visibleItemView = itemSetComponentView.visibleItems[slice.item.storyItem.id]?.view.view as? StoryItemContentComponent.View else { + return + } + visibleItemView.seekEnded() } longPressRecognizer.shouldBegin = { [weak self] touch in guard let self else { diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift index b4f5af595d..197632cb9f 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryInteractionGuideComponent.swift @@ -95,12 +95,13 @@ final class StoryInteractionGuideComponent: Component { self.component = component self.state = state + let strings = component.strings + let sideInset: CGFloat = 48.0 -//TODO:localize let titleSize = self.titleLabel.update( transition: .immediate, - component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: "Watching Stories", font: Font.semibold(20.0), textColor: .white, paragraphAlignment: .center)))), + component: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: strings.Story_Guide_Title, font: Font.semibold(20.0), textColor: .white, paragraphAlignment: .center)))), environment: {}, containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: availableSize.height) ) @@ -114,7 +115,7 @@ final class StoryInteractionGuideComponent: Component { let textSize = self.descriptionLabel.update( transition: .immediate, - component: AnyComponent(BalancedTextComponent(text: .plain(NSAttributedString(string: "You can use these gestures to control playback.", font: Font.regular(15.0), textColor: UIColor(rgb: 0xffffff, alpha: 0.6), paragraphAlignment: .center)), maximumNumberOfLines: 0, lineSpacing: 0.2)), + component: AnyComponent(BalancedTextComponent(text: .plain(NSAttributedString(string: strings.Story_Guide_Description, font: Font.regular(15.0), textColor: UIColor(rgb: 0xffffff, alpha: 0.6), paragraphAlignment: .center)), maximumNumberOfLines: 0, lineSpacing: 0.2)), environment: {}, containerSize: CGSize(width: availableSize.width - sideInset * 2.0, height: availableSize.height) ) @@ -132,8 +133,8 @@ final class StoryInteractionGuideComponent: Component { component: AnyComponent( GuideItemComponent( context: component.context, - title: "Go forward", - text: "Tap the screen", + title: strings.Story_Guide_ForwardTitle, + text: strings.Story_Guide_ForwardDescription, animationName: "story_forward", isPlaying: self.currentIndex == 0, playbackCompleted: { [weak self] in @@ -151,8 +152,8 @@ final class StoryInteractionGuideComponent: Component { component: AnyComponent( GuideItemComponent( context: component.context, - title: "Pause and Seek", - text: "Hold and move sideways", + title: strings.Story_Guide_PauseTitle, + text: strings.Story_Guide_PauseDescription, animationName: "story_pause", isPlaying: self.currentIndex == 1, playbackCompleted: { [weak self] in @@ -170,8 +171,8 @@ final class StoryInteractionGuideComponent: Component { component: AnyComponent( GuideItemComponent( context: component.context, - title: "Go back", - text: "Tap the left edge", + title: strings.Story_Guide_BackTitle, + text: strings.Story_Guide_BackDescription, animationName: "story_back", isPlaying: self.currentIndex == 2, playbackCompleted: { [weak self] in @@ -189,8 +190,8 @@ final class StoryInteractionGuideComponent: Component { component: AnyComponent( GuideItemComponent( context: component.context, - title: "Move between stories", - text: "Swipe left or right", + title: strings.Story_Guide_MoveTitle, + text: strings.Story_Guide_MoveDescription, animationName: "story_move", isPlaying: self.currentIndex == 3, playbackCompleted: { [weak self] in @@ -222,7 +223,7 @@ final class StoryInteractionGuideComponent: Component { let buttonSize = self.proceedButton.update( transition: .immediate, component: AnyComponent(Button( - content: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: "Tap to keep watching", font: Font.semibold(17.0), textColor: .white, paragraphAlignment: .center)))), + content: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: strings.Story_Guide_Proceed, font: Font.semibold(17.0), textColor: .white, paragraphAlignment: .center)))), action: { [weak self] in self?.handleTap() } diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift index 40ec787d68..33a5a51fc0 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemContentComponent.swift @@ -277,7 +277,9 @@ final class StoryItemContentComponent: Component { } self.videoPlaybackStatus = status - self.updateVideoPlaybackProgress() + if !self.isSeeking { + self.updateVideoPlaybackProgress() + } }) } } @@ -360,7 +362,9 @@ final class StoryItemContentComponent: Component { } if case .file = self.currentMessageMedia { - self.updateVideoPlaybackProgress() + if !self.isSeeking { + self.updateVideoPlaybackProgress() + } } else { if !self.markedAsSeen { self.markedAsSeen = true @@ -536,6 +540,7 @@ final class StoryItemContentComponent: Component { ) } + private var isSeeking = false func seekTo(_ timestamp: Double, apply: Bool) { guard let videoNode = self.videoNode else { return @@ -543,8 +548,13 @@ final class StoryItemContentComponent: Component { if apply { videoNode.seek(timestamp) } + self.isSeeking = true self.updateVideoPlaybackProgress(timestamp) } + + func seekEnded() { + self.isSeeking = false + } func update(component: StoryItemContentComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment, transition: Transition) -> CGSize { let previousItem = self.component?.item diff --git a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift index ecdbe06690..53df5ab689 100644 --- a/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift +++ b/submodules/TelegramUI/Components/Stories/StoryContainerScreen/Sources/StoryItemSetContainerComponent.swift @@ -4710,7 +4710,7 @@ public final class StoryItemSetContainerComponent: Component { let seekLabelSize = self.seekLabel.update( transition: .immediate, - component: AnyComponent(Text(text: "Slide left or right to seek", font: Font.semibold(14.0), color: .white)), + component: AnyComponent(Text(text: component.strings.Story_SlideToSeek, font: Font.semibold(14.0), color: .white)), environment: {}, containerSize: availableSize ) diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 979a556a53..2e567d1c09 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -4787,17 +4787,16 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G case let .ongoing(_, status): switch status { case .notAllowed: - content = .info(title: nil, text: "You can't participate in this giveaway.", timeout: nil, customUndoText: "Learn More") + content = .info(title: nil, text: self.presentationData.strings.Chat_Giveaway_Toast_NotAllowed, timeout: nil, customUndoText: self.presentationData.strings.Chat_Giveaway_Toast_LearnMore) case .participating: - content = .succeed(text: "You are participating in this giveaway.", timeout: nil, customUndoText: "Learn More") + content = .succeed(text: self.presentationData.strings.Chat_Giveaway_Toast_Participating, timeout: nil, customUndoText: self.presentationData.strings.Chat_Giveaway_Toast_LearnMore) case .notQualified: - content = .info(title: nil, text: "You are not qualified for this giveaway yet.", timeout: nil, customUndoText: "Learn More") + content = .info(title: nil, text: self.presentationData.strings.Chat_Giveaway_Toast_NotQualified, timeout: nil, customUndoText: self.presentationData.strings.Chat_Giveaway_Toast_LearnMore) case .almostOver: - content = .info(title: nil, text: "The giveaway is almost over.", timeout: nil, customUndoText: "Learn More") + content = .info(title: nil, text: self.presentationData.strings.Chat_Giveaway_Toast_AlmostOver, timeout: nil, customUndoText: self.presentationData.strings.Chat_Giveaway_Toast_LearnMore) } - case let .finished(status, _, _, _, _): - let _ = status - content = .info(title: nil, text: "The giveaway is ended.", timeout: nil, customUndoText: "Learn More") + case .finished: + content = .info(title: nil, text: self.presentationData.strings.Chat_Giveaway_Toast_Ended, timeout: nil, customUndoText: self.presentationData.strings.Chat_Giveaway_Toast_LearnMore) } let controller = UndoOverlayController(presentationData: self.presentationData, content: content, elevatedLayout: false, position: .bottom, animateInAsReplacement: false, action: { [weak self] action in if case .undo = action, let self { @@ -19563,150 +19562,11 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G func displayGiveawayStatusInfo(messageId: EngineMessage.Id, giveawayInfo: PremiumGiveawayInfo) { let _ = (self.context.engine.data.get(TelegramEngine.EngineData.Item.Messages.Message(id: messageId)) |> deliverOnMainQueue).startStandalone(next: { [weak self] message in - guard let self, let message, let giveaway = message.media.first(where: { $0 is TelegramMediaGiveaway }) as? TelegramMediaGiveaway else { + guard let self, let message else { return } - var peerName = "" - if let peerId = giveaway.channelPeerIds.first, let peer = message.peers[peerId] { - peerName = EnginePeer(peer).compactDisplayTitle - } - - let untilDate = stringForDate(timestamp: giveaway.untilDate, strings: self.presentationData.strings) - - let title: String - let text: String - var warning: String? - - var dismissImpl: (() -> Void)? - - var actions: [TextAlertAction] = [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_OK, action: { - dismissImpl?() - })] - - switch giveawayInfo { - case let .ongoing(start, status): - let startDate = stringForDate(timestamp: start, strings: self.presentationData.strings) - - title = "About This Giveaway" - - let intro: String - if case .almostOver = status { - intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." - } else { - intro = "The giveaway is sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." - } - - let ending: String - if giveaway.flags.contains(.onlyNewSubscribers) { - if giveaway.channelPeerIds.count > 1 { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels after **\(startDate)**." - } else { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." - } - } else { - if giveaway.channelPeerIds.count > 1 { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels." - } else { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)**." - } - } - - var participation: String - switch status { - case .notQualified: - if giveaway.channelPeerIds.count > 1 { - participation = "To take part in this giveaway please join the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels) before **\(untilDate)**." - } else { - participation = "To take part in this giveaway please join the channel **\(peerName)** before **\(untilDate)**." - } - case let .notAllowed(reason): - switch reason { - case let .joinedTooEarly(joinedOn): - let joinDate = stringForDate(timestamp: joinedOn, strings: self.presentationData.strings) - participation = "You are not eligible to participate in this giveaway, because you joined this channel on **\(joinDate)**, which is before the contest started." - case let .channelAdmin(adminId): - let _ = adminId - participation = "You are not eligible to participate in this giveaway, because you are an admin of participating channel (**\(peerName)**)." - case let .disallowedCountry(countryCode): - let _ = countryCode - participation = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway." - } - case .participating: - if giveaway.channelPeerIds.count > 1 { - participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels)." - } else { - participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)**." - } - case .almostOver: - participation = "The giveaway is over, preparing results." - } - - if !participation.isEmpty { - participation = "\n\n\(participation)" - } - - text = "\(intro)\n\n\(ending)\(participation)" - case let .finished(status, start, finish, _, activatedCount): - let startDate = stringForDate(timestamp: start, strings: self.presentationData.strings) - let finishDate = stringForDate(timestamp: finish, strings: self.presentationData.strings) - title = "Giveaway Ended" - - let intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." - - var ending: String - if giveaway.flags.contains(.onlyNewSubscribers) { - if giveaway.channelPeerIds.count > 1 { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** and other listed channels after **\(startDate)**." - } else { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." - } - } else { - if giveaway.channelPeerIds.count > 1 { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)** and other listed channels." - } else { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)**." - } - } - - if activatedCount > 0 { - ending += " \(activatedCount) of the winners already used their gift links." - } - - var result: String - switch status { - case .refunded: - result = "" - warning = "The channel cancelled the prizes by reversing the payment for them." - actions = [TextAlertAction(type: .defaultAction, title: self.presentationData.strings.Common_Close, action: { - dismissImpl?() - })] - case .notWon: - result = "\n\nYou didn't win a prize in this giveaway." - case let .won(slug): - result = "\n\nYou won a prize in this giveaway. 🏆" - let _ = slug - actions = [TextAlertAction(type: .defaultAction, title: "View My Prize", action: { - dismissImpl?() - }), TextAlertAction(type: .genericAction, title: self.presentationData.strings.Common_Cancel, action: { - dismissImpl?() - })] - } - - text = "\(intro)\n\n\(ending)\(result)" - } - - let alertController = giveawayInfoAlertController( - context: self.context, - updatedPresentationData: self.updatedPresentationData, - title: title, - text: text, - warning: warning, - actions: actions - ) - self.present(alertController, in: .window(.root)) - - dismissImpl = { [weak alertController] in - alertController?.dismissAnimated() + if let controller = giveawayInfoController(context: self.context, updatedPresentationData: self.updatedPresentationData, message: message, giveawayInfo: giveawayInfo) { + self.present(controller, in: .window(.root)) } }) } From 2511c4a7731bea8018d092368b8469e192e1eca9 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 10:50:23 +0400 Subject: [PATCH 4/8] Update localization --- .../Telegram-iOS/en.lproj/Localizable.strings | 75 ++++++++++++++++--- .../Sources/GiveawayInfoController.swift | 43 ++++++----- .../Sources/PremiumBoostScreen.swift | 4 +- .../Sources/PremiumGiftCodeScreen.swift | 49 ++++++------ ...ChatMessageGiveawayBubbleContentNode.swift | 28 +++---- 5 files changed, 130 insertions(+), 69 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 6816843e53..29455f71cc 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10159,9 +10159,11 @@ Sorry for the inconvenience."; "ReassignBoost.ExpiresOn" = "Boost expires on %@"; "ReassignBoost.WaitForCooldown" = "Wait until the boost is available or get **%1$@** more boosts by gifting a **Telegram Premium** subscription."; -"ReassignBoost.Success" = "Wait until the boost is available or get **%1$@** more boosts by gifting a **Telegram Premium** subscription."; - -//"\(replacedBoosts) boosts are reassigned from \(inChannels) other channel." +"ReassignBoost.Success" = "%1$@ are reassigned from %2$@."; +"ReassignBoost.Boosts_1" = "%@ boost"; +"ReassignBoost.Boosts_any" = "%@ boosts"; +"ReassignBoost.OtherChannels_1" = "%@ other channel"; +"ReassignBoost.OtherChannels_any" = "%@ other channels"; "ChannelBoost.MoreBoosts.Title" = "More Boosts Needed"; "ChannelBoost.MoreBoosts.Text" = "To boost **%1$@** again, gift **Telegram Premium** to a friend and get **%2$@** additional boosts."; @@ -10269,24 +10271,36 @@ Sorry for the inconvenience."; "Chat.Giveaway.Info.Title" = "About This Giveaway"; "Chat.Giveaway.Info.EndedTitle" = "Giveaway Ended"; - "Chat.Giveaway.Info.AlmostOver" = "The giveaway is almost over."; - +"Chat.Giveaway.Info.OngoingIntro" = "The giveaway is sponsored by the admins of **%1$@**, who acquired %2$@ for %3$@ for its followers."; +"Chat.Giveaway.Info.OngoingNewMany" = "On **%1$@**, Telegram will automatically select %2$@ that joined **%3$@** and %4$@ after **%5$@**."; +"Chat.Giveaway.Info.OngoingNew" = "On **%1$@**, Telegram will automatically select %2$@ that joined **%3$@** after **%4$@**."; +"Chat.Giveaway.Info.OngoingMany" = "On **%1$@**, Telegram will automatically select %2$@ of **%3$@** and %4$@."; +"Chat.Giveaway.Info.Ongoing" = "On **%1$@**, Telegram will automatically select %2$@ of **%3$@**."; +"Chat.Giveaway.Info.EndedIntro" = "The giveaway was sponsored by the admins of **%1$@**, who acquired %2$@ for %3$@ for its followers."; +"Chat.Giveaway.Info.EndedNewMany" = "On **%1$@**, Telegram automatically selected %2$@ that joined **%3$@** and other listed channels after **%4$@**."; +"Chat.Giveaway.Info.EndedNew" = "On **%1$@**, Telegram automatically selected %2$@ that joined **%3$@** after **%4$@**."; +"Chat.Giveaway.Info.EndedMany" = "On **%1$@**, Telegram automatically selected %2$@ of **%3$@** and other listed channels."; +"Chat.Giveaway.Info.Ended" = "On **%1$@**, Telegram automatically selected %2$@ of **%3$@**."; +"Chat.Giveaway.Info.NotAllowedJoinedEarly" = "You are not eligible to participate in this giveaway, because you joined this channel on **%@**, which is before the contest started."; +"Chat.Giveaway.Info.NotAllowedAdmin" = "You are not eligible to participate in this giveaway, because you are an admin of participating channel (**%@**)."; +"Chat.Giveaway.Info.NotAllowedCountry" = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway."; +"Chat.Giveaway.Info.NotQualified" = "To take part in this giveaway please join the channel **%1$@** before **%2$@**."; +"Chat.Giveaway.Info.NotQualifiedMany" = "To take part in this giveaway please join the channel **%1$@** (and %2$@) before **%3$@**."; +"Chat.Giveaway.Info.Participating" = "You are participating in this giveaway, because you have joined the channel **%1$@**."; +"Chat.Giveaway.Info.ParticipatingMany" = "You are participating in this giveaway, because you have joined the channel **%1$@** (and %2$@)."; +"Chat.Giveaway.Info.OtherChannels_1" = "**%@** other listed channel"; +"Chat.Giveaway.Info.OtherChannels_any" = "**%@** other listed channels"; "Chat.Giveaway.Info.Subscriptions_1" = "**%@ Telegram Premium** subscription"; "Chat.Giveaway.Info.Subscriptions_any" = "**%@ Telegram Premium** subscriptions"; - "Chat.Giveaway.Info.RandomUsers_1" = "**%@** random user"; "Chat.Giveaway.Info.RandomUsers_any" = "**%@** random user"; - "Chat.Giveaway.Info.RandomSubscribers_1" = "**%@** random subscriber"; "Chat.Giveaway.Info.RandomSubscribers_any" = "**%@** random subscribers"; - "Chat.Giveaway.Info.Months_1" = "**%@** month"; "Chat.Giveaway.Info.Months_any" = "**%@** months"; - "Chat.Giveaway.Info.ActivatedLinks_1" = "%@ winner already used their gift link."; "Chat.Giveaway.Info.ActivatedLinks_any" = "%@ of the winners already used their gift links."; - "Chat.Giveaway.Info.Refunded" = "The channel cancelled the prizes by reversing the payment for them."; "Chat.Giveaway.Info.Won" = "You won a prize in this giveaway. %@"; "Chat.Giveaway.Info.DidntWin" = "You didn't win a prize in this giveaway."; @@ -10298,3 +10312,44 @@ Sorry for the inconvenience."; "Chat.Giveaway.Toast.AlmostOver" = "The giveaway is almost over."; "Chat.Giveaway.Toast.Ended" = "The giveaway is ended."; "Chat.Giveaway.Toast.LearnMore" = "Learn More"; + +"Chat.Giveaway.Message.PrizeTitle" = "Giveaway Prizes"; +"Chat.Giveaway.Message.PrizeText" = "%1$@ for %2$@."; +"Chat.Giveaway.Message.Subscriptions_1" = "**%@** Telegram Premium Subscription"; +"Chat.Giveaway.Message.Subscriptions_many" = "**%@** Telegram Premium Subscriptions"; +"Chat.Giveaway.Message.Months_1" = "**%@** month"; +"Chat.Giveaway.Message.Months_many" = "**%@** months"; +"Chat.Giveaway.Message.ParticipantsTitle" = "Participants"; +"Chat.Giveaway.Message.ParticipantsNewMany" = "All users who join the channels below after this date:"; +"Chat.Giveaway.Message.ParticipantsNew" = "All users who join this channel after this date:"; +"Chat.Giveaway.Message.ParticipantsMany" = "All subscribers of the channels below:"; +"Chat.Giveaway.Message.Participants" = "All subscribers of this channel:"; +"Chat.Giveaway.Message.CountriesFrom" = "from %@"; +"Chat.Giveaway.Message.CountriesDelimiter" = ", "; +"Chat.Giveaway.Message.CountriesLastDelimiter" = " and "; +"Chat.Giveaway.Message.DateTitle" = "Winners Selection Date"; +"Chat.Giveaway.Message.LearnMore" = "LEARN MORE"; + +"GiftLink.Title" = "Gift Link"; +"GiftLink.UsedTitle" = "Used Gift Link"; +"GiftLink.Description" = "This link allows you to activate a **Telegram Premium** subscription."; +"GiftLink.UsedDescription" = "This link was used to activate a **Telegram Premium** subscription."; +"GiftLink.PersonalDescription" = "This link allows **%@** to activate a **Telegram Premium** subscription."; +"GiftLink.PersonalUsedDescription" = "This link allowed **%@** to activate a **Telegram Premium** subscription."; +"GiftLink.UnclaimedDescription" = "This link allows to activate a **Telegram Premium** subscription."; +"GiftLink.Footer" = "You can also [send this link]() to a friend as a gift."; +"GiftLink.UsedFooter" = "This link was used on %@."; +"GiftLink.NotUsedFooter" = "This link hasn't been used yet."; +"GiftLink.UseLink" = "Use Link"; +"GiftLink.Gift" = "Gift"; +"GiftLink.From" = "From"; +"GiftLink.To" = "To"; +"GiftLink.Reason" = "Reason"; +"GiftLink.Reason.Giveaway" = "Giveaway"; +"GiftLink.Reason.Gift" = "You were selected by the channel"; +"GiftLink.Reason.Unclaimed" = "Incomplete Giveaway"; +"GiftLink.Date" = "Date"; +"GiftLink.NoRecipient" = "No recipient"; +"GiftLink.TelegramPremium_1" = "Telegram Premium for %@ month"; +"GiftLink.TelegramPremium_any" = "Telegram Premium for %@ months"; +"GiftLink.LinkHidden" = "Only the recipient can see the link."; diff --git a/submodules/PremiumUI/Sources/GiveawayInfoController.swift b/submodules/PremiumUI/Sources/GiveawayInfoController.swift index 63f22ffc38..7254a63fe7 100644 --- a/submodules/PremiumUI/Sources/GiveawayInfoController.swift +++ b/submodules/PremiumUI/Sources/GiveawayInfoController.swift @@ -42,23 +42,25 @@ public func giveawayInfoController(context: AccountContext, updatedPresentationD let intro: String if case .almostOver = status { - intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + intro = presentationData.strings.Chat_Giveaway_Info_EndedIntro(peerName, presentationData.strings.Chat_Giveaway_Info_Subscriptions(giveaway.quantity), presentationData.strings.Chat_Giveaway_Info_Months(giveaway.months)).string } else { - intro = "The giveaway is sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + intro = presentationData.strings.Chat_Giveaway_Info_OngoingIntro(peerName, presentationData.strings.Chat_Giveaway_Info_Subscriptions(giveaway.quantity), presentationData.strings.Chat_Giveaway_Info_Months(giveaway.months)).string } let ending: String if giveaway.flags.contains(.onlyNewSubscribers) { + let randomUsers = presentationData.strings.Chat_Giveaway_Info_RandomUsers(giveaway.quantity) if giveaway.channelPeerIds.count > 1 { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels after **\(startDate)**." + ending = presentationData.strings.Chat_Giveaway_Info_OngoingNewMany(untilDate, randomUsers, peerName, presentationData.strings.Chat_Giveaway_Info_OtherChannels(Int32(giveaway.channelPeerIds.count - 1)), startDate).string } else { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." + ending = presentationData.strings.Chat_Giveaway_Info_OngoingNew(untilDate, randomUsers, peerName, startDate).string } } else { + let randomSubscribers = presentationData.strings.Chat_Giveaway_Info_RandomSubscribers(giveaway.quantity) if giveaway.channelPeerIds.count > 1 { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)** and **\(giveaway.channelPeerIds.count - 1)** other listed channels." + ending = presentationData.strings.Chat_Giveaway_Info_OngoingMany(untilDate, randomSubscribers, peerName, presentationData.strings.Chat_Giveaway_Info_OtherChannels(Int32(giveaway.channelPeerIds.count - 1))).string } else { - ending = "On **\(untilDate)**, Telegram will automatically select **\(giveaway.quantity)** random subscribers of **\(peerName)**." + ending = presentationData.strings.Chat_Giveaway_Info_Ongoing(untilDate, randomSubscribers, peerName).string } } @@ -66,27 +68,26 @@ public func giveawayInfoController(context: AccountContext, updatedPresentationD switch status { case .notQualified: if giveaway.channelPeerIds.count > 1 { - participation = "To take part in this giveaway please join the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels) before **\(untilDate)**." + participation = presentationData.strings.Chat_Giveaway_Info_NotQualifiedMany(peerName, presentationData.strings.Chat_Giveaway_Info_OtherChannels(Int32(giveaway.channelPeerIds.count - 1)), untilDate).string } else { - participation = "To take part in this giveaway please join the channel **\(peerName)** before **\(untilDate)**." + participation = presentationData.strings.Chat_Giveaway_Info_NotQualified(peerName, untilDate).string } case let .notAllowed(reason): switch reason { case let .joinedTooEarly(joinedOn): let joinDate = stringForDate(timestamp: joinedOn, strings: presentationData.strings) - participation = "You are not eligible to participate in this giveaway, because you joined this channel on **\(joinDate)**, which is before the contest started." + participation = presentationData.strings.Chat_Giveaway_Info_NotAllowedJoinedEarly(joinDate).string case let .channelAdmin(adminId): let _ = adminId - participation = "You are not eligible to participate in this giveaway, because you are an admin of participating channel (**\(peerName)**)." - case let .disallowedCountry(countryCode): - let _ = countryCode - participation = "You are not eligible to participate in this giveaway, because your country is not included in the terms of the giveaway." + participation = presentationData.strings.Chat_Giveaway_Info_NotAllowedAdmin(peerName).string + case .disallowedCountry: + participation = presentationData.strings.Chat_Giveaway_Info_NotAllowedCountry } case .participating: if giveaway.channelPeerIds.count > 1 { - participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)** (**\(giveaway.channelPeerIds.count - 1)** other listed channels)." + participation = presentationData.strings.Chat_Giveaway_Info_ParticipatingMany(peerName, presentationData.strings.Chat_Giveaway_Info_OtherChannels(Int32(giveaway.channelPeerIds.count - 1))).string } else { - participation = "You are participating in this giveaway, because you have joined the channel **\(peerName)**." + participation = presentationData.strings.Chat_Giveaway_Info_Participating(peerName).string } case .almostOver: participation = presentationData.strings.Chat_Giveaway_Info_AlmostOver @@ -102,20 +103,22 @@ public func giveawayInfoController(context: AccountContext, updatedPresentationD let finishDate = stringForDate(timestamp: finish, strings: presentationData.strings) title = presentationData.strings.Chat_Giveaway_Info_EndedTitle - let intro = "The giveaway was sponsored by the admins of **\(peerName)**, who acquired **\(giveaway.quantity) Telegram Premium** subscriptions for **\(giveaway.months)** months for its followers." + let intro = presentationData.strings.Chat_Giveaway_Info_EndedIntro(peerName, presentationData.strings.Chat_Giveaway_Info_Subscriptions(giveaway.quantity), presentationData.strings.Chat_Giveaway_Info_Months(giveaway.months)).string var ending: String if giveaway.flags.contains(.onlyNewSubscribers) { + let randomUsers = presentationData.strings.Chat_Giveaway_Info_RandomUsers(giveaway.quantity) if giveaway.channelPeerIds.count > 1 { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** and other listed channels after **\(startDate)**." + ending = presentationData.strings.Chat_Giveaway_Info_EndedNewMany(finishDate, randomUsers, peerName, startDate).string } else { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random users that joined **\(peerName)** after **\(startDate)**." + ending = presentationData.strings.Chat_Giveaway_Info_EndedNew(finishDate, randomUsers, peerName, startDate).string } } else { + let randomSubscribers = presentationData.strings.Chat_Giveaway_Info_RandomSubscribers(giveaway.quantity) if giveaway.channelPeerIds.count > 1 { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)** and other listed channels." + ending = presentationData.strings.Chat_Giveaway_Info_EndedMany(finishDate, randomSubscribers, peerName).string } else { - ending = "On **\(finishDate)**, Telegram automatically selected **\(giveaway.quantity)** random subscribers of **\(peerName)**." + ending = presentationData.strings.Chat_Giveaway_Info_Ended(finishDate, randomSubscribers, peerName).string } } diff --git a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift index 43e9185b8d..092dce39ce 100644 --- a/submodules/PremiumUI/Sources/PremiumBoostScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumBoostScreen.swift @@ -8,8 +8,6 @@ import TelegramPresentationData import UndoUI import PresentationDataUtils -//TODO:localize - private struct BoostState { let level: Int32 let currentLevelBoosts: Int32 @@ -106,7 +104,7 @@ public func PremiumBoostScreen( Queue.mainQueue().after(0.3) { let presentationData = context.sharedContext.currentPresentationData.with { $0 } - let undoController = UndoOverlayController(presentationData: presentationData, content: .image(image: generateTintedImage(image: UIImage(bundleImageName: "Premium/BoostReplaceIcon"), color: .white)!, title: nil, text: "\(replacedBoosts) boosts are reassigned from \(inChannels) other channel.", round: false, undoText: nil), elevatedLayout: false, position: .bottom, action: { _ in return true }) + let undoController = UndoOverlayController(presentationData: presentationData, content: .image(image: generateTintedImage(image: UIImage(bundleImageName: "Premium/BoostReplaceIcon"), color: .white)!, title: nil, text: presentationData.strings.ReassignBoost_Success(presentationData.strings.ReassignBoost_Boosts(replacedBoosts), presentationData.strings.ReassignBoost_OtherChannels(inChannels)).string, round: false, undoText: nil), elevatedLayout: false, position: .bottom, action: { _ in return true }) controller.present(undoController, in: .current) } } diff --git a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift index e0b8045319..2483913cea 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift @@ -22,7 +22,6 @@ import TelegramStringFormatting import UndoUI import InvisibleInkDustNode -//TODO:localize private final class PremiumGiftCodeSheetContent: CombinedComponent { typealias EnvironmentType = ViewControllerComponentContainer.Environment @@ -188,15 +187,15 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { gloss = !giftCode.isUsed if let usedDate = giftCode.usedDate { let dateString = stringForMediumDate(timestamp: usedDate, strings: strings, dateTimeFormat: dateTimeFormat) - titleText = "Used Gift Link" - descriptionText = "This link was used to activate a **Telegram Premium** subscription." - additionalText = "This link was used on \(dateString)." + titleText = strings.GiftLink_UsedTitle + descriptionText = strings.GiftLink_UsedDescription + additionalText = strings.GiftLink_UsedFooter(dateString).string buttonText = strings.Common_OK } else { - titleText = "Gift Link" - descriptionText = "This link allows you to activate a **Telegram Premium** subscription." - additionalText = "You can also [send this link]() to a friend as a gift." - buttonText = "Use Link" + titleText = strings.GiftLink_Title + descriptionText = strings.GiftLink_Description + additionalText = strings.GiftLink_Footer + buttonText = strings.GiftLink_UseLink } link = "https://t.me/giftcode/\(giftCode.slug)" date = giftCode.date @@ -209,16 +208,20 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { } months = giftCode.months case let .boost(channelId, boost): - titleText = "Gift Link" + titleText = strings.GiftLink_Title if let peer = boost.peer, !boost.flags.contains(.isUnclaimed) { toPeer = boost.peer - descriptionText = "This link allows \(peer.compactDisplayTitle) to activate a **Telegram Premium** subscription." + if boost.slug == nil { + descriptionText = strings.GiftLink_PersonalDescription(peer.compactDisplayTitle).string + } else { + descriptionText = strings.GiftLink_PersonalUsedDescription(peer.compactDisplayTitle).string + } } else { toPeer = nil - descriptionText = "This link allows to activate a **Telegram Premium** subscription." + descriptionText = strings.GiftLink_UnclaimedDescription } if boost.slug == nil { - additionalText = "This link hasn't been used yet." + additionalText = strings.GiftLink_NotUsedFooter } else { additionalText = "" } @@ -293,7 +296,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { tableItems.append(.init( id: "from", - title: "From", + title: strings.GiftLink_From, component: AnyComponent( Button( content: AnyComponent(PeerCellComponent(context: context.component.context, textColor: tableLinkColor, peer: fromPeer)), @@ -311,7 +314,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { if let toPeer { tableItems.append(.init( id: "to", - title: "To", + title: strings.GiftLink_To, component: AnyComponent( Button( content: AnyComponent(PeerCellComponent(context: context.component.context, textColor: tableLinkColor, peer: toPeer)), @@ -329,16 +332,16 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { } else if toPeerId == nil { tableItems.append(.init( id: "to", - title: "To", + title: strings.GiftLink_To, component: AnyComponent( - MultilineTextComponent(text: .plain(NSAttributedString(string: "No recipient", font: tableFont, textColor: tableTextColor))) + MultilineTextComponent(text: .plain(NSAttributedString(string: strings.GiftLink_NoRecipient, font: tableFont, textColor: tableTextColor))) ) )) } - let giftTitle = "Telegram Premium for \(months) months" + let giftTitle = strings.GiftLink_TelegramPremium(months) tableItems.append(.init( id: "gift", - title: "Gift", + title: strings.GiftLink_Gift, component: AnyComponent( MultilineTextComponent(text: .plain(NSAttributedString(string: giftTitle, font: tableFont, textColor: tableTextColor))) ) @@ -347,13 +350,13 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { if case let .giftCode(giftCode) = component.subject { let giftReason: String if giftCode.toPeerId == nil { - giftReason = "Incomplete Giveaway" + giftReason = strings.GiftLink_Reason_Unclaimed } else { - giftReason = giftCode.isGiveaway ? "Giveaway" : "You were selected by the channel" + giftReason = giftCode.isGiveaway ? strings.GiftLink_Reason_Giveaway : strings.GiftLink_Reason_Gift } tableItems.append(.init( id: "reason", - title: "Reason", + title: strings.GiftLink_Reason, component: AnyComponent( Button( content: AnyComponent(MultilineTextComponent(text: .plain(NSAttributedString(string: giftReason, font: tableFont, textColor: giftCode.messageId != nil ? tableLinkColor : tableTextColor)))), @@ -372,7 +375,7 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { } tableItems.append(.init( id: "date", - title: "Date", + title: strings.GiftLink_Date, component: AnyComponent( MultilineTextComponent(text: .plain(NSAttributedString(string: stringForMediumDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat), font: tableFont, textColor: tableTextColor))) ) @@ -659,7 +662,7 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { self.dismissAllTooltips() let presentationData = context.sharedContext.currentPresentationData.with { $0 } - self.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: "Only the recipient can see the code.", timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { _ in return true }), in: .window(.root)) + self.present(UndoOverlayController(presentationData: presentationData, content: .info(title: nil, text: presentationData.strings.GiftLink_LinkHidden, timeout: nil, customUndoText: nil), elevatedLayout: false, position: .top, action: { _ in return true }), in: .window(.root)) } } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageGiveawayBubbleContentNode/Sources/ChatMessageGiveawayBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageGiveawayBubbleContentNode/Sources/ChatMessageGiveawayBubbleContentNode.swift index b97e35b692..cb047d5613 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageGiveawayBubbleContentNode/Sources/ChatMessageGiveawayBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageGiveawayBubbleContentNode/Sources/ChatMessageGiveawayBubbleContentNode.swift @@ -222,11 +222,13 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode let badgeString = NSAttributedString(string: "X\(giveaway?.quantity ?? 1)", font: Font.with(size: 10.0, design: .round , weight: .bold, traits: .monospacedNumbers), textColor: .white) -//TODO:localize - let prizeTitleString = NSAttributedString(string: "Giveaway Prizes", font: titleFont, textColor: textColor) + let prizeTitleString = NSAttributedString(string: item.presentationData.strings.Chat_Giveaway_Message_PrizeTitle, font: titleFont, textColor: textColor) var prizeTextString: NSAttributedString? if let giveaway { - prizeTextString = parseMarkdownIntoAttributedString("**\(giveaway.quantity)** Telegram Premium Subscriptions for **\(giveaway.months)** months.", attributes: MarkdownAttributes( + prizeTextString = parseMarkdownIntoAttributedString(item.presentationData.strings.Chat_Giveaway_Message_PrizeText( + item.presentationData.strings.Chat_Giveaway_Message_Subscriptions(giveaway.quantity), + item.presentationData.strings.Chat_Giveaway_Message_Months(giveaway.months) + ).string, attributes: MarkdownAttributes( body: MarkdownAttributeSet(font: textFont, textColor: textColor), bold: MarkdownAttributeSet(font: boldTextFont, textColor: textColor), link: MarkdownAttributeSet(font: textFont, textColor: textColor), @@ -236,22 +238,22 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode ), textAlignment: .center) } - let participantsTitleString = NSAttributedString(string: "Participants", font: titleFont, textColor: textColor) + let participantsTitleString = NSAttributedString(string: item.presentationData.strings.Chat_Giveaway_Message_ParticipantsTitle, font: titleFont, textColor: textColor) let participantsText: String let countriesText: String if let giveaway { if giveaway.flags.contains(.onlyNewSubscribers) { if giveaway.channelPeerIds.count > 1 { - participantsText = "All users who join the channels below after this date:" + participantsText = item.presentationData.strings.Chat_Giveaway_Message_ParticipantsNewMany } else { - participantsText = "All users who join this channel after this date:" + participantsText = item.presentationData.strings.Chat_Giveaway_Message_ParticipantsNew } } else { if giveaway.channelPeerIds.count > 1 { - participantsText = "All subscribers of the channels below:" + participantsText = item.presentationData.strings.Chat_Giveaway_Message_ParticipantsMany } else { - participantsText = "All subscribers of this channel:" + participantsText = item.presentationData.strings.Chat_Giveaway_Message_Participants } } if !giveaway.countries.isEmpty { @@ -270,13 +272,13 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode for i in 0 ..< countryNames.count { countries.append(countryNames[i]) if i == countryNames.count - 2 { - countries.append(" and ") + countries.append(item.presentationData.strings.Chat_Giveaway_Message_CountriesLastDelimiter) } else if i < countryNames.count - 2 { - countries.append(", ") + countries.append(item.presentationData.strings.Chat_Giveaway_Message_CountriesDelimiter) } } } - countriesText = "from \(countries)" + countriesText = item.presentationData.strings.Chat_Giveaway_Message_CountriesFrom(countries).string } else { countriesText = "" } @@ -289,7 +291,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode let countriesTextString = NSAttributedString(string: countriesText, font: textFont, textColor: textColor) - let dateTitleString = NSAttributedString(string: "Winners Selection Date", font: titleFont, textColor: textColor) + let dateTitleString = NSAttributedString(string: item.presentationData.strings.Chat_Giveaway_Message_DateTitle, font: titleFont, textColor: textColor) var dateTextString: NSAttributedString? if let giveaway { dateTextString = NSAttributedString(string: stringForFullDate(timestamp: giveaway.untilDate, strings: item.presentationData.strings, dateTimeFormat: item.presentationData.dateTimeFormat), font: textFont, textColor: textColor) @@ -392,7 +394,7 @@ public class ChatMessageGiveawayBubbleContentNode: ChatMessageBubbleContentNode titleColor = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor } - let (buttonWidth, continueLayout) = makeButtonLayout(constrainedSize.width, nil, false, "LEARN MORE", titleColor, false, true) + let (buttonWidth, continueLayout) = makeButtonLayout(constrainedSize.width, nil, false, item.presentationData.strings.Chat_Giveaway_Message_LearnMore.uppercased(), titleColor, false, true) let months = giveaway?.months ?? 0 let animationName: String From c444628fbeeec37cd04a4f41f6b29fa9ed0cdb03 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 12:32:54 +0400 Subject: [PATCH 5/8] Name color improvements --- .../Sources/AccountContext.swift | 134 ++++++++++++++++++ .../Themes/ThemeSettingsController.swift | 7 +- .../SyncCore/SyncCore_CachedUserData.swift | 52 +++++-- .../Sources/Utils/PeerUtils.swift | 12 +- .../Sources/PeerNameColor.swift | 42 ------ .../Sources/ChatInputTextNode.swift | 1 + .../ChatMessageAttachedContentNode.swift | 14 +- .../Sources/ChatMessageBubbleItemNode.swift | 33 +++-- .../Sources/ChatMessageForwardInfoNode.swift | 8 +- .../Sources/ChatMessageReplyInfoNode.swift | 10 +- .../ChatMessageTextBubbleContentNode.swift | 24 ++-- .../MessageInlineBlockBackgroundView.swift | 85 +++++++++-- .../Sources/PeerNameColorItem.swift | 75 ++++++---- .../Sources/PeerNameColorScreen.swift | 25 ++-- .../TelegramUI/Sources/AccountContext.swift | 23 ++- .../TelegramUI/Sources/ChatController.swift | 2 +- .../Sources/PeerInfo/PeerInfoScreen.swift | 3 +- 17 files changed, 394 insertions(+), 156 deletions(-) delete mode 100644 submodules/TelegramPresentationData/Sources/PeerNameColor.swift diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index f140b6eae9..b3e1baf464 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -1044,6 +1044,7 @@ public protocol AccountContext: AnyObject { var isPremium: Bool { get } var userLimits: EngineConfiguration.UserLimits { get } + var peerNameColors: PeerNameColors { get } var imageCache: AnyObject? { get } @@ -1200,3 +1201,136 @@ public struct StickersSearchConfiguration { } } } + +public class PeerNameColors: Equatable { + public struct Colors: Equatable { + public let main: UIColor + public let secondary: UIColor? + public let tertiary: UIColor? + + init(main: UIColor, secondary: UIColor?, tertiary: UIColor?) { + self.main = main + self.secondary = secondary + self.tertiary = tertiary + } + + init(main: UIColor) { + self.main = main + self.secondary = nil + self.tertiary = nil + } + + init?(colors: [UIColor]) { + guard let first = colors.first else { + return nil + } + self.main = first + if colors.count == 3 { + self.secondary = colors[1] + self.tertiary = colors[2] + } else if colors.count == 2, let second = colors.last { + self.secondary = second + self.tertiary = nil + } else { + self.secondary = nil + self.tertiary = nil + } + } + } + + public static var defaultSingleColors: [Int32: Colors] { + return [ + 0: Colors(main: UIColor(rgb: 0xcc5049)), + 1: Colors(main: UIColor(rgb: 0xd67722)), + 2: Colors(main: UIColor(rgb: 0x955cdb)), + 3: Colors(main: UIColor(rgb: 0x40a920)), + 4: Colors(main: UIColor(rgb: 0x309eba)), + 5: Colors(main: UIColor(rgb: 0x368ad1)), + 6: Colors(main: UIColor(rgb: 0xc7508b)) + ] + } + + public static var defaultValue: PeerNameColors { + return PeerNameColors( + colors: defaultSingleColors, + darkColors: [:], + displayOrder: [5, 3, 1, 0, 2, 4, 6] + ) + } + + public let colors: [Int32: Colors] + public let darkColors: [Int32: Colors] + public let displayOrder: [Int32] + + public func get(_ color: PeerNameColor) -> Colors { + if let colors = self.colors[color.rawValue] { + return colors + } else { + return PeerNameColors.defaultSingleColors[5]! + } + } + + fileprivate init(colors: [Int32: Colors], darkColors: [Int32: Colors], displayOrder: [Int32]) { + self.colors = colors + self.darkColors = darkColors + self.displayOrder = displayOrder + } + + public static func with(appConfiguration: AppConfiguration) -> PeerNameColors { + if let data = appConfiguration.data { + var colors = PeerNameColors.defaultSingleColors + var darkColors: [Int32: Colors] = [:] + + if let peerColors = data["peer_colors"] as? [String: [Double]] { + for (key, values) in peerColors { + if let index = Int32(key) { + let colorsArray = values.map { UIColor(rgb: UInt32($0)) } + if let colorValues = Colors(colors: colorsArray) { + colors[index] = colorValues + } + } + } + } + + if let darkPeerColors = data["dark_peer_colors"] as? [String: [Double]] { + for (key, values) in darkPeerColors { + if let index = Int32(key) { + let colorsArray = values.map { UIColor(rgb: UInt32($0)) } + if let colorValues = Colors(colors: colorsArray) { + darkColors[index] = colorValues + } + } + } + } + + var displayOrder: [Int32] = [] + if let order = data["peer_colors_available"] as? [Double] { + displayOrder = order.map { Int32($0) } + } + if displayOrder.isEmpty { + displayOrder = PeerNameColors.defaultValue.displayOrder + } + + return PeerNameColors( + colors: colors, + darkColors: darkColors, + displayOrder: displayOrder + ) + } else { + return .defaultValue + } + } + + public static func == (lhs: PeerNameColors, rhs: PeerNameColors) -> Bool { + if lhs.colors != rhs.colors { + return false + } + if lhs.darkColors != rhs.darkColors { + return false + } + if lhs.displayOrder != rhs.displayOrder { + return false + } + return true + } +} diff --git a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift index e9f42e8d7d..81a873fc87 100644 --- a/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift +++ b/submodules/SettingsUI/Sources/Themes/ThemeSettingsController.swift @@ -369,7 +369,7 @@ private enum ThemeSettingsControllerEntry: ItemListNodeEntry { } } -private func themeSettingsControllerEntries(presentationData: PresentationData, presentationThemeSettings: PresentationThemeSettings, mediaSettings: MediaDisplaySettings, themeReference: PresentationThemeReference, availableThemes: [PresentationThemeReference], availableAppIcons: [PresentationAppIcon], currentAppIconName: String?, isPremium: Bool, chatThemes: [PresentationThemeReference], animatedEmojiStickers: [String: [StickerPackItem]], accountPeer: EnginePeer?) -> [ThemeSettingsControllerEntry] { +private func themeSettingsControllerEntries(presentationData: PresentationData, presentationThemeSettings: PresentationThemeSettings, mediaSettings: MediaDisplaySettings, themeReference: PresentationThemeReference, availableThemes: [PresentationThemeReference], availableAppIcons: [PresentationAppIcon], currentAppIconName: String?, isPremium: Bool, chatThemes: [PresentationThemeReference], animatedEmojiStickers: [String: [StickerPackItem]], accountPeer: EnginePeer?, nameColors: PeerNameColors) -> [ThemeSettingsControllerEntry] { var entries: [ThemeSettingsControllerEntry] = [] let strings = presentationData.strings @@ -382,7 +382,8 @@ private func themeSettingsControllerEntries(presentationData: PresentationData, entries.append(.wallpaper(presentationData.theme, strings.Settings_ChatBackground)) if let accountPeer { - entries.append(.nameColor(presentationData.theme, strings.Appearance_NameColor, accountPeer.compactDisplayTitle, (accountPeer.nameColor ?? .blue).color)) + let colors = nameColors.get(accountPeer.nameColor ?? .blue) + entries.append(.nameColor(presentationData.theme, strings.Appearance_NameColor, accountPeer.compactDisplayTitle, colors.main)) } entries.append(.autoNight(presentationData.theme, strings.Appearance_NightTheme, presentationThemeSettings.automaticThemeSwitchSetting.force, !presentationData.autoNightModeTriggered || presentationThemeSettings.automaticThemeSwitchSetting.force)) @@ -1064,7 +1065,7 @@ public func themeSettingsController(context: AccountContext, focusOnItemTag: The chatThemes.insert(.builtin(.dayClassic), at: 0) let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: .text(presentationData.strings.Appearance_Title), leftNavigationButton: nil, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back)) - let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: themeSettingsControllerEntries(presentationData: presentationData, presentationThemeSettings: settings, mediaSettings: mediaSettings, themeReference: themeReference, availableThemes: availableThemes, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName, isPremium: isPremium, chatThemes: chatThemes, animatedEmojiStickers: animatedEmojiStickers, accountPeer: accountPeer), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) + let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: themeSettingsControllerEntries(presentationData: presentationData, presentationThemeSettings: settings, mediaSettings: mediaSettings, themeReference: themeReference, availableThemes: availableThemes, availableAppIcons: availableAppIcons, currentAppIconName: currentAppIconName, isPremium: isPremium, chatThemes: chatThemes, animatedEmojiStickers: animatedEmojiStickers, accountPeer: accountPeer, nameColors: context.peerNameColors), style: .blocks, ensureVisibleItemTag: focusOnItemTag, animateChanges: false) return (controllerState, (listState, arguments)) } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift index 040951dec9..b693a9c933 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_CachedUserData.swift @@ -114,7 +114,7 @@ public struct CachedPremiumGiftOption: Equatable, PostboxCoding { } } -public enum PeerNameColor: Int32, CaseIterable { +public enum PeerNameColor: Equatable { case red case orange case violet @@ -122,13 +122,49 @@ public enum PeerNameColor: Int32, CaseIterable { case cyan case blue case pink - case redDash - case orangeDash - case violetDash - case greenDash - case cyanDash - case blueDash - case pinkDash + case other(Int32) + + public init(rawValue: Int32) { + switch rawValue { + case 0: + self = .red + case 1: + self = .orange + case 2: + self = .violet + case 3: + self = .green + case 4: + self = .cyan + case 5: + self = .blue + case 6: + self = .pink + default: + self = .other(rawValue) + } + } + + public var rawValue: Int32 { + switch self { + case .red: + return 0 + case .orange: + return 1 + case .violet: + return 2 + case .green: + return 3 + case .cyan: + return 4 + case .blue: + return 5 + case .pink: + return 6 + case let .other(value): + return value + } + } } public struct PeerEmojiStatus: Equatable, Codable { diff --git a/submodules/TelegramCore/Sources/Utils/PeerUtils.swift b/submodules/TelegramCore/Sources/Utils/PeerUtils.swift index 407ffa5194..9f775e82cd 100644 --- a/submodules/TelegramCore/Sources/Utils/PeerUtils.swift +++ b/submodules/TelegramCore/Sources/Utils/PeerUtils.swift @@ -223,27 +223,19 @@ public extension Peer { if let nameColor = user.nameColor { return nameColor } else { - return PeerNameColor(rawValue: Int32(self.id.id._internalGetInt64Value() % 7)) ?? .blue + return PeerNameColor(rawValue: Int32(self.id.id._internalGetInt64Value() % 7)) } case let channel as TelegramChannel: if let nameColor = channel.nameColor { return nameColor } else { - return PeerNameColor(rawValue: Int32(self.id.id._internalGetInt64Value() % 7)) ?? .blue + return PeerNameColor(rawValue: Int32(self.id.id._internalGetInt64Value() % 7)) } default: return nil } } - var hasCustomNameColor: Bool { - let defaultNameColor = PeerNameColor(rawValue: Int32(self.id.id._internalGetInt64Value() % 7)) ?? .blue - if self.nameColor != defaultNameColor { - return true - } - return false - } - var backgroundEmojiId: Int64? { switch self { case let user as TelegramUser: diff --git a/submodules/TelegramPresentationData/Sources/PeerNameColor.swift b/submodules/TelegramPresentationData/Sources/PeerNameColor.swift deleted file mode 100644 index 8c3ca8e668..0000000000 --- a/submodules/TelegramPresentationData/Sources/PeerNameColor.swift +++ /dev/null @@ -1,42 +0,0 @@ -import Foundation -import UIKit -import TelegramCore - -public extension PeerNameColor { - var color: UIColor { - return self.dashColors.0 - } - - var dashColors: (UIColor, UIColor?) { - switch self { - case .red: - return (UIColor(rgb: 0xCC5049), nil) - case .orange: - return (UIColor(rgb: 0xD67722), nil) - case .violet: - return (UIColor(rgb: 0x955CDB), nil) - case .green: - return (UIColor(rgb: 0x40A920), nil) - case .cyan: - return (UIColor(rgb: 0x309EBA), nil) - case .blue: - return (UIColor(rgb: 0x368AD1), nil) - case .pink: - return (UIColor(rgb: 0xC7508B), nil) - case .redDash: - return (UIColor(rgb: 0xE15052), UIColor(rgb: 0xF9AE63)) - case .orangeDash: - return (UIColor(rgb: 0xE0802B), UIColor(rgb: 0xFAC534)) - case .violetDash: - return (UIColor(rgb: 0xA05FF3), UIColor(rgb: 0xF48FFF)) - case .greenDash: - return (UIColor(rgb: 0x27A910), UIColor(rgb: 0xA7DC57)) - case .cyanDash: - return (UIColor(rgb: 0x27ACCE), UIColor(rgb: 0x82E8D6)) - case .blueDash: - return (UIColor(rgb: 0x3391D4), UIColor(rgb: 0x7DD3F0)) - case .pinkDash: - return (UIColor(rgb: 0xdd4371), UIColor(rgb: 0xffbe9f)) - } - } -} diff --git a/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift b/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift index 706d9e1fa9..c1768ea438 100644 --- a/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift @@ -761,6 +761,7 @@ private final class QuoteBackgroundView: UIView { size: size, primaryColor: theme.foreground, secondaryColor: theme.isDashed ? .clear : nil, + thirdColor: nil, pattern: nil, animation: .None ) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift index 8e8db827e7..fbc8d24ba6 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift @@ -179,17 +179,21 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { let messageTheme = incoming ? presentationData.theme.theme.chat.message.incoming : presentationData.theme.theme.chat.message.outgoing let author = message.author + let nameColors = author?.nameColor.flatMap { context.peerNameColors.get($0) } + let mainColor: UIColor var secondaryColor: UIColor? + var tertiaryColor: UIColor? if !incoming { mainColor = messageTheme.accentTextColor - if let _ = author?.nameColor?.dashColors.1 { + if let _ = nameColors?.secondary { secondaryColor = .clear } } else { var authorNameColor: UIColor? - authorNameColor = author?.nameColor?.color - secondaryColor = author?.nameColor?.dashColors.1 + authorNameColor = nameColors?.main + secondaryColor = nameColors?.secondary + tertiaryColor = nameColors?.tertiary if let authorNameColor { mainColor = authorNameColor @@ -846,13 +850,13 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { if let current = self.backgroundView { backgroundView = current animation.animator.updateFrame(layer: backgroundView.layer, frame: backgroundFrame, completion: nil) - backgroundView.update(size: backgroundFrame.size, primaryColor: mainColor, secondaryColor: secondaryColor, pattern: nil, animation: animation) + backgroundView.update(size: backgroundFrame.size, primaryColor: mainColor, secondaryColor: secondaryColor, thirdColor: tertiaryColor, pattern: nil, animation: animation) } else { backgroundView = MessageInlineBlockBackgroundView() self.backgroundView = backgroundView backgroundView.frame = backgroundFrame self.transformContainer.view.insertSubview(backgroundView, at: 0) - backgroundView.update(size: backgroundFrame.size, primaryColor: mainColor, secondaryColor: secondaryColor, pattern: nil, animation: .None) + backgroundView.update(size: backgroundFrame.size, primaryColor: mainColor, secondaryColor: secondaryColor, thirdColor: tertiaryColor, pattern: nil, animation: .None) } } else { if let backgroundView = self.backgroundView { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift index 2e077398bf..f626758f2e 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift @@ -1871,31 +1871,40 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } if let peer = firstMessage.peers[firstMessage.id.peerId] as? TelegramChannel, case .broadcast = peer.info, item.content.firstMessage.adAttribute == nil { - authorNameColor = (peer as Peer).nameColor?.color + let peer = (peer as Peer) + let nameColors = peer.nameColor.flatMap { item.context.peerNameColors.get($0) } + authorNameColor = nameColors?.main } else if let effectiveAuthor = effectiveAuthor { - let nameColor: UIColor + let nameColor = effectiveAuthor.nameColor ?? .blue + let nameColors = item.context.peerNameColors.get(nameColor) + let color: UIColor if incoming { - nameColor = (effectiveAuthor.nameColor ?? .blue).color + color = nameColors.main } else { - nameColor = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor + color = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor } - authorNameColor = nameColor + authorNameColor = color } if initialDisplayHeader && displayAuthorInfo { if let peer = firstMessage.peers[firstMessage.id.peerId] as? TelegramChannel, case .broadcast = peer.info, item.content.firstMessage.adAttribute == nil { authorNameString = EnginePeer(peer).displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder) - authorNameColor = (peer as Peer).nameColor?.color + + let peer = (peer as Peer) + let nameColors = peer.nameColor.flatMap { item.context.peerNameColors.get($0) } + authorNameColor = nameColors?.main } else if let effectiveAuthor = effectiveAuthor { authorNameString = EnginePeer(effectiveAuthor).displayTitle(strings: item.presentationData.strings, displayOrder: item.presentationData.nameDisplayOrder) - let nameColor: UIColor + let nameColor = effectiveAuthor.nameColor ?? .blue + let nameColors = item.context.peerNameColors.get(nameColor) + let color: UIColor if incoming { - nameColor = (effectiveAuthor.nameColor ?? .blue).color + color = nameColors.main } else { - nameColor = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor + color = item.presentationData.theme.theme.chat.message.outgoing.accentTextColor } - authorNameColor = nameColor + authorNameColor = color if case let .peer(peerId) = item.chatLocation, let authorPeerId = item.message.author?.id, authorPeerId == peerId { } else if effectiveAuthor.isScam { @@ -1903,11 +1912,11 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } else if effectiveAuthor.isFake { currentCredibilityIcon = .text(color: incoming ? item.presentationData.theme.theme.chat.message.incoming.scamColor : item.presentationData.theme.theme.chat.message.outgoing.scamColor, string: item.presentationData.strings.Message_FakeAccount.uppercased()) } else if let user = effectiveAuthor as? TelegramUser, let emojiStatus = user.emojiStatus { - currentCredibilityIcon = .animation(content: .customEmoji(fileId: emojiStatus.fileId), size: CGSize(width: 20.0, height: 20.0), placeholderColor: incoming ? item.presentationData.theme.theme.chat.message.incoming.mediaPlaceholderColor : item.presentationData.theme.theme.chat.message.outgoing.mediaPlaceholderColor, themeColor: nameColor.withMultipliedAlpha(0.4), loopMode: .count(2)) + currentCredibilityIcon = .animation(content: .customEmoji(fileId: emojiStatus.fileId), size: CGSize(width: 20.0, height: 20.0), placeholderColor: incoming ? item.presentationData.theme.theme.chat.message.incoming.mediaPlaceholderColor : item.presentationData.theme.theme.chat.message.outgoing.mediaPlaceholderColor, themeColor: color.withMultipliedAlpha(0.4), loopMode: .count(2)) } else if effectiveAuthor.isVerified { currentCredibilityIcon = .verified(fillColor: item.presentationData.theme.theme.list.itemCheckColors.fillColor, foregroundColor: item.presentationData.theme.theme.list.itemCheckColors.foregroundColor, sizeType: .compact) } else if effectiveAuthor.isPremium { - currentCredibilityIcon = .premium(color: nameColor.withMultipliedAlpha(0.4)) + currentCredibilityIcon = .premium(color: color.withMultipliedAlpha(0.4)) } } if let rawAuthorNameColor = authorNameColor { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift index 308ca2f60f..e5e6ac4d4b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift @@ -163,11 +163,11 @@ public class ChatMessageForwardInfoNode: ASDisplayNode { } } else { if incoming { - if let color = peer?.nameColor?.color { - titleColor = color - } else { +// if let color = peer?.nameColor?.color { +// titleColor = color +// } else { titleColor = presentationData.theme.theme.chat.message.incoming.accentTextColor - } +// } } else { titleColor = presentationData.theme.theme.chat.message.outgoing.accentTextColor } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift index da1b9037a8..033a6f3b67 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift @@ -193,14 +193,18 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { let mainColor: UIColor let dustColor: UIColor var secondaryColor: UIColor? + var tertiaryColor: UIColor? var authorNameColor: UIColor? var dashSecondaryColor: UIColor? + var dashTertiaryColor: UIColor? let author = arguments.message?.effectiveAuthor - authorNameColor = author?.nameColor?.color - dashSecondaryColor = author?.nameColor?.dashColors.1 + let colors = author?.nameColor.flatMap { arguments.context.peerNameColors.get($0) } + authorNameColor = colors?.main + dashSecondaryColor = colors?.secondary + dashTertiaryColor = colors?.tertiary switch arguments.type { case let .bubble(incoming): @@ -209,6 +213,7 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { if let authorNameColor { mainColor = authorNameColor secondaryColor = dashSecondaryColor + tertiaryColor = dashTertiaryColor } else { mainColor = arguments.presentationData.theme.theme.chat.message.incoming.accentTextColor } @@ -754,6 +759,7 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { size: backgroundFrame.size, primaryColor: mainColor, secondaryColor: secondaryColor, + thirdColor: tertiaryColor, pattern: pattern, animation: animation ) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift index 57e7536ef2..f7d38e91a4 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift @@ -393,24 +393,24 @@ public class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { underlineLinks = false } - let author = item.message.author +// let author = item.message.author let mainColor: UIColor - var secondaryColor: UIColor? + let secondaryColor: UIColor? = nil if !incoming { mainColor = messageTheme.accentTextColor - if let _ = author?.nameColor?.dashColors.1 { - secondaryColor = .clear - } +// if let _ = author?.nameColor?.dashColors.1 { +// secondaryColor = .clear +// } } else { - var authorNameColor: UIColor? - authorNameColor = author?.nameColor?.color - secondaryColor = author?.nameColor?.dashColors.1 +// let authorNameColor: UIColor? +// authorNameColor = author?.nameColor?.color +// secondaryColor = author?.nameColor?.dashColors.1 - if let authorNameColor { - mainColor = authorNameColor - } else { +// if let authorNameColor { +// mainColor = authorNameColor +// } else { mainColor = messageTheme.accentTextColor - } +// } } attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseQuoteTintColor: mainColor, baseQuoteSecondaryTintColor: secondaryColor, baseFont: textFont, linkFont: textFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, boldItalicFont: item.presentationData.messageBoldItalicFont, fixedFont: item.presentationData.messageFixedFont, blockQuoteFont: item.presentationData.messageBlockQuoteFont, underlineLinks: underlineLinks, message: item.message, adjustQuoteFontSize: true) diff --git a/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift b/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift index 02832984ff..3192d5cf4a 100644 --- a/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift +++ b/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift @@ -92,12 +92,17 @@ private let dashBackgroundTemplateImage: UIImage = { return generateDashBackgroundTemplateImage() }() -private func generateDashTemplateImage(isMonochrome: Bool) -> UIImage { - return generateImage(CGSize(width: radius * 2.0, height: 18.0), rotatedContext: { size, context in +private func generateDashTemplateImage(isMonochrome: Bool, isTriple: Bool) -> UIImage { + return generateImage(CGSize(width: radius * 2.0, height: isTriple ? 27.0 : 18.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) context.setFillColor(UIColor.white.cgColor) - let dashOffset: CGFloat = isMonochrome ? -4.0 : 5.0 + let dashOffset: CGFloat + if isTriple { + dashOffset = 0.0 + } else { + dashOffset = isMonochrome ? -4.0 : 5.0 + } context.translateBy(x: 0.0, y: dashOffset) @@ -109,7 +114,7 @@ private func generateDashTemplateImage(isMonochrome: Bool) -> UIImage { context.closePath() context.fillPath() - context.translateBy(x: 0.0, y: 18.0) + context.translateBy(x: 0.0, y: size.height) } context.clear(CGRect(origin: CGPoint(x: lineWidth, y: 0.0), size: CGSize(width: size.width - lineWidth, height: size.height))) @@ -117,11 +122,15 @@ private func generateDashTemplateImage(isMonochrome: Bool) -> UIImage { } private let dashOpaqueTemplateImage: UIImage = { - return generateDashTemplateImage(isMonochrome: false) + return generateDashTemplateImage(isMonochrome: false, isTriple: false) +}() + +private let dashOpaqueTripleTemplateImage: UIImage = { + return generateDashTemplateImage(isMonochrome: false, isTriple: true) }() private let dashMonochromeTemplateImage: UIImage = { - return generateDashTemplateImage(isMonochrome: true) + return generateDashTemplateImage(isMonochrome: true, isTriple: false) }() private func generateGradient(gradientWidth: CGFloat, baseAlpha: CGFloat) -> UIImage { @@ -175,6 +184,7 @@ private final class PatternContentsTarget: MultiAnimationRenderTarget { private final class LineView: UIView { private let backgroundView: UIImageView private var dashBackgroundView: UIImageView? + private var dashThirdBackgroundView: UIImageView? private var params: Params? private var isAnimating: Bool = false @@ -183,12 +193,14 @@ private final class LineView: UIView { var size: CGSize var primaryColor: UIColor var secondaryColor: UIColor? + var thirdColor: UIColor? var displayProgress: Bool - init(size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, displayProgress: Bool) { + init(size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, thirdColor: UIColor?, displayProgress: Bool) { self.size = size self.primaryColor = primaryColor self.secondaryColor = secondaryColor + self.thirdColor = thirdColor self.displayProgress = displayProgress } } @@ -231,6 +243,21 @@ private final class LineView: UIView { } dashBackgroundView.layer.add(animation, forKey: "progress") } + if let dashThirdBackgroundView = self.dashThirdBackgroundView { + if dashThirdBackgroundView.layer.animation(forKey: "progress") == nil { + let animation = dashThirdBackgroundView.layer.makeAnimation(from: 18.0 as NSNumber, to: 0.0 as NSNumber, keyPath: "position.y", timingFunction: CAMediaTimingFunctionName.linear.rawValue, duration: 0.2, delay: 0.0, mediaTimingFunction: nil, removeOnCompletion: true, additive: true) + animation.repeatCount = 1.0 + self.isAnimating = true + animation.completion = { [weak self] _ in + guard let self else { + return + } + self.isAnimating = false + self.updateAnimations() + } + dashThirdBackgroundView.layer.add(animation, forKey: "progress") + } + } } else { let phaseDuration: Double = 1.0 if self.backgroundView.layer.animation(forKey: "progress") == nil { @@ -271,11 +298,12 @@ private final class LineView: UIView { self.layer.masksToBounds = params.secondaryColor != nil || self.isAnimating } - func update(size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, displayProgress: Bool, animation: ListViewItemUpdateAnimation) { + func update(size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, thirdColor: UIColor?, displayProgress: Bool, animation: ListViewItemUpdateAnimation) { let params = Params( size: size, primaryColor: primaryColor, secondaryColor: secondaryColor, + thirdColor: thirdColor, displayProgress: displayProgress ) if self.params == params { @@ -305,13 +333,45 @@ private final class LineView: UIView { dashBackgroundView.frame = dashBackgroundFrame } + let templateImage: UIImage + if let thirdColor { + let thirdDashBackgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -9.0), size: CGSize(width: radius * 2.0, height: size.height + 18.0)) + templateImage = dashOpaqueTripleTemplateImage + let dashThirdBackgroundView: UIImageView + if let current = self.dashThirdBackgroundView { + dashThirdBackgroundView = current + + animation.animator.updateFrame(layer: dashThirdBackgroundView.layer, frame: thirdDashBackgroundFrame, completion: nil) + } else { + dashThirdBackgroundView = UIImageView() + self.dashThirdBackgroundView = dashThirdBackgroundView + self.addSubview(dashThirdBackgroundView) + + dashThirdBackgroundView.frame = thirdDashBackgroundFrame + } + + if secondaryColor.alpha == 0.0 { + dashThirdBackgroundView.image = templateImage + dashThirdBackgroundView.tintColor = thirdColor + } else { + dashThirdBackgroundView.image = templateImage + dashThirdBackgroundView.tintColor = thirdColor + } + } else { + templateImage = dashOpaqueTemplateImage + if let dashThirdBackgroundView = self.dashThirdBackgroundView { + self.dashThirdBackgroundView = nil + dashThirdBackgroundView.removeFromSuperview() + } + } + if secondaryColor.alpha == 0.0 { self.backgroundView.alpha = 0.2 dashBackgroundView.image = dashMonochromeTemplateImage dashBackgroundView.tintColor = primaryColor } else { self.backgroundView.alpha = 1.0 - dashBackgroundView.image = dashOpaqueTemplateImage + dashBackgroundView.image = templateImage dashBackgroundView.tintColor = secondaryColor } } else { @@ -365,6 +425,7 @@ public final class MessageInlineBlockBackgroundView: UIView { var size: CGSize var primaryColor: UIColor var secondaryColor: UIColor? + var thirdColor: UIColor? var pattern: Pattern? var displayProgress: Bool @@ -372,12 +433,14 @@ public final class MessageInlineBlockBackgroundView: UIView { size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, + thirdColor: UIColor?, pattern: Pattern?, displayProgress: Bool ) { self.size = size self.primaryColor = primaryColor self.secondaryColor = secondaryColor + self.thirdColor = thirdColor self.pattern = pattern self.displayProgress = displayProgress } @@ -393,6 +456,7 @@ public final class MessageInlineBlockBackgroundView: UIView { size: params.size, primaryColor: params.primaryColor, secondaryColor: params.secondaryColor, + thirdColor: params.thirdColor, pattern: params.pattern, animation: .None ) @@ -502,6 +566,7 @@ public final class MessageInlineBlockBackgroundView: UIView { size: CGSize, primaryColor: UIColor, secondaryColor: UIColor?, + thirdColor: UIColor?, pattern: Pattern?, animation: ListViewItemUpdateAnimation ) { @@ -509,6 +574,7 @@ public final class MessageInlineBlockBackgroundView: UIView { size: size, primaryColor: primaryColor, secondaryColor: secondaryColor, + thirdColor: thirdColor, pattern: pattern, displayProgress: self.displayProgress ) @@ -588,6 +654,7 @@ public final class MessageInlineBlockBackgroundView: UIView { size: lineFrame.size, primaryColor: params.primaryColor, secondaryColor: params.secondaryColor, + thirdColor: params.thirdColor, displayProgress: params.displayProgress, animation: animation ) diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorItem.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorItem.swift index fbf7f17659..e573d9f435 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorItem.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorItem.swift @@ -9,25 +9,26 @@ import TelegramUIPreferences import MergeLists import ItemListUI import PresentationDataUtils +import AccountContext private enum PeerNameColorEntryId: Hashable { case color(Int32) } private enum PeerNameColorEntry: Comparable, Identifiable { - case color(Int, PeerNameColor, Bool) + case color(Int, PeerNameColor, PeerNameColors.Colors, Bool) var stableId: PeerNameColorEntryId { switch self { - case let .color(_, color, _): + case let .color(_, color, _, _): return .color(color.rawValue) } } static func ==(lhs: PeerNameColorEntry, rhs: PeerNameColorEntry) -> Bool { switch lhs { - case let .color(lhsIndex, lhsAccentColor, lhsSelected): - if case let .color(rhsIndex, rhsAccentColor, rhsSelected) = rhs, lhsIndex == rhsIndex, lhsAccentColor == rhsAccentColor, lhsSelected == rhsSelected { + case let .color(lhsIndex, lhsColor, lhsAccentColor, lhsSelected): + if case let .color(rhsIndex, rhsColor, rhsAccentColor, rhsSelected) = rhs, lhsIndex == rhsIndex, lhsColor == rhsColor, lhsAccentColor == rhsAccentColor, lhsSelected == rhsSelected { return true } else { return false @@ -37,9 +38,9 @@ private enum PeerNameColorEntry: Comparable, Identifiable { static func <(lhs: PeerNameColorEntry, rhs: PeerNameColorEntry) -> Bool { switch lhs { - case let .color(lhsIndex, _, _): + case let .color(lhsIndex, _, _, _): switch rhs { - case let .color(rhsIndex, _, _): + case let .color(rhsIndex, _, _, _): return lhsIndex < rhsIndex } } @@ -47,20 +48,22 @@ private enum PeerNameColorEntry: Comparable, Identifiable { func item(action: @escaping (PeerNameColor) -> Void) -> ListViewItem { switch self { - case let .color(_, color, selected): - return PeerNameColorIconItem(color: color, selected: selected, action: action) + case let .color(_, index, colors, selected): + return PeerNameColorIconItem(index: index, colors: colors, selected: selected, action: action) } } } private class PeerNameColorIconItem: ListViewItem { - let color: PeerNameColor + let index: PeerNameColor + let colors: PeerNameColors.Colors let selected: Bool let action: (PeerNameColor) -> Void - public init(color: PeerNameColor, selected: Bool, action: @escaping (PeerNameColor) -> Void) { - self.color = color + public init(index: PeerNameColor, colors: PeerNameColors.Colors, selected: Bool, action: @escaping (PeerNameColor) -> Void) { + self.index = index + self.colors = colors self.selected = selected self.action = action } @@ -107,22 +110,22 @@ private class PeerNameColorIconItem: ListViewItem { public var selectable = true public func selected(listView: ListView) { - self.action(self.color) + self.action(self.index) } } -private func generateRingImage(nameColor: PeerNameColor) -> UIImage? { +private func generateRingImage(nameColor: PeerNameColors.Colors) -> UIImage? { return generateImage(CGSize(width: 40.0, height: 40.0), rotatedContext: { size, context in let bounds = CGRect(origin: CGPoint(), size: size) context.clear(bounds) - context.setStrokeColor(nameColor.color.cgColor) + context.setStrokeColor(nameColor.main.cgColor) context.setLineWidth(2.0) context.strokeEllipse(in: bounds.insetBy(dx: 1.0, dy: 1.0)) }) } -private func generateFillImage(nameColor: PeerNameColor) -> UIImage? { +private func generateFillImage(nameColor: PeerNameColors.Colors) -> UIImage? { return generateImage(CGSize(width: 40.0, height: 40.0), rotatedContext: { size, context in let bounds = CGRect(origin: CGPoint(), size: size) context.clear(bounds) @@ -131,8 +134,7 @@ private func generateFillImage(nameColor: PeerNameColor) -> UIImage? { context.addEllipse(in: circleBounds) context.clip() - let (firstColor, secondColor) = nameColor.dashColors - if let secondColor { + if let secondColor = nameColor.secondary { context.setFillColor(secondColor.cgColor) context.fill(circleBounds) @@ -140,10 +142,20 @@ private func generateFillImage(nameColor: PeerNameColor) -> UIImage? { context.addLine(to: CGPoint(x: size.width, y: 0.0)) context.addLine(to: CGPoint(x: 0.0, y: size.height)) context.closePath() - context.setFillColor(firstColor.cgColor) + context.setFillColor(nameColor.main.cgColor) context.fillPath() + + if let thirdColor = nameColor.tertiary { + context.setFillColor(thirdColor.cgColor) + context.translateBy(x: size.width / 2.0, y: size.height / 2.0) + context.rotate(by: .pi / 4.0) + + let path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(x: -9.0, y: -9.0), size: CGSize(width: 18.0, height: 18.0)), cornerRadius: 4.0) + context.addPath(path.cgPath) + context.fillPath() + } } else { - context.setFillColor(firstColor.cgColor) + context.setFillColor(nameColor.main.cgColor) context.fill(circleBounds) } }) @@ -198,7 +210,7 @@ private final class PeerNameColorIconItemNode : ListViewItemNode { var updatedAccentColor = false var updatedSelected = false - if currentItem == nil || currentItem?.color != item.color { + if currentItem == nil || currentItem?.colors != item.colors { updatedAccentColor = true } if currentItem?.selected != item.selected { @@ -211,8 +223,8 @@ private final class PeerNameColorIconItemNode : ListViewItemNode { strongSelf.item = item if updatedAccentColor { - strongSelf.fillNode.image = generateFillImage(nameColor: item.color) - strongSelf.ringNode.image = generateRingImage(nameColor: item.color) + strongSelf.fillNode.image = generateFillImage(nameColor: item.colors) + strongSelf.ringNode.image = generateRingImage(nameColor: item.colors) } let center = CGPoint(x: 30.0, y: 28.0) @@ -256,12 +268,12 @@ final class PeerNameColorItem: ListViewItem, ItemListItem { var sectionId: ItemListSectionId let theme: PresentationTheme - let colors: [PeerNameColor] + let colors: PeerNameColors let currentColor: PeerNameColor let updated: (PeerNameColor) -> Void let tag: ItemListItemTag? - init(theme: PresentationTheme, colors: [PeerNameColor], currentColor: PeerNameColor, updated: @escaping (PeerNameColor) -> Void, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId) { + init(theme: PresentationTheme, colors: PeerNameColors, currentColor: PeerNameColor, updated: @escaping (PeerNameColor) -> Void, tag: ItemListItemTag? = nil, sectionId: ItemListSectionId) { self.theme = theme self.colors = colors self.currentColor = currentColor @@ -325,7 +337,7 @@ private func ensureColorVisible(listNode: ListView, color: PeerNameColor, animat var resultNode: PeerNameColorIconItemNode? listNode.forEachItemNode { node in if resultNode == nil, let node = node as? PeerNameColorIconItemNode { - if node.item?.color == color { + if node.item?.index == color { resultNode = node } } @@ -406,7 +418,7 @@ final class PeerNameColorItemNode: ListViewItemNode, ItemListItemNode { let options = ListViewDeleteAndInsertOptions() var scrollToItem: ListViewScrollToItem? if !self.initialized || transition.updatePosition || !self.tapping { - if let index = item.colors.firstIndex(where: { $0 == item.currentColor }) { + if let index = item.colors.displayOrder.firstIndex(where: { $0 == item.currentColor.rawValue }) { scrollToItem = ListViewScrollToItem(index: index, position: .bottom(-70.0), animated: false, curve: .Default(duration: 0.0), directionHint: .Down) self.initialized = true } @@ -501,10 +513,13 @@ final class PeerNameColorItemNode: ListViewItemNode, ItemListItemNode { var entries: [PeerNameColorEntry] = [] - var index: Int = 0 - for color in item.colors { - entries.append(.color(index, color, color == item.currentColor)) - index += 1 + var i: Int = 0 + for index in item.colors.displayOrder { + let color = PeerNameColor(rawValue: index) + if let colors = item.colors.colors[index] { + entries.append(.color(i, color, colors, color == item.currentColor)) + } + i += 1 } let action: (PeerNameColor) -> Void = { [weak self] color in diff --git a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift index 9d1f59cd45..fcd523753f 100644 --- a/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift +++ b/submodules/TelegramUI/Components/Settings/PeerNameColorScreen/Sources/PeerNameColorScreen.swift @@ -47,7 +47,7 @@ private enum PeerNameColorScreenEntry: ItemListNodeEntry { case colorHeader(String) case colorMessage(wallpaper: TelegramWallpaper, fontSize: PresentationFontSize, bubbleCorners: PresentationChatBubbleCorners, dateTimeFormat: PresentationDateTimeFormat, nameDisplayOrder: PresentationPersonNameOrder, items: [PeerNameColorChatPreviewItem.MessageItem]) - case colorPicker(colors: [PeerNameColor], currentColor: PeerNameColor) + case colorPicker(colors: PeerNameColors, currentColor: PeerNameColor) case colorDescription(String) case backgroundEmojiHeader(String) case backgroundEmoji(EmojiPagerContentComponent, UIColor) @@ -185,6 +185,7 @@ private struct PeerNameColorScreenState: Equatable { } private func peerNameColorScreenEntries( + nameColors: PeerNameColors, presentationData: PresentationData, state: PeerNameColorScreenState, peer: EnginePeer?, @@ -194,11 +195,6 @@ private func peerNameColorScreenEntries( var entries: [PeerNameColorScreenEntry] = [] if let peer { - var allColors: [PeerNameColor] = [ - .blue - ] - allColors.append(contentsOf: PeerNameColor.allCases.filter { $0 != .blue}) - let nameColor: PeerNameColor if let updatedNameColor = state.updatedNameColor { nameColor = updatedNameColor @@ -208,6 +204,8 @@ private func peerNameColorScreenEntries( nameColor = .blue } + let colors = nameColors.get(nameColor) + let backgroundEmojiId: Int64? if let updatedBackgroundEmojiId = state.updatedBackgroundEmojiId { if updatedBackgroundEmojiId == 0 { @@ -250,14 +248,14 @@ private func peerNameColorScreenEntries( items: [messageItem] )) entries.append(.colorPicker( - colors: allColors, + colors: nameColors, currentColor: nameColor )) entries.append(.colorDescription(presentationData.strings.NameColor_ChatPreview_Description_Account)) if let emojiContent { entries.append(.backgroundEmojiHeader(presentationData.strings.NameColor_BackgroundEmoji_Title)) - entries.append(.backgroundEmoji(emojiContent, nameColor.color)) + entries.append(.backgroundEmoji(emojiContent, colors.main)) } } @@ -314,6 +312,7 @@ public func PeerNameColorScreen( peerId = channelId } + let emojiContent = combineLatest( statePromise.get(), context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: peerId)) @@ -325,12 +324,13 @@ public func PeerNameColorScreen( } else { selectedEmojiId = peer?.backgroundEmojiId } - let nameColor: UIColor + let nameColor: PeerNameColor if let updatedNameColor = state.updatedNameColor { - nameColor = updatedNameColor.color + nameColor = updatedNameColor } else { - nameColor = (peer?.nameColor ?? .blue).color + nameColor = (peer?.nameColor ?? .blue) } + let color = context.peerNameColors.get(nameColor) let selectedItems: [EngineMedia.Id] if let selectedEmojiId, selectedEmojiId != 0 { @@ -351,7 +351,7 @@ public func PeerNameColorScreen( areCustomEmojiEnabled: true, chatPeerId: context.account.peerId, selectedItems: Set(selectedItems), - backgroundIconColor: nameColor + backgroundIconColor: color.main ) } @@ -547,6 +547,7 @@ public func PeerNameColorScreen( ) let entries = peerNameColorScreenEntries( + nameColors: context.peerNameColors, presentationData: presentationData, state: state, peer: peer, diff --git a/submodules/TelegramUI/Sources/AccountContext.swift b/submodules/TelegramUI/Sources/AccountContext.swift index 6d66335297..3fb0af2bbe 100644 --- a/submodules/TelegramUI/Sources/AccountContext.swift +++ b/submodules/TelegramUI/Sources/AccountContext.swift @@ -244,6 +244,9 @@ public final class AccountContextImpl: AccountContext { private var userLimitsConfigurationDisposable: Disposable? public private(set) var userLimits: EngineConfiguration.UserLimits + private var peerNameColorsConfigurationDisposable: Disposable? + public private(set) var peerNameColors: PeerNameColors + public private(set) var isPremium: Bool public let imageCache: AnyObject? @@ -257,6 +260,7 @@ public final class AccountContextImpl: AccountContext { self.imageCache = DirectMediaImageCache(account: account) self.userLimits = EngineConfiguration.UserLimits(UserLimitsConfiguration.defaultValue) + self.peerNameColors = PeerNameColors.defaultValue self.isPremium = false self.downloadedMediaStoreManager = DownloadedMediaStoreManagerImpl(postbox: account.postbox, accountManager: sharedContext.accountManager) @@ -336,7 +340,7 @@ public final class AccountContextImpl: AccountContext { if !temp { let currentCountriesConfiguration = self.currentCountriesConfiguration self.countriesConfigurationDisposable = (self.engine.localization.getCountriesList(accountManager: sharedContext.accountManager, langCode: nil) - |> deliverOnMainQueue).start(next: { value in + |> deliverOnMainQueue).start(next: { value in let _ = currentCountriesConfiguration.swap(CountriesConfiguration(countries: value)) }) } @@ -395,12 +399,20 @@ public final class AccountContextImpl: AccountContext { return (isPremium, userLimits) } } - |> deliverOnMainQueue).start(next: { [weak self] isPremium, userLimits in - guard let strongSelf = self else { + |> deliverOnMainQueue).startStrict(next: { [weak self] isPremium, userLimits in + guard let self = self else { return } - strongSelf.isPremium = isPremium - strongSelf.userLimits = userLimits + self.isPremium = isPremium + self.userLimits = userLimits + }) + + self.peerNameColorsConfigurationDisposable = (self._appConfiguration.get() + |> deliverOnMainQueue).startStrict(next: { [weak self] appConfiguration in + guard let self = self else { + return + } + self.peerNameColors = PeerNameColors.with(appConfiguration: appConfiguration) }) } @@ -413,6 +425,7 @@ public final class AccountContextImpl: AccountContext { self.experimentalUISettingsDisposable?.dispose() self.animatedEmojiStickersDisposable?.dispose() self.userLimitsConfigurationDisposable?.dispose() + self.peerNameColorsConfigurationDisposable?.dispose() } public func storeSecureIdPassword(password: String) { diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index 2e567d1c09..2540545773 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -5090,7 +5090,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { let isPremium = peerView.peers[peerView.peerId]?.isPremium ?? false var accountPeerColor: ChatPresentationInterfaceState.AccountPeerColor? - if peerView.peers[peerView.peerId]?.nameColor?.dashColors.1 != nil { + if let nameColor = peerView.peers[peerView.peerId]?.nameColor, strongSelf.context.peerNameColors.get(nameColor).secondary != nil { accountPeerColor = ChatPresentationInterfaceState.AccountPeerColor(isDashed: true) } strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: false, { state in diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index d0388072eb..6bb3c0c22b 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -1621,7 +1621,8 @@ private func editingItems(data: PeerInfoScreenData?, state: PeerInfoState, chatL } if isCreator || (channel.adminRights?.rights.contains(.canChangeInfo) == true) { - items[.peerSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemNameColor, label: .semitransparentBadge(EnginePeer(channel).compactDisplayTitle, (data.peer?.nameColor ?? .blue).color), text: "Channel Color", icon: UIImage(bundleImageName: "Chat/Info/NameColorIcon"), action: { + let colors = context.peerNameColors.get(data.peer?.nameColor ?? .blue) + items[.peerSettings]!.append(PeerInfoScreenDisclosureItem(id: ItemNameColor, label: .semitransparentBadge(EnginePeer(channel).compactDisplayTitle, colors.main), text: "Channel Color", icon: UIImage(bundleImageName: "Chat/Info/NameColorIcon"), action: { interaction.editingOpenNameColorSetup() })) } From 7cb8f9739b3a845e7cb009ae92db68e5c63ad4a2 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 13:33:51 +0400 Subject: [PATCH 6/8] Name color improvements --- .../Sources/AccountContext.swift | 8 ++--- .../ChatPresentationInterfaceState.swift | 11 +++++-- ...SendMessageActionSheetControllerNode.swift | 2 +- .../Sources/ChatInputTextNode.swift | 17 ++++++---- .../Sources/ChatMessageReplyInfoNode.swift | 6 ++++ .../MessageInlineBlockBackgroundView.swift | 31 +++++++++++++------ .../TelegramUI/Sources/ChatController.swift | 11 +++++-- .../Sources/ChatTextInputPanelNode.swift | 26 ++++++++++++++-- 8 files changed, 85 insertions(+), 27 deletions(-) diff --git a/submodules/AccountContext/Sources/AccountContext.swift b/submodules/AccountContext/Sources/AccountContext.swift index b3e1baf464..0a228fcdb6 100644 --- a/submodules/AccountContext/Sources/AccountContext.swift +++ b/submodules/AccountContext/Sources/AccountContext.swift @@ -1281,10 +1281,10 @@ public class PeerNameColors: Equatable { var colors = PeerNameColors.defaultSingleColors var darkColors: [Int32: Colors] = [:] - if let peerColors = data["peer_colors"] as? [String: [Double]] { + if let peerColors = data["peer_colors"] as? [String: [String]] { for (key, values) in peerColors { if let index = Int32(key) { - let colorsArray = values.map { UIColor(rgb: UInt32($0)) } + let colorsArray = values.compactMap { UIColor(hexString: $0) } if let colorValues = Colors(colors: colorsArray) { colors[index] = colorValues } @@ -1292,10 +1292,10 @@ public class PeerNameColors: Equatable { } } - if let darkPeerColors = data["dark_peer_colors"] as? [String: [Double]] { + if let darkPeerColors = data["dark_peer_colors"] as? [String: [String]] { for (key, values) in darkPeerColors { if let index = Int32(key) { - let colorsArray = values.map { UIColor(rgb: UInt32($0)) } + let colorsArray = values.compactMap { UIColor(hexString: $0) } if let colorValues = Colors(colors: colorsArray) { darkColors[index] = colorValues } diff --git a/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift b/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift index 00c65ddf70..2b1855e037 100644 --- a/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift +++ b/submodules/ChatPresentationInterfaceState/Sources/ChatPresentationInterfaceState.swift @@ -339,10 +339,15 @@ public final class ChatPresentationInterfaceState: Equatable { } public struct AccountPeerColor: Equatable { - public var isDashed: Bool + public enum Style { + case solid + case doubleDashed + case tripleDashed + } + public var style: Style - public init(isDashed: Bool) { - self.isDashed = isDashed + public init(style: Style) { + self.style = style } } diff --git a/submodules/ChatSendMessageActionUI/Sources/ChatSendMessageActionSheetControllerNode.swift b/submodules/ChatSendMessageActionUI/Sources/ChatSendMessageActionSheetControllerNode.swift index d28ff3534d..efd884e0fd 100644 --- a/submodules/ChatSendMessageActionUI/Sources/ChatSendMessageActionSheetControllerNode.swift +++ b/submodules/ChatSendMessageActionUI/Sources/ChatSendMessageActionSheetControllerNode.swift @@ -278,7 +278,7 @@ final class ChatSendMessageActionSheetControllerNode: ViewControllerTracingNode, quote: ChatInputTextView.Theme.Quote( background: mainColor.withMultipliedAlpha(0.1), foreground: mainColor, - isDashed: textInputView.theme?.quote.isDashed == true + lineStyle: textInputView.theme?.quote.lineStyle ?? .solid ) ) } diff --git a/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift b/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift index c3d6faa980..8042cee64e 100644 --- a/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatInputTextNode/Sources/ChatInputTextNode.swift @@ -259,18 +259,23 @@ private final class ChatInputTextContainer: NSTextContainer { public final class ChatInputTextView: ChatInputTextViewImpl, NSLayoutManagerDelegate, NSTextStorageDelegate { public final class Theme: Equatable { public final class Quote: Equatable { + public enum LineStyle { + case solid + case doubleDashed + case tripleDashed + } public let background: UIColor public let foreground: UIColor - public let isDashed: Bool + public let lineStyle: LineStyle public init( background: UIColor, foreground: UIColor, - isDashed: Bool + lineStyle: LineStyle ) { self.background = background self.foreground = foreground - self.isDashed = isDashed + self.lineStyle = lineStyle } public static func ==(lhs: Quote, rhs: Quote) -> Bool { @@ -280,7 +285,7 @@ public final class ChatInputTextView: ChatInputTextViewImpl, NSLayoutManagerDele if !lhs.foreground.isEqual(rhs.foreground) { return false } - if lhs.isDashed != rhs.isDashed { + if lhs.lineStyle != rhs.lineStyle { return false } return true @@ -763,8 +768,8 @@ private final class QuoteBackgroundView: UIView { self.backgroundView.update( size: size, primaryColor: theme.foreground, - secondaryColor: theme.isDashed ? .clear : nil, - thirdColor: nil, + secondaryColor: theme.lineStyle != .solid ? .clear : nil, + thirdColor: theme.lineStyle == .tripleDashed ? .clear : nil, pattern: nil, animation: .None ) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift index e76d3563f6..cf692603df 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageReplyInfoNode/Sources/ChatMessageReplyInfoNode.swift @@ -222,6 +222,9 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { if dashSecondaryColor != nil { secondaryColor = .clear } + if dashTertiaryColor != nil { + tertiaryColor = .clear + } } dustColor = incoming ? arguments.presentationData.theme.theme.chat.message.incoming.secondaryTextColor : arguments.presentationData.theme.theme.chat.message.outgoing.secondaryTextColor case .standalone: @@ -230,6 +233,9 @@ public class ChatMessageReplyInfoNode: ASDisplayNode { if dashSecondaryColor != nil { secondaryColor = .clear } + if dashTertiaryColor != nil { + tertiaryColor = .clear + } mainColor = serviceMessageColorComponents(chatTheme: arguments.presentationData.theme.theme.chat, wallpaper: arguments.presentationData.theme.wallpaper).primaryText dustColor = titleColor diff --git a/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift b/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift index b8f2132b43..67f5f2a132 100644 --- a/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift +++ b/submodules/TelegramUI/Components/Chat/MessageInlineBlockBackgroundView/Sources/MessageInlineBlockBackgroundView.swift @@ -93,24 +93,26 @@ private let dashBackgroundTemplateImage: UIImage = { }() private func generateDashTemplateImage(isMonochrome: Bool, isTriple: Bool) -> UIImage { - return generateImage(CGSize(width: radius * 2.0, height: isTriple ? 27.0 : 18.0), rotatedContext: { size, context in + return generateImage(CGSize(width: radius * 2.0, height: 18.0), rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) context.setFillColor(UIColor.white.cgColor) let dashOffset: CGFloat if isTriple { - dashOffset = 0.0 + dashOffset = isMonochrome ? -2.0 : 0.0 } else { dashOffset = isMonochrome ? -4.0 : 5.0 } + let dashHeight: CGFloat = isTriple ? 6.0 : 9.0 + context.translateBy(x: 0.0, y: dashOffset) for _ in 0 ..< 2 { context.move(to: CGPoint(x: 0.0, y: 3.0)) context.addLine(to: CGPoint(x: lineWidth, y: 0.0)) - context.addLine(to: CGPoint(x: lineWidth, y: 9.0)) - context.addLine(to: CGPoint(x: 0.0, y: 9.0 + 3.0)) + context.addLine(to: CGPoint(x: lineWidth, y: dashHeight)) + context.addLine(to: CGPoint(x: 0.0, y: dashHeight + 3.0)) context.closePath() context.fillPath() @@ -133,6 +135,10 @@ private let dashMonochromeTemplateImage: UIImage = { return generateDashTemplateImage(isMonochrome: true, isTriple: false) }() +private let dashMonochromeTripleTemplateImage: UIImage = { + return generateDashTemplateImage(isMonochrome: true, isTriple: true) +}() + private func generateGradient(gradientWidth: CGFloat, baseAlpha: CGFloat) -> UIImage { return generateImage(CGSize(width: gradientWidth, height: 16.0), opaque: false, scale: 1.0, rotatedContext: { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) @@ -334,9 +340,13 @@ private final class LineView: UIView { } let templateImage: UIImage + let monochromeTemplateImage: UIImage + if let thirdColor { - let thirdDashBackgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -9.0), size: CGSize(width: radius * 2.0, height: size.height + 18.0)) + let thirdDashBackgroundFrame = CGRect(origin: CGPoint(x: 0.0, y: -12.0), size: CGSize(width: radius * 2.0, height: size.height + 18.0)) templateImage = dashOpaqueTripleTemplateImage + monochromeTemplateImage = dashMonochromeTripleTemplateImage + let dashThirdBackgroundView: UIImageView if let current = self.dashThirdBackgroundView { dashThirdBackgroundView = current @@ -350,15 +360,18 @@ private final class LineView: UIView { dashThirdBackgroundView.frame = thirdDashBackgroundFrame } - if secondaryColor.alpha == 0.0 { - dashThirdBackgroundView.image = templateImage - dashThirdBackgroundView.tintColor = thirdColor + if thirdColor.alpha == 0.0 { + dashThirdBackgroundView.alpha = 0.4 + dashThirdBackgroundView.image = monochromeTemplateImage + dashThirdBackgroundView.tintColor = primaryColor } else { + dashThirdBackgroundView.alpha = 1.0 dashThirdBackgroundView.image = templateImage dashThirdBackgroundView.tintColor = thirdColor } } else { templateImage = dashOpaqueTemplateImage + monochromeTemplateImage = dashMonochromeTemplateImage if let dashThirdBackgroundView = self.dashThirdBackgroundView { self.dashThirdBackgroundView = nil dashThirdBackgroundView.removeFromSuperview() @@ -367,7 +380,7 @@ private final class LineView: UIView { if secondaryColor.alpha == 0.0 { self.backgroundView.alpha = 0.2 - dashBackgroundView.image = dashMonochromeTemplateImage + dashBackgroundView.image = monochromeTemplateImage dashBackgroundView.tintColor = primaryColor } else { self.backgroundView.alpha = 1.0 diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index fd6832cc9f..3cc192ba82 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -5109,8 +5109,15 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { let isPremium = peerView.peers[peerView.peerId]?.isPremium ?? false var accountPeerColor: ChatPresentationInterfaceState.AccountPeerColor? - if let nameColor = peerView.peers[peerView.peerId]?.nameColor, strongSelf.context.peerNameColors.get(nameColor).secondary != nil { - accountPeerColor = ChatPresentationInterfaceState.AccountPeerColor(isDashed: true) + if let nameColor = peerView.peers[peerView.peerId]?.nameColor { + let colors = strongSelf.context.peerNameColors.get(nameColor) + var style: ChatPresentationInterfaceState.AccountPeerColor.Style = .solid + if colors.tertiary != nil { + style = .tripleDashed + } else if colors.secondary != nil { + style = .doubleDashed + } + accountPeerColor = ChatPresentationInterfaceState.AccountPeerColor(style: style) } strongSelf.updateChatPresentationInterfaceState(animated: false, interactive: false, { state in return state.updatedIsPremium(isPremium).updatedAccountPeerColor(accountPeerColor) diff --git a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift index f073a2adf6..3d0ce0ccfd 100644 --- a/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/Sources/ChatTextInputPanelNode.swift @@ -1045,11 +1045,22 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch var baseFontSize: CGFloat = 17.0 var keyboardAppearance: UIKeyboardAppearance = UIKeyboardAppearance.default if let presentationInterfaceState = self.presentationInterfaceState { + var lineStyle: ChatInputTextView.Theme.Quote.LineStyle = .solid + if let accountPeerColor = presentationInterfaceState.accountPeerColor { + switch accountPeerColor.style { + case .solid: + lineStyle = .solid + case .doubleDashed: + lineStyle = .doubleDashed + case .tripleDashed: + lineStyle = .tripleDashed + } + } textInputNode.textView.theme = ChatInputTextView.Theme( quote: ChatInputTextView.Theme.Quote( background: presentationInterfaceState.theme.list.itemAccentColor.withMultipliedAlpha(presentationInterfaceState.theme.overallDarkAppearance ? 0.2 : 0.1), foreground: presentationInterfaceState.theme.list.itemAccentColor, - isDashed: presentationInterfaceState.accountPeerColor?.isDashed == true + lineStyle: lineStyle ) ) @@ -1628,11 +1639,22 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch } if let textInputNode = self.textInputNode { + var lineStyle: ChatInputTextView.Theme.Quote.LineStyle = .solid + if let accountPeerColor = interfaceState.accountPeerColor { + switch accountPeerColor.style { + case .solid: + lineStyle = .solid + case .doubleDashed: + lineStyle = .doubleDashed + case .tripleDashed: + lineStyle = .tripleDashed + } + } textInputNode.textView.theme = ChatInputTextView.Theme( quote: ChatInputTextView.Theme.Quote( background: interfaceState.theme.list.itemAccentColor.withMultipliedAlpha(interfaceState.theme.overallDarkAppearance ? 0.2 : 0.1), foreground: interfaceState.theme.list.itemAccentColor, - isDashed: interfaceState.accountPeerColor?.isDashed == true + lineStyle: lineStyle ) ) } From 014e3d8b76e3add12cea14d2ec7b6811419f6f72 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 14:36:42 +0400 Subject: [PATCH 7/8] Name color improvements --- submodules/Display/Source/TextNode.swift | 84 ++++++++++++++----- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../ChatMessageAttachedContentNode.swift | 3 + .../Sources/ChatMessageBubbleItemNode.swift | 6 +- .../Sources/ChatMessageForwardInfoNode.swift | 13 +-- .../ChatMessageInstantVideoItemNode.swift | 2 +- ...atMessageInteractiveInstantVideoNode.swift | 2 +- .../Sources/ChatMessageStickerItemNode.swift | 2 +- .../ChatMessageTextBubbleContentNode.swift | 32 ++++--- .../Sources/StringWithAppliedEntities.swift | 4 +- 10 files changed, 101 insertions(+), 49 deletions(-) diff --git a/submodules/Display/Source/TextNode.swift b/submodules/Display/Source/TextNode.swift index 945c0d271d..33a5b16f94 100644 --- a/submodules/Display/Source/TextNode.swift +++ b/submodules/Display/Source/TextNode.swift @@ -71,11 +71,13 @@ public final class TextNodeBlockQuoteData: NSObject { public let title: NSAttributedString? public let color: UIColor public let secondaryColor: UIColor? + public let tertiaryColor: UIColor? - public init(title: NSAttributedString?, color: UIColor, secondaryColor: UIColor?) { + public init(title: NSAttributedString?, color: UIColor, secondaryColor: UIColor?, tertiaryColor: UIColor?) { self.title = title self.color = color self.secondaryColor = secondaryColor + self.tertiaryColor = tertiaryColor super.init() } @@ -102,6 +104,13 @@ public final class TextNodeBlockQuoteData: NSObject { } else if (self.secondaryColor == nil) != (other.secondaryColor == nil) { return false } + if let lhsTertiaryColor = self.tertiaryColor, let rhsTertiaryColor = other.tertiaryColor { + if !lhsTertiaryColor.isEqual(rhsTertiaryColor) { + return false + } + } else if (self.tertiaryColor == nil) != (other.tertiaryColor == nil) { + return false + } return true } @@ -141,11 +150,13 @@ private final class TextNodeBlockQuote { let frame: CGRect let tintColor: UIColor let secondaryTintColor: UIColor? + let tertiaryTintColor: UIColor? - init(frame: CGRect, tintColor: UIColor, secondaryTintColor: UIColor?) { + init(frame: CGRect, tintColor: UIColor, secondaryTintColor: UIColor?, tertiaryTintColor: UIColor?) { self.frame = frame self.tintColor = tintColor self.secondaryTintColor = secondaryTintColor + self.tertiaryTintColor = tertiaryTintColor } } @@ -1212,6 +1223,7 @@ open class TextNode: ASDisplayNode { let isBlockQuote: Bool let tintColor: UIColor? let secondaryTintColor: UIColor? + let tertiaryTintColor: UIColor? } var stringSegments: [StringSegment] = [] @@ -1235,7 +1247,8 @@ open class TextNode: ASDisplayNode { firstCharacterOffset: segmentCharacterOffset, isBlockQuote: false, tintColor: nil, - secondaryTintColor: nil + secondaryTintColor: nil, + tertiaryTintColor: nil )) } @@ -1247,7 +1260,8 @@ open class TextNode: ASDisplayNode { firstCharacterOffset: effectiveRange.location, isBlockQuote: true, tintColor: value.color, - secondaryTintColor: value.secondaryColor + secondaryTintColor: value.secondaryColor, + tertiaryTintColor: value.tertiaryColor )) } segmentCharacterOffset = effectiveRange.location + effectiveRange.length @@ -1261,7 +1275,8 @@ open class TextNode: ASDisplayNode { firstCharacterOffset: effectiveRange.location, isBlockQuote: false, tintColor: nil, - secondaryTintColor: nil + secondaryTintColor: nil, + tertiaryTintColor: nil )) segmentCharacterOffset = effectiveRange.location + effectiveRange.length } @@ -1277,7 +1292,8 @@ open class TextNode: ASDisplayNode { firstCharacterOffset: segmentCharacterOffset, isBlockQuote: false, tintColor: nil, - secondaryTintColor: nil + secondaryTintColor: nil, + tertiaryTintColor: nil )) } @@ -1290,6 +1306,7 @@ open class TextNode: ASDisplayNode { var lines: [TextNodeLine] = [] var tintColor: UIColor? var secondaryTintColor: UIColor? + var tertiaryTintColor: UIColor? var isBlockQuote: Bool = false var additionalWidth: CGFloat = 0.0 } @@ -1301,6 +1318,7 @@ open class TextNode: ASDisplayNode { calculatedSegment.isBlockQuote = segment.isBlockQuote calculatedSegment.tintColor = segment.tintColor calculatedSegment.secondaryTintColor = segment.secondaryTintColor + calculatedSegment.tertiaryTintColor = segment.tertiaryTintColor let rawSubstring = segment.substring.string as NSString let substringLength = rawSubstring.length @@ -1512,7 +1530,7 @@ open class TextNode: ASDisplayNode { } if segment.isBlockQuote, let tintColor = segment.tintColor { - blockQuotes.append(TextNodeBlockQuote(frame: CGRect(origin: CGPoint(x: 0.0, y: blockMinY - 2.0), size: CGSize(width: blockWidth, height: blockMaxY - (blockMinY - 2.0) + 4.0)), tintColor: tintColor, secondaryTintColor: segment.secondaryTintColor)) + blockQuotes.append(TextNodeBlockQuote(frame: CGRect(origin: CGPoint(x: 0.0, y: blockMinY - 2.0), size: CGSize(width: blockWidth, height: blockMaxY - (blockMinY - 2.0) + 4.0)), tintColor: tintColor, secondaryTintColor: segment.secondaryTintColor, tertiaryTintColor: segment.tertiaryTintColor)) } } @@ -2216,9 +2234,19 @@ open class TextNode: ASDisplayNode { if let secondaryTintColor = blockQuote.secondaryTintColor { let isMonochrome = secondaryTintColor.alpha == 0.0 + let tertiaryTintColor = blockQuote.tertiaryTintColor + let dashHeight: CGFloat = tertiaryTintColor != nil ? 6.0 : 9.0 + do { context.saveGState() - + + let dashOffset: CGFloat + if let _ = tertiaryTintColor { + dashOffset = isMonochrome ? -2.0 : 0.0 + } else { + dashOffset = isMonochrome ? -4.0 : 5.0 + } + if isMonochrome { context.setFillColor(blockQuote.tintColor.withMultipliedAlpha(0.2).cgColor) context.fill(lineFrame) @@ -2229,23 +2257,37 @@ open class TextNode: ASDisplayNode { context.setFillColor(secondaryTintColor.cgColor) } - let dashOffset: CGFloat = isMonochrome ? -4.0 : 5.0 - context.translateBy(x: blockFrame.minX, y: blockFrame.minY + dashOffset) - - var offset = 0.0 - while offset < blockFrame.height { - context.move(to: CGPoint(x: 0.0, y: 3.0)) - context.addLine(to: CGPoint(x: lineWidth, y: 0.0)) - context.addLine(to: CGPoint(x: lineWidth, y: 9.0)) - context.addLine(to: CGPoint(x: 0.0, y: 9.0 + 3.0)) - context.closePath() - context.fillPath() + func drawDashes() { + context.translateBy(x: blockFrame.minX, y: blockFrame.minY + dashOffset) - context.translateBy(x: 0.0, y: 18.0) - offset += 18.0 + var offset = 0.0 + while offset < blockFrame.height { + context.move(to: CGPoint(x: 0.0, y: 3.0)) + context.addLine(to: CGPoint(x: lineWidth, y: 0.0)) + context.addLine(to: CGPoint(x: lineWidth, y: dashHeight)) + context.addLine(to: CGPoint(x: 0.0, y: dashHeight + 3.0)) + context.closePath() + context.fillPath() + + context.translateBy(x: 0.0, y: 18.0) + offset += 18.0 + } } + drawDashes() context.restoreGState() + + if let tertiaryTintColor { + context.saveGState() + context.translateBy(x: 0.0, y: dashHeight) + if isMonochrome { + context.setFillColor(blockQuote.tintColor.withAlphaComponent(0.4).cgColor) + } else { + context.setFillColor(tertiaryTintColor.cgColor) + } + drawDashes() + context.restoreGState() + } } } else { context.setFillColor(blockQuote.tintColor.cgColor) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift index cfda050e1b..9a87f0b03b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -1213,7 +1213,7 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { } } let availableWidth = max(60.0, availableContentWidth + 6.0) - forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + forwardInfoSizeApply = makeForwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) } if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift index 940cdfe505..6ea8b4fa38 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAttachedContentNode/Sources/ChatMessageAttachedContentNode.swift @@ -187,6 +187,9 @@ public final class ChatMessageAttachedContentNode: ASDisplayNode { if let _ = nameColors?.secondary { secondaryColor = .clear } + if let _ = nameColors?.tertiary { + tertiaryColor = .clear + } } else { var authorNameColor: UIColor? authorNameColor = nameColors?.main diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift index 0ff3374a9c..8a8935a20b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageBubbleItemNode/Sources/ChatMessageBubbleItemNode.swift @@ -1260,7 +1260,7 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI authorNameLayout: (TextNodeLayoutArguments) -> (TextNodeLayout, () -> TextNode), adminBadgeLayout: (TextNodeLayoutArguments) -> (TextNodeLayout, () -> TextNode), threadInfoLayout: (ChatMessageThreadInfoNode.Arguments) -> (CGSize, (Bool) -> ChatMessageThreadInfoNode), - forwardInfoLayout: (ChatPresentationData, PresentationStrings, ChatMessageForwardInfoType, Peer?, String?, String?, ChatMessageForwardInfoNode.StoryData?, CGSize) -> (CGSize, (CGFloat) -> ChatMessageForwardInfoNode), + forwardInfoLayout: (AccountContext, ChatPresentationData, PresentationStrings, ChatMessageForwardInfoType, Peer?, String?, String?, ChatMessageForwardInfoNode.StoryData?, CGSize) -> (CGSize, (CGFloat) -> ChatMessageForwardInfoNode), replyInfoLayout: (ChatMessageReplyInfoNode.Arguments) -> (CGSize, (CGSize, Bool, ListViewItemUpdateAnimation) -> ChatMessageReplyInfoNode), actionButtonsLayout: (AccountContext, ChatPresentationThemeData, PresentationChatBubbleCorners, PresentationStrings, WallpaperBackgroundNode?, ReplyMarkupMessageAttribute, Message, CGFloat) -> (minWidth: CGFloat, layout: (CGFloat) -> (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageActionButtonsNode)), reactionButtonsLayout: (ChatMessageReactionButtonsNode.Arguments) -> (minWidth: CGFloat, layout: (CGFloat) -> (size: CGSize, apply: (ListViewItemUpdateAnimation) -> ChatMessageReactionButtonsNode)), @@ -2177,7 +2177,7 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI forwardAuthorSignature = forwardInfo.authorSignature } } - let sizeAndApply = forwardInfoLayout(item.presentationData, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) + let sizeAndApply = forwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) forwardInfoSizeApply = (sizeAndApply.0, { width in sizeAndApply.1(width) }) forwardInfoOriginY = headerSize.height @@ -2204,7 +2204,7 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI } } - let sizeAndApply = forwardInfoLayout(item.presentationData, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, nil, nil, ChatMessageForwardInfoNode.StoryData(storyType: storyType), CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) + let sizeAndApply = forwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .bubble(incoming: incoming), forwardSource, nil, nil, ChatMessageForwardInfoNode.StoryData(storyType: storyType), CGSize(width: maximumNodeWidth - layoutConstants.text.bubbleInsets.left - layoutConstants.text.bubbleInsets.right, height: CGFloat.greatestFiniteMagnitude)) forwardInfoSizeApply = (sizeAndApply.0, { width in sizeAndApply.1(width) }) if storyType != .regular { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift index e5e6ac4d4b..0359b0d89b 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageForwardInfoNode/Sources/ChatMessageForwardInfoNode.swift @@ -6,6 +6,7 @@ import Postbox import TelegramCore import TelegramPresentationData import LocalizedPeerData +import AccountContext public enum ChatMessageForwardInfoType: Equatable { case bubble(incoming: Bool) @@ -106,10 +107,10 @@ public class ChatMessageForwardInfoNode: ASDisplayNode { } } - public static func asyncLayout(_ maybeNode: ChatMessageForwardInfoNode?) -> (_ presentationData: ChatPresentationData, _ strings: PresentationStrings, _ type: ChatMessageForwardInfoType, _ peer: Peer?, _ authorName: String?, _ psaType: String?, _ storyData: StoryData?, _ constrainedSize: CGSize) -> (CGSize, (CGFloat) -> ChatMessageForwardInfoNode) { + public static func asyncLayout(_ maybeNode: ChatMessageForwardInfoNode?) -> (_ context: AccountContext, _ presentationData: ChatPresentationData, _ strings: PresentationStrings, _ type: ChatMessageForwardInfoType, _ peer: Peer?, _ authorName: String?, _ psaType: String?, _ storyData: StoryData?, _ constrainedSize: CGSize) -> (CGSize, (CGFloat) -> ChatMessageForwardInfoNode) { let textNodeLayout = TextNode.asyncLayout(maybeNode?.textNode) - return { presentationData, strings, type, peer, authorName, psaType, storyData, constrainedSize in + return { context, presentationData, strings, type, peer, authorName, psaType, storyData, constrainedSize in let fontSize = floor(presentationData.fontSize.baseDisplaySize * 13.0 / 17.0) let prefixFont = Font.regular(fontSize) let peerFont = Font.medium(fontSize) @@ -163,11 +164,11 @@ public class ChatMessageForwardInfoNode: ASDisplayNode { } } else { if incoming { -// if let color = peer?.nameColor?.color { -// titleColor = color -// } else { + if let nameColor = peer?.nameColor { + titleColor = context.peerNameColors.get(nameColor).main + } else { titleColor = presentationData.theme.theme.chat.message.incoming.accentTextColor -// } + } } else { titleColor = presentationData.theme.theme.chat.message.outgoing.accentTextColor } diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageInstantVideoItemNode/Sources/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageInstantVideoItemNode/Sources/ChatMessageInstantVideoItemNode.swift index ec6167071a..a62c2b382a 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageInstantVideoItemNode/Sources/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageInstantVideoItemNode/Sources/ChatMessageInstantVideoItemNode.swift @@ -567,7 +567,7 @@ public class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureReco } } let availableWidth = max(60.0, availableContentWidth - normalDisplaySize.width + 6.0) - forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + forwardInfoSizeApply = makeForwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) } if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil { diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift index eefebccc34..7215cdba22 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageInteractiveInstantVideoNode/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -432,7 +432,7 @@ public class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { } } let availableWidth: CGFloat = max(60.0, availableContentWidth - 210.0 + 6.0) - forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) + forwardInfoSizeApply = makeForwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)) } var notConsumed = false diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageStickerItemNode/Sources/ChatMessageStickerItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageStickerItemNode/Sources/ChatMessageStickerItemNode.swift index f31a4623bc..41da087b73 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageStickerItemNode/Sources/ChatMessageStickerItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageStickerItemNode/Sources/ChatMessageStickerItemNode.swift @@ -780,7 +780,7 @@ public class ChatMessageStickerItemNode: ChatMessageItemView { } } let availableForwardWidth = max(60.0, availableWidth + 6.0) - forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableForwardWidth, height: CGFloat.greatestFiniteMagnitude)) + forwardInfoSizeApply = makeForwardInfoLayout(item.context, item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, nil, CGSize(width: availableForwardWidth, height: CGFloat.greatestFiniteMagnitude)) } var needsReplyBackground = false diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift index d8abb87555..b8680f093a 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageTextBubbleContentNode/Sources/ChatMessageTextBubbleContentNode.swift @@ -380,27 +380,33 @@ public class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode { underlineLinks = false } -// let author = item.message.author + let author = item.message.author let mainColor: UIColor - let secondaryColor: UIColor? = nil + var secondaryColor: UIColor? = nil + var tertiaryColor: UIColor? = nil + + let nameColors = author?.nameColor.flatMap { item.context.peerNameColors.get($0) } if !incoming { mainColor = messageTheme.accentTextColor -// if let _ = author?.nameColor?.dashColors.1 { -// secondaryColor = .clear -// } + if let _ = nameColors?.secondary { + secondaryColor = .clear + } + if let _ = nameColors?.tertiary { + tertiaryColor = .clear + } } else { -// let authorNameColor: UIColor? -// authorNameColor = author?.nameColor?.color -// secondaryColor = author?.nameColor?.dashColors.1 + let authorNameColor = nameColors?.main + secondaryColor = nameColors?.secondary + tertiaryColor = nameColors?.tertiary -// if let authorNameColor { -// mainColor = authorNameColor -// } else { + if let authorNameColor { + mainColor = authorNameColor + } else { mainColor = messageTheme.accentTextColor -// } + } } - attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseQuoteTintColor: mainColor, baseQuoteSecondaryTintColor: secondaryColor, baseFont: textFont, linkFont: textFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, boldItalicFont: item.presentationData.messageBoldItalicFont, fixedFont: item.presentationData.messageFixedFont, blockQuoteFont: item.presentationData.messageBlockQuoteFont, underlineLinks: underlineLinks, message: item.message, adjustQuoteFontSize: true) + attributedText = stringWithAppliedEntities(rawText, entities: entities, baseColor: messageTheme.primaryTextColor, linkColor: messageTheme.linkTextColor, baseQuoteTintColor: mainColor, baseQuoteSecondaryTintColor: secondaryColor, baseQuoteTertiaryTintColor: tertiaryColor, baseFont: textFont, linkFont: textFont, boldFont: item.presentationData.messageBoldFont, italicFont: item.presentationData.messageItalicFont, boldItalicFont: item.presentationData.messageBoldItalicFont, fixedFont: item.presentationData.messageFixedFont, blockQuoteFont: item.presentationData.messageBlockQuoteFont, underlineLinks: underlineLinks, message: item.message, adjustQuoteFontSize: true) } else if !rawText.isEmpty { attributedText = NSAttributedString(string: rawText, font: textFont, textColor: messageTheme.primaryTextColor) } else { diff --git a/submodules/TextFormat/Sources/StringWithAppliedEntities.swift b/submodules/TextFormat/Sources/StringWithAppliedEntities.swift index 93f294f5ee..8b85559944 100644 --- a/submodules/TextFormat/Sources/StringWithAppliedEntities.swift +++ b/submodules/TextFormat/Sources/StringWithAppliedEntities.swift @@ -55,7 +55,7 @@ public func chatInputStateStringWithAppliedEntities(_ text: String, entities: [M return string } -public func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], baseColor: UIColor, linkColor: UIColor, baseQuoteTintColor: UIColor? = nil, baseQuoteSecondaryTintColor: UIColor? = nil, baseFont: UIFont, linkFont: UIFont, boldFont: UIFont, italicFont: UIFont, boldItalicFont: UIFont, fixedFont: UIFont, blockQuoteFont: UIFont, underlineLinks: Bool = true, external: Bool = false, message: Message?, entityFiles: [MediaId: TelegramMediaFile] = [:], adjustQuoteFontSize: Bool = false) -> NSAttributedString { +public func stringWithAppliedEntities(_ text: String, entities: [MessageTextEntity], baseColor: UIColor, linkColor: UIColor, baseQuoteTintColor: UIColor? = nil, baseQuoteSecondaryTintColor: UIColor? = nil, baseQuoteTertiaryTintColor: UIColor? = nil, baseFont: UIFont, linkFont: UIFont, boldFont: UIFont, italicFont: UIFont, boldItalicFont: UIFont, fixedFont: UIFont, blockQuoteFont: UIFont, underlineLinks: Bool = true, external: Bool = false, message: Message?, entityFiles: [MediaId: TelegramMediaFile] = [:], adjustQuoteFontSize: Bool = false) -> NSAttributedString { let baseQuoteTintColor = baseQuoteTintColor ?? baseColor var nsString: NSString? @@ -214,7 +214,7 @@ public func stringWithAppliedEntities(_ text: String, entities: [MessageTextEnti case .BlockQuote: addFontAttributes(range, .blockQuote) - string.addAttribute(NSAttributedString.Key(rawValue: "Attribute__Blockquote"), value: TextNodeBlockQuoteData(title: nil, color: baseQuoteTintColor, secondaryColor: baseQuoteSecondaryTintColor), range: range) + string.addAttribute(NSAttributedString.Key(rawValue: "Attribute__Blockquote"), value: TextNodeBlockQuoteData(title: nil, color: baseQuoteTintColor, secondaryColor: baseQuoteSecondaryTintColor, tertiaryColor: baseQuoteTertiaryTintColor), range: range) case .BankCard: string.addAttribute(NSAttributedString.Key.foregroundColor, value: linkColor, range: range) if underlineLinks && underlineAllLinks { From 9e8bf48a962ac24a0c7ca00a5f6cb05ebb8aaabd Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Oct 2023 15:54:27 +0400 Subject: [PATCH 8/8] Various fixes --- .../Telegram-iOS/en.lproj/Localizable.strings | 8 +++-- .../Sources/PremiumGiftCodeScreen.swift | 16 ++++++++- .../Sources/PremiumIntroScreen.swift | 8 +++-- .../Sources/State/ChannelBoost.swift | 16 ++++++--- .../Peers/ChannelAdminEventLogs.swift | 10 +++--- .../ChatRecentActionsHistoryTransition.swift | 35 ++++++++++++------- .../TelegramUI/Sources/OpenResolvedUrl.swift | 21 +++++++---- 7 files changed, 80 insertions(+), 34 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 2dbf0e08e9..fda6b2b4a3 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -10119,6 +10119,7 @@ Sorry for the inconvenience."; "Channel.AdminLog.MessageChangedNameColorSet" = "%1$@ set name color to %2$@"; "Channel.AdminLog.MessageChangedBackgroundEmojiSet" = "%1$@ set background emoji to %2$@"; +"Channel.AdminLog.MessageChangedBackgroundEmojiRemoved" = "%1$@ removed background emoji"; "Appearance.NameColor" = "Your Name Color"; @@ -10277,7 +10278,8 @@ Sorry for the inconvenience."; "BoostGift.Channels.Save" = "Save Channels"; "Stats.Boosts.PrepaidGiveawaysTitle" = "PREPAID GIVEAWAYS"; -"Stats.Boosts.PrepaidGiveawayCount_any" = "%@ Telegram Premium"; +"Stats.Boosts.PrepaidGiveawayCount_1" = "%@ Telegram Premium"; +"Stats.Boosts.PrepaidGiveawayCount_any" = "%@ Telegram Premiums"; "Stats.Boosts.PrepaidGiveawayMonths" = "%@-month subscriptions"; "Stats.Boosts.PrepaidGiveawaysInfo" = "Select a giveaway you already paid for to set it up."; "Stats.Boosts.ShortMonth" = "%@m"; @@ -10361,9 +10363,9 @@ Sorry for the inconvenience."; "Chat.Giveaway.Message.PrizeTitle" = "Giveaway Prizes"; "Chat.Giveaway.Message.PrizeText" = "%1$@ for %2$@."; "Chat.Giveaway.Message.Subscriptions_1" = "**%@** Telegram Premium Subscription"; -"Chat.Giveaway.Message.Subscriptions_many" = "**%@** Telegram Premium Subscriptions"; +"Chat.Giveaway.Message.Subscriptions_any" = "**%@** Telegram Premium Subscriptions"; "Chat.Giveaway.Message.Months_1" = "**%@** month"; -"Chat.Giveaway.Message.Months_many" = "**%@** months"; +"Chat.Giveaway.Message.Months_any" = "**%@** months"; "Chat.Giveaway.Message.ParticipantsTitle" = "Participants"; "Chat.Giveaway.Message.ParticipantsNewMany" = "All users who join the channels below after this date:"; "Chat.Giveaway.Message.ParticipantsNew" = "All users who join this channel after this date:"; diff --git a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift index 2483913cea..05735b2d65 100644 --- a/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumGiftCodeScreen.swift @@ -76,6 +76,8 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { var cachedCloseImage: (UIImage, PresentationTheme)? + var inProgress = false + init(context: AccountContext, subject: PremiumGiftCodeScreen.Subject) { self.context = context @@ -426,9 +428,14 @@ private final class PremiumGiftCodeSheetContent: CombinedComponent { iconName: nil, animationName: nil, iconPosition: .left, - action: { + isLoading: state.inProgress, + action: { [weak state] in if gloss { component.action() + if let state { + state.inProgress = true + state.updated() + } } else { component.cancel(true) } @@ -559,6 +566,7 @@ private final class PremiumGiftCodeSheetComponent: CombinedComponent { displayHiddenTooltip: context.component.displayHiddenTooltip )), backgroundColor: .color(environment.theme.actionSheet.opaqueItemBackgroundColor), + followContentSizeChanges: true, animateOut: animateOut ), environment: { @@ -685,6 +693,12 @@ public class PremiumGiftCodeScreen: ViewControllerComponentContainer { self.dismissAllTooltips() } + public func dismissAnimated() { + if let view = self.node.hostView.findTaggedView(tag: SheetComponent.View.Tag()) as? SheetComponent.View { + view.dismissAnimated() + } + } + fileprivate func dismissAllTooltips() { self.window?.forEachController({ controller in if let controller = controller as? UndoOverlayController { diff --git a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift index 7f5efd8006..e09ac732c2 100644 --- a/submodules/PremiumUI/Sources/PremiumIntroScreen.swift +++ b/submodules/PremiumUI/Sources/PremiumIntroScreen.swift @@ -2915,8 +2915,8 @@ public final class PremiumIntroScreen: ViewControllerComponentContainer { } completionImpl = { [weak self] in - if let strongSelf = self { - strongSelf.view.addSubview(ConfettiView(frame: strongSelf.view.bounds)) + if let self { + self.animateSuccess() } } } @@ -2930,6 +2930,10 @@ public final class PremiumIntroScreen: ViewControllerComponentContainer { self.wasDismissed?() } + public func animateSuccess() { + self.view.addSubview(ConfettiView(frame: self.view.bounds)) + } + public override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { super.containerLayoutUpdated(layout, transition: transition) diff --git a/submodules/TelegramCore/Sources/State/ChannelBoost.swift b/submodules/TelegramCore/Sources/State/ChannelBoost.swift index d8f029873a..f1dc466a55 100644 --- a/submodules/TelegramCore/Sources/State/ChannelBoost.swift +++ b/submodules/TelegramCore/Sources/State/ChannelBoost.swift @@ -219,7 +219,7 @@ private final class ChannelBoostersContextImpl { } func loadMore() { - if self.isLoadingMore { + if self.isLoadingMore || !self.canLoadMore { return } self.isLoadingMore = true @@ -312,11 +312,19 @@ private final class ChannelBoostersContextImpl { } strongSelf.isLoadingMore = false strongSelf.hasLoadedOnce = true - strongSelf.canLoadMore = !boosters.isEmpty + strongSelf.canLoadMore = !boosters.isEmpty && nextOffset != nil if strongSelf.canLoadMore { - strongSelf.count = max(updatedCount, Int32(strongSelf.results.count)) + var resultsCount: Int32 = 0 + for result in strongSelf.results { + resultsCount += result.multiplier + } + strongSelf.count = max(updatedCount, resultsCount) } else { - strongSelf.count = Int32(strongSelf.results.count) + var resultsCount: Int32 = 0 + for result in strongSelf.results { + resultsCount += result.multiplier + } + strongSelf.count = resultsCount } strongSelf.updateState() })) diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelAdminEventLogs.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelAdminEventLogs.swift index 9db5461bc0..924d47c179 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelAdminEventLogs.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/ChannelAdminEventLogs.swift @@ -348,12 +348,10 @@ func channelAdminLogEvents(accountPeerId: PeerId, postbox: Postbox, network: Net action = .toggleForum(isForum: newValue == .boolTrue) case let .channelAdminLogEventActionToggleAntiSpam(newValue): action = .toggleAntiSpam(isEnabled: newValue == .boolTrue) - default: - action = .toggleInvites(false) -// case let .channelAdminLogEventActionChangeColor(prevValue, newValue): -// action = .changeNameColor(prev: PeerNameColor(rawValue: prevValue), new: PeerNameColor(rawValue: newValue)) -// case let .channelAdminLogEventActionChangeBackgroundEmoji(prevValue, newValue): -// action = .changeBackgroundEmojiId(prev: prevValue, new: newValue) + case let .channelAdminLogEventActionChangeColor(prevValue, newValue): + action = .changeNameColor(prev: PeerNameColor(rawValue: prevValue), new: PeerNameColor(rawValue: newValue)) + case let .channelAdminLogEventActionChangeBackgroundEmoji(prevValue, newValue): + action = .changeBackgroundEmojiId(prev: prevValue, new: newValue) } let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(userId)) if let action = action { diff --git a/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsHistoryTransition.swift b/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsHistoryTransition.swift index 5befa727b0..664f73eab7 100644 --- a/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsHistoryTransition.swift +++ b/submodules/TelegramUI/Components/Chat/ChatRecentActionsController/Sources/ChatRecentActionsHistoryTransition.swift @@ -1873,7 +1873,9 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { var text: String = "" var entities: [MessageTextEntity] = [] - let rawText = self.presentationData.strings.Channel_AdminLog_MessageChangedNameColorSet(author.flatMap(EnginePeer.init)?.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) ?? "", "\(updatedValue)") + let _ = updatedValue + + let rawText = self.presentationData.strings.Channel_AdminLog_MessageChangedNameColorSet(author.flatMap(EnginePeer.init)?.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) ?? "", "●") appendAttributedText(text: rawText, generateEntities: { index in if index == 0, let author = author { @@ -1899,17 +1901,26 @@ struct ChatRecentActionsEntry: Comparable, Identifiable { var text: String = "" var entities: [MessageTextEntity] = [] - let rawText = self.presentationData.strings.Channel_AdminLog_MessageChangedBackgroundEmojiSet(author.flatMap(EnginePeer.init)?.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) ?? "", "\(updatedValue ?? 0)") - - appendAttributedText(text: rawText, generateEntities: { index in - if index == 0, let author = author { - return [.TextMention(peerId: author.id)] - } else if index == 1 { - return [.Bold] - } - return [] - }, to: &text, entities: &entities) - + if let updatedValue, updatedValue != 0 { + appendAttributedText(text: self.presentationData.strings.Channel_AdminLog_MessageChangedBackgroundEmojiSet(author.flatMap(EnginePeer.init)?.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) ?? "", "."), generateEntities: { index in + if index == 0, let author = author { + return [.TextMention(peerId: author.id)] + } else if index == 1 { + return [.CustomEmoji(stickerPack: nil, fileId: updatedValue)] + } + return [] + }, to: &text, entities: &entities) + } else { + let rawText = self.presentationData.strings.Channel_AdminLog_MessageChangedBackgroundEmojiRemoved(author.flatMap(EnginePeer.init)?.displayTitle(strings: self.presentationData.strings, displayOrder: self.presentationData.nameDisplayOrder) ?? "") + + appendAttributedText(text: rawText, generateEntities: { index in + if index == 0, let author = author { + return [.TextMention(peerId: author.id)] + } + return [] + }, to: &text, entities: &entities) + } + let action = TelegramMediaActionType.customText(text: text, entities: entities) let message = Message(stableId: self.entry.stableId, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: Namespaces.Message.Cloud, id: Int32(bitPattern: self.entry.stableId)), globallyUniqueId: self.entry.event.id, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: self.entry.event.date, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: author, text: "", attributes: [], media: [TelegramMediaAction(action: action)], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:], associatedThreadInfo: nil, associatedStories: [:]) diff --git a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift index f87ae12873..cb9ddd4ba5 100644 --- a/submodules/TelegramUI/Sources/OpenResolvedUrl.swift +++ b/submodules/TelegramUI/Sources/OpenResolvedUrl.swift @@ -891,17 +891,26 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur forceDark = true } let _ = (context.engine.payments.checkPremiumGiftCode(slug: slug) - |> deliverOnMainQueue).startStandalone(next: { giftCode in + |> deliverOnMainQueue).startStandalone(next: { [weak navigationController] giftCode in if let giftCode { var dismissImpl: (() -> Void)? let controller = PremiumGiftCodeScreen( context: context, subject: .giftCode(giftCode), forceDark: forceDark, - action: { - dismissImpl?() - - let _ = context.engine.payments.applyPremiumGiftCode(slug: slug).startStandalone() + action: { [weak navigationController] in + let _ = (context.engine.payments.applyPremiumGiftCode(slug: slug) + |> deliverOnMainQueue).startStandalone(completed: { + dismissImpl?() + + let controller = context.sharedContext.makePremiumIntroController(context: context, source: .settings, forceDark: forceDark, dismissed: nil) + navigationController?.pushViewController(controller) + if let controller = controller as? PremiumIntroScreen { + Queue.mainQueue().after(0.3, { + controller.animateSuccess() + }) + } + }) }, openPeer: { peer in if peer.id != context.account.peerId { @@ -941,7 +950,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur } ) dismissImpl = { [weak controller] in - controller?.dismiss() + controller?.dismissAnimated() } navigationController?.pushViewController(controller) } else {