Skip to content

Commit 4aeab37

Browse files
committed
Various improvements
1 parent b235119 commit 4aeab37

File tree

16 files changed

+250
-33
lines changed

16 files changed

+250
-33
lines changed

Telegram/Telegram-iOS/en.lproj/Localizable.strings

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13876,3 +13876,11 @@ Sorry for the inconvenience.";
1387613876
"Chat.PanelCustomStatusShortInfo" = "%@ is a mark for [Premium subscribers >]()";
1387713877

1387813878
"Chat.InputTextPaidMessagePlaceholder" = "Message for %@";
13879+
13880+
"Privacy.Messages.Stars_1" = "%@ Star";
13881+
"Privacy.Messages.Stars_any" = "%@ Stars";
13882+
"Privacy.Messages.Unlock" = "Unlock with Telegram Premium";
13883+
13884+
"Premium.PaidMessages" = "Paid Messages";
13885+
"Premium.PaidMessagesInfo" = "Charge a fee for messages from non-contacts or new senders.";
13886+
"Premium.PaidMessages.Proceed" = "About Telegram Premium";

submodules/AccountContext/Sources/AccountContext.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,25 +1357,29 @@ public struct StarsSubscriptionConfiguration {
13571357
maxFee: 2500,
13581358
usdWithdrawRate: 1200,
13591359
paidMessageMaxAmount: 10000,
1360-
paidMessageCommissionPermille: 850
1360+
paidMessageCommissionPermille: 850,
1361+
paidMessagesAvailable: false
13611362
)
13621363
}
1363-
1364+
13641365
public let maxFee: Int64
13651366
public let usdWithdrawRate: Int64
13661367
public let paidMessageMaxAmount: Int64
13671368
public let paidMessageCommissionPermille: Int32
1369+
public let paidMessagesAvailable: Bool
13681370

13691371
fileprivate init(
13701372
maxFee: Int64,
13711373
usdWithdrawRate: Int64,
13721374
paidMessageMaxAmount: Int64,
1373-
paidMessageCommissionPermille: Int32
1375+
paidMessageCommissionPermille: Int32,
1376+
paidMessagesAvailable: Bool
13741377
) {
13751378
self.maxFee = maxFee
13761379
self.usdWithdrawRate = usdWithdrawRate
13771380
self.paidMessageMaxAmount = paidMessageMaxAmount
13781381
self.paidMessageCommissionPermille = paidMessageCommissionPermille
1382+
self.paidMessagesAvailable = paidMessagesAvailable
13791383
}
13801384

13811385
public static func with(appConfiguration: AppConfiguration) -> StarsSubscriptionConfiguration {
@@ -1384,11 +1388,14 @@ public struct StarsSubscriptionConfiguration {
13841388
let usdWithdrawRate = (data["stars_usd_withdraw_rate_x1000"] as? Double).flatMap(Int64.init) ?? StarsSubscriptionConfiguration.defaultValue.usdWithdrawRate
13851389
let paidMessageMaxAmount = (data["stars_paid_message_amount_max"] as? Double).flatMap(Int64.init) ?? StarsSubscriptionConfiguration.defaultValue.paidMessageMaxAmount
13861390
let paidMessageCommissionPermille = (data["stars_paid_message_commission_permille"] as? Double).flatMap(Int32.init) ?? StarsSubscriptionConfiguration.defaultValue.paidMessageCommissionPermille
1391+
let paidMessagesAvailable = (data["stars_paid_messages_available"] as? Bool) ?? StarsSubscriptionConfiguration.defaultValue.paidMessagesAvailable
1392+
13871393
return StarsSubscriptionConfiguration(
13881394
maxFee: maxFee,
13891395
usdWithdrawRate: usdWithdrawRate,
13901396
paidMessageMaxAmount: paidMessageMaxAmount,
1391-
paidMessageCommissionPermille: paidMessageCommissionPermille
1397+
paidMessageCommissionPermille: paidMessageCommissionPermille,
1398+
paidMessagesAvailable: paidMessagesAvailable
13921399
)
13931400
} else {
13941401
return .defaultValue

submodules/AccountContext/Sources/Premium.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public enum PremiumIntroSource {
4242
case folderTags
4343
case animatedEmoji
4444
case messageEffects
45+
case paidMessages
4546
}
4647

4748
public enum PremiumGiftSource: Equatable {
@@ -79,6 +80,7 @@ public enum PremiumDemoSubject {
7980
case folderTags
8081
case business
8182
case messageEffects
83+
case paidMessages
8284

8385
case businessLocation
8486
case businessHours

submodules/ItemListUI/Sources/Items/ItemListCheckboxItem.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,8 @@ public class ItemListCheckboxItemNode: ItemListRevealOptionsItemNode {
347347
iconFrame = CGRect(origin: CGPoint(x: params.leftInset + floor((leftInset - params.leftInset - iconSize.width) / 2.0), y: floor((contentSize.height - iconSize.height) / 2.0)), size: iconSize)
348348
}
349349
strongSelf.imageNode.frame = iconFrame
350+
} else {
351+
strongSelf.imageNode.image = nil
350352
}
351353

352354
strongSelf.highlightedBackgroundNode.frame = CGRect(origin: CGPoint(x: 0.0, y: -UIScreenPixel), size: CGSize(width: params.width, height: strongSelf.backgroundNode.frame.height + UIScreenPixel + UIScreenPixel))

submodules/LegacyComponents/Sources/TGPhotoEditorSliderView.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ - (void)drawRect:(CGRect)__unused rect
141141
if (vertical)
142142
startPosition = 2 * visualMargin + visualTotalLength - startPosition;
143143

144-
CGFloat endPosition = visualMargin + visualTotalLength / (_maximumValue - _minimumValue) * (ABS(_minimumValue) + 1.0);
144+
CGFloat endPosition = visualMargin + visualTotalLength / (_maximumValue - _minimumValue) * (ABS(_minimumValue) + _maximumValue);
145145
if (vertical)
146146
endPosition = 2 * visualMargin + visualTotalLength - endPosition;
147147

submodules/PeerInfoUI/Sources/ChannelPermissionsController.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ private enum ChannelPermissionsEntry: ItemListNodeEntry {
9393
case chargeForMessagesInfo(PresentationTheme, String)
9494

9595
case messagePriceHeader(PresentationTheme, String)
96-
case messagePrice(PresentationTheme, Int64, String)
96+
case messagePrice(PresentationTheme, Int64, Int64, String)
9797
case messagePriceInfo(PresentationTheme, String)
9898

9999
case unrestrictBoostersSwitch(PresentationTheme, String, Bool)
@@ -241,8 +241,8 @@ private enum ChannelPermissionsEntry: ItemListNodeEntry {
241241
} else {
242242
return false
243243
}
244-
case let .messagePrice(lhsTheme, lhsValue, lhsPrice):
245-
if case let .messagePrice(rhsTheme, rhsValue, rhsPrice) = rhs, lhsTheme === rhsTheme, lhsValue == rhsValue, lhsPrice == rhsPrice {
244+
case let .messagePrice(lhsTheme, lhsValue, lhsMaxValue, lhsPrice):
245+
if case let .messagePrice(rhsTheme, rhsValue, rhsMaxValue, rhsPrice) = rhs, lhsTheme === rhsTheme, lhsValue == rhsValue, lhsMaxValue == rhsMaxValue, lhsPrice == rhsPrice {
246246
return true
247247
} else {
248248
return false
@@ -424,8 +424,8 @@ private enum ChannelPermissionsEntry: ItemListNodeEntry {
424424
return ItemListTextItem(presentationData: presentationData, text: .plain(value), sectionId: self.section)
425425
case let .messagePriceHeader(_, value):
426426
return ItemListSectionHeaderItem(presentationData: presentationData, text: value, sectionId: self.section)
427-
case let .messagePrice(_, value, price):
428-
return MessagePriceItem(theme: presentationData.theme, strings: presentationData.strings, minValue: 1, maxValue: 10000, value: value, price: price, sectionId: self.section, updated: { value in
427+
case let .messagePrice(_, value, maxValue, price):
428+
return MessagePriceItem(theme: presentationData.theme, strings: presentationData.strings, isEnabled: true, minValue: 1, maxValue: maxValue, value: value, price: price, sectionId: self.section, updated: { value in
429429
arguments.updateStarsAmount(StarsAmount(value: value, nanos: 0))
430430
})
431431
case let .messagePriceInfo(_, value):
@@ -733,7 +733,7 @@ private func channelPermissionsControllerEntries(context: AccountContext, presen
733733
price = "\(formatTonUsdValue(sendPaidMessageStars, divide: false, rate: usdRate, dateTimeFormat: presentationData.dateTimeFormat))"
734734

735735
entries.append(.messagePriceHeader(presentationData.theme, presentationData.strings.GroupInfo_Permissions_MessagePrice))
736-
entries.append(.messagePrice(presentationData.theme, sendPaidMessageStars, price))
736+
entries.append(.messagePrice(presentationData.theme, sendPaidMessageStars, configuration.paidMessageMaxAmount, price))
737737
entries.append(.messagePriceInfo(presentationData.theme, presentationData.strings.GroupInfo_Permissions_MessagePriceInfo("\(configuration.paidMessageCommissionPermille / 10)", price).string))
738738
}
739739
}

submodules/PremiumUI/Sources/PremiumDemoScreen.swift

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,25 @@ private final class DemoSheetContent: CombinedComponent {
10991099
)
11001100
)
11011101

1102+
availableItems[.paidMessages] = DemoPagerComponent.Item(
1103+
AnyComponentWithIdentity(
1104+
id: PremiumDemoScreen.Subject.paidMessages,
1105+
component: AnyComponent(
1106+
PageComponent(
1107+
content: AnyComponent(PhoneDemoComponent(
1108+
context: component.context,
1109+
position: .top,
1110+
videoFile: configuration.videos["paid_messages"],
1111+
decoration: .badgeStars
1112+
)),
1113+
title: strings.Premium_PaidMessages,
1114+
text: strings.Premium_PaidMessagesInfo,
1115+
textColor: textColor
1116+
)
1117+
)
1118+
)
1119+
)
1120+
11021121
let index: Int = 0
11031122
var items: [DemoPagerComponent.Item] = []
11041123
if let item = availableItems.first(where: { $0.value.content.id == component.subject as AnyHashable }) {
@@ -1195,6 +1214,8 @@ private final class DemoSheetContent: CombinedComponent {
11951214
text = strings.Premium_FolderTagsStandaloneInfo
11961215
case .messageEffects:
11971216
text = strings.Premium_MessageEffectsInfo
1217+
case .paidMessages:
1218+
text = strings.Premium_PaidMessagesInfo
11981219
default:
11991220
text = ""
12001221
}
@@ -1279,6 +1300,9 @@ private final class DemoSheetContent: CombinedComponent {
12791300
case .emojiStatus:
12801301
buttonText = strings.Premium_EmojiStatus_Proceed
12811302
buttonAnimationName = "premium_unlock"
1303+
case .paidMessages:
1304+
buttonText = strings.Premium_PaidMessages_Proceed
1305+
buttonAnimationName = "premium_unlock"
12821306
default:
12831307
buttonText = strings.Common_OK
12841308
}
@@ -1468,6 +1492,7 @@ public class PremiumDemoScreen: ViewControllerComponentContainer {
14681492
case business
14691493
case folderTags
14701494
case messageEffects
1495+
case paidMessages
14711496

14721497
case businessLocation
14731498
case businessHours
@@ -1526,6 +1551,8 @@ public class PremiumDemoScreen: ViewControllerComponentContainer {
15261551
return .folderTags
15271552
case .messageEffects:
15281553
return .messageEffects
1554+
case .paidMessages:
1555+
return .paidMessages
15291556
case .businessLocation:
15301557
return .businessLocation
15311558
case .businessHours:

submodules/PremiumUI/Sources/PremiumGiftScreen.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent {
433433
UIColor(rgb: 0xdb374b),
434434
UIColor(rgb: 0xcb3e6d),
435435
UIColor(rgb: 0xbc4395),
436+
UIColor(rgb: 0xbc4395),
436437
UIColor(rgb: 0xab4ac4),
437438
UIColor(rgb: 0xab4ac4),
438439
UIColor(rgb: 0xa34cd7),
@@ -538,6 +539,8 @@ private final class PremiumGiftScreenContentComponent: CombinedComponent {
538539
demoSubject = .messagePrivacy
539540
case .messageEffects:
540541
demoSubject = .messageEffects
542+
case .paidMessages:
543+
demoSubject = .paidMessages
541544
case .business:
542545
demoSubject = .business
543546
default:

submodules/PremiumUI/Sources/PremiumIntroScreen.swift

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,12 @@ public enum PremiumSource: Equatable {
302302
} else {
303303
return false
304304
}
305+
case .paidMessages:
306+
if case .messageEffects = rhs {
307+
return true
308+
} else {
309+
return false
310+
}
305311
}
306312
}
307313

@@ -349,6 +355,7 @@ public enum PremiumSource: Equatable {
349355
case messageTags
350356
case folderTags
351357
case messageEffects
358+
case paidMessages
352359

353360
var identifier: String? {
354361
switch self {
@@ -442,6 +449,8 @@ public enum PremiumSource: Equatable {
442449
return "folder_tags"
443450
case .messageEffects:
444451
return "effects"
452+
case .paidMessages:
453+
return "paid_messages"
445454
}
446455
}
447456
}
@@ -470,6 +479,7 @@ public enum PremiumPerk: CaseIterable {
470479
case business
471480
case folderTags
472481
case messageEffects
482+
case paidMessages
473483

474484
case businessLocation
475485
case businessHours
@@ -504,7 +514,8 @@ public enum PremiumPerk: CaseIterable {
504514
.messagePrivacy,
505515
.folderTags,
506516
.business,
507-
.messageEffects
517+
.messageEffects,
518+
.paidMessages
508519
]
509520
}
510521

@@ -578,6 +589,8 @@ public enum PremiumPerk: CaseIterable {
578589
return "folder_tags"
579590
case .messageEffects:
580591
return "effects"
592+
case .paidMessages:
593+
return "paid_messages"
581594
case .business:
582595
return "business"
583596
case .businessLocation:
@@ -647,6 +660,8 @@ public enum PremiumPerk: CaseIterable {
647660
return strings.Premium_Business
648661
case .messageEffects:
649662
return strings.Premium_MessageEffects
663+
case .paidMessages:
664+
return strings.Premium_PaidMessages
650665
case .businessLocation:
651666
return strings.Business_Location
652667
case .businessHours:
@@ -714,6 +729,8 @@ public enum PremiumPerk: CaseIterable {
714729
return strings.Premium_BusinessInfo
715730
case .messageEffects:
716731
return strings.Premium_MessageEffectsInfo
732+
case .paidMessages:
733+
return strings.Premium_PaidMessagesInfo
717734
case .businessLocation:
718735
return strings.Business_LocationInfo
719736
case .businessHours:
@@ -781,7 +798,8 @@ public enum PremiumPerk: CaseIterable {
781798
return "Premium/Perk/Business"
782799
case .messageEffects:
783800
return "Premium/Perk/MessageEffects"
784-
801+
case .paidMessages:
802+
return "Premium/Perk/PaidMessages"
785803
case .businessLocation:
786804
return "Premium/BusinessPerk/Location"
787805
case .businessHours:
@@ -819,6 +837,7 @@ struct PremiumIntroConfiguration {
819837
.colors,
820838
.wallpapers,
821839
.profileBadge,
840+
.paidMessages,
822841
.messagePrivacy,
823842
.advancedChatManagement,
824843
.noAds,
@@ -867,6 +886,12 @@ struct PremiumIntroConfiguration {
867886
perks = PremiumIntroConfiguration.defaultValue.perks
868887
}
869888

889+
#if DEBUG
890+
if !perks.contains(.paidMessages) {
891+
perks.append(.paidMessages)
892+
}
893+
#endif
894+
870895
var businessPerks: [PremiumPerk] = []
871896
if let values = data["business_promo_order"] as? [String] {
872897
for value in values {
@@ -1859,6 +1884,7 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent {
18591884
UIColor(rgb: 0xdb374b),
18601885
UIColor(rgb: 0xcb3e6d),
18611886
UIColor(rgb: 0xbc4395),
1887+
UIColor(rgb: 0xbc4395),
18621888
UIColor(rgb: 0xab4ac4),
18631889
UIColor(rgb: 0xab4ac4),
18641890
UIColor(rgb: 0xa34cd7),
@@ -2092,6 +2118,8 @@ private final class PremiumIntroScreenContentComponent: CombinedComponent {
20922118
demoSubject = .messagePrivacy
20932119
case .messageEffects:
20942120
demoSubject = .messageEffects
2121+
case .paidMessages:
2122+
demoSubject = .paidMessages
20952123
case .business:
20962124
demoSubject = .business
20972125
let _ = ApplicationSpecificNotice.setDismissedBusinessBadge(accountManager: accountContext.sharedContext.accountManager).startStandalone()

submodules/PremiumUI/Sources/PremiumLimitsListScreen.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,24 @@ public class PremiumLimitsListScreen: ViewController {
842842
)
843843
)
844844
)
845+
availableItems[.paidMessages] = DemoPagerComponent.Item(
846+
AnyComponentWithIdentity(
847+
id: PremiumDemoScreen.Subject.paidMessages,
848+
component: AnyComponent(
849+
PageComponent(
850+
content: AnyComponent(PhoneDemoComponent(
851+
context: context,
852+
position: .top,
853+
videoFile: videos["paid_messages"],
854+
decoration: .badgeStars
855+
)),
856+
title: strings.Premium_PaidMessages,
857+
text: strings.Premium_PaidMessagesInfo,
858+
textColor: textColor
859+
)
860+
)
861+
)
862+
)
845863
availableItems[.business] = DemoPagerComponent.Item(
846864
AnyComponentWithIdentity(
847865
id: PremiumDemoScreen.Subject.business,

0 commit comments

Comments
 (0)