Skip to content

Commit 7377b81

Browse files
author
Isaac
committed
Various improvements
1 parent bc1d03c commit 7377b81

File tree

10 files changed

+262
-143
lines changed

10 files changed

+262
-143
lines changed

submodules/PremiumUI/Sources/BadgeLabelView.swift

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ private let labelWidth: CGFloat = 16.0
77
private let labelHeight: CGFloat = 36.0
88
private let labelSize = CGSize(width: labelWidth, height: labelHeight)
99
private let font = Font.with(size: 24.0, design: .round, weight: .semibold, traits: [])
10+
private let suffixFont = Font.with(size: 22.0, design: .regular, weight: .regular, traits: [])
1011

1112
final class BadgeLabelView: UIView {
1213
private class StackView: UIView {
@@ -76,7 +77,9 @@ final class BadgeLabelView: UIView {
7677
}
7778

7879
private var itemViews: [Int: StackView] = [:]
79-
private var staticLabel = UILabel()
80+
private var staticLabel = ImmediateTextNode()
81+
82+
private var params: (value: String, suffix: String?)?
8083

8184
init() {
8285
super.init(frame: .zero)
@@ -91,31 +94,49 @@ final class BadgeLabelView: UIView {
9194

9295
var color: UIColor = .white {
9396
didSet {
94-
self.staticLabel.textColor = self.color
97+
if let params {
98+
self.staticLabel.attributedText = BadgeLabelView.makeText(value: params.value, suffix: params.suffix, color: self.color)
99+
let _ = self.staticLabel.updateLayout(CGSize(width: 1000.0, height: 1000.0))
100+
}
95101
for (_, view) in self.itemViews {
96102
view.color = self.color
97103
}
98104
}
99105
}
100106

101-
func update(value: String, transition: ComponentTransition) -> CGSize {
102-
if value.contains(" ") || value.contains(".") || value.contains(where: { !$0.isNumber }) {
107+
static func makeText(value: String, suffix: String?, color: UIColor) -> NSAttributedString {
108+
let string = NSMutableAttributedString()
109+
string.append(NSAttributedString(string: value, font: font, textColor: color))
110+
if let suffix {
111+
string.append(NSAttributedString(string: suffix, font: suffixFont, textColor: color.withMultipliedAlpha(0.6)))
112+
}
113+
return string
114+
}
115+
116+
static func calculateSize(value: String, suffix: String?) -> CGSize {
117+
let textView = ImmediateTextView()
118+
textView.attributedText = BadgeLabelView.makeText(value: value, suffix: suffix, color: .black)
119+
return textView.updateLayout(CGSize(width: 1000.0, height: 1000.0))
120+
}
121+
122+
func update(value: String, suffix: String?, transition: ComponentTransition) -> CGSize {
123+
self.params = (value, suffix)
124+
125+
if value.contains(" ") || value.contains(".") || value.contains(where: { !$0.isNumber }) || suffix != nil {
103126
for (_, view) in self.itemViews {
104127
view.isHidden = true
105128
}
106129

107-
if self.staticLabel.superview == nil {
108-
self.staticLabel.textColor = self.color
109-
self.staticLabel.font = font
110-
111-
self.addSubview(self.staticLabel)
130+
if self.staticLabel.view.superview == nil {
131+
self.addSubview(self.staticLabel.view)
112132
}
113133

114-
self.staticLabel.text = value
115-
let size = self.staticLabel.sizeThatFits(CGSize(width: 100.0, height: 100.0))
116-
self.staticLabel.frame = CGRect(origin: .zero, size: CGSize(width: size.width, height: labelHeight))
134+
self.staticLabel.attributedText = BadgeLabelView.makeText(value: value, suffix: suffix, color: self.color)
135+
136+
let size = self.staticLabel.updateLayout(CGSize(width: 1000.0, height: 1000.0))
137+
self.staticLabel.frame = CGRect(origin: CGPoint(x: 0.0, y: 3.0), size: CGSize(width: size.width, height: labelHeight))
117138

118-
return CGSize(width: ceil(self.staticLabel.bounds.width), height: ceil(self.staticLabel.bounds.height))
139+
return size
119140
}
120141

121142
let string = value

submodules/PremiumUI/Sources/PremiumLimitScreen.swift

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public class PremiumLimitDisplayComponent: Component {
5353
private let activeTitleColor: UIColor
5454
private let badgeIconName: String?
5555
private let badgeText: String?
56+
private let badgeTextSuffix: String?
5657
private let badgePosition: CGFloat
5758
private let badgeGraphPosition: CGFloat
5859
private let invertProgress: Bool
@@ -69,6 +70,7 @@ public class PremiumLimitDisplayComponent: Component {
6970
activeTitleColor: UIColor,
7071
badgeIconName: String?,
7172
badgeText: String?,
73+
badgeTextSuffix: String? = nil,
7274
badgePosition: CGFloat,
7375
badgeGraphPosition: CGFloat,
7476
invertProgress: Bool = false,
@@ -84,6 +86,7 @@ public class PremiumLimitDisplayComponent: Component {
8486
self.activeTitleColor = activeTitleColor
8587
self.badgeIconName = badgeIconName
8688
self.badgeText = badgeText
89+
self.badgeTextSuffix = badgeTextSuffix
8790
self.badgePosition = badgePosition
8891
self.badgeGraphPosition = badgeGraphPosition
8992
self.invertProgress = invertProgress
@@ -121,6 +124,9 @@ public class PremiumLimitDisplayComponent: Component {
121124
if lhs.badgeText != rhs.badgeText {
122125
return false
123126
}
127+
if lhs.badgeTextSuffix != rhs.badgeTextSuffix {
128+
return false
129+
}
124130
if lhs.badgePosition != rhs.badgePosition {
125131
return false
126132
}
@@ -197,7 +203,7 @@ public class PremiumLimitDisplayComponent: Component {
197203
self.badgeIcon.contentMode = .center
198204

199205
self.badgeLabel = BadgeLabelView()
200-
let _ = self.badgeLabel.update(value: "0", transition: .immediate)
206+
let _ = self.badgeLabel.update(value: "0", suffix: nil, transition: .immediate)
201207
self.badgeLabel.mask = self.badgeLabelMaskView
202208

203209
super.init(frame: frame)
@@ -312,7 +318,7 @@ public class PremiumLimitDisplayComponent: Component {
312318
if from == nil {
313319
frameTransition = frameTransition.withAnimation(.none)
314320
}
315-
let badgeLabelSize = self.badgeLabel.update(value: badgeText, transition: transition)
321+
let badgeLabelSize = self.badgeLabel.update(value: badgeText, suffix: component.badgeTextSuffix, transition: transition)
316322
frameTransition.setFrame(view: self.badgeLabel, frame: CGRect(origin: CGPoint(x: 14.0 + floorToScreenPixels((badgeFullSize.width - badgeLabelSize.width) / 2.0), y: 5.0), size: badgeLabelSize))
317323
}
318324
}
@@ -514,22 +520,7 @@ public class PremiumLimitDisplayComponent: Component {
514520

515521
let countWidth: CGFloat
516522
if let badgeText = component.badgeText {
517-
switch badgeText.count {
518-
case 1:
519-
countWidth = 20.0
520-
case 2:
521-
countWidth = 35.0
522-
case 3:
523-
countWidth = 51.0
524-
case 4:
525-
countWidth = 60.0
526-
case 5:
527-
countWidth = 74.0
528-
case 6:
529-
countWidth = 88.0
530-
default:
531-
countWidth = 51.0
532-
}
523+
countWidth = BadgeLabelView.calculateSize(value: badgeText, suffix: component.badgeTextSuffix).width + 4.0
533524
} else {
534525
countWidth = 51.0
535526
}
@@ -603,15 +594,15 @@ public class PremiumLimitDisplayComponent: Component {
603594
}
604595

605596
self.badgeIcon.frame = CGRect(x: 10.0, y: 9.0, width: 30.0, height: 30.0)
606-
self.badgeLabelMaskView.frame = CGRect(x: 0.0, y: 0.0, width: 100.0, height: 36.0)
597+
self.badgeLabelMaskView.frame = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 36.0)
607598

608599
if component.isPremiumDisabled {
609600
if !self.didPlayAppearanceAnimation {
610601
self.didPlayAppearanceAnimation = true
611602

612603
self.badgeView.alpha = 1.0
613604
if let badgeText = component.badgeText {
614-
let badgeLabelSize = self.badgeLabel.update(value: badgeText, transition: .immediate)
605+
let badgeLabelSize = self.badgeLabel.update(value: badgeText, suffix: component.badgeTextSuffix, transition: .immediate)
615606
transition.setFrame(view: self.badgeLabel, frame: CGRect(origin: CGPoint(x: 14.0 + floorToScreenPixels((badgeFullSize.width - badgeLabelSize.width) / 2.0), y: 5.0), size: badgeLabelSize))
616607
}
617608
}
@@ -621,7 +612,7 @@ public class PremiumLimitDisplayComponent: Component {
621612
if component.badgePosition < 0.1 {
622613
self.badgeView.alpha = 1.0
623614
if let badgeText = component.badgeText {
624-
let badgeLabelSize = self.badgeLabel.update(value: badgeText, transition: .immediate)
615+
let badgeLabelSize = self.badgeLabel.update(value: badgeText, suffix: component.badgeTextSuffix, transition: .immediate)
625616
transition.setFrame(view: self.badgeLabel, frame: CGRect(origin: CGPoint(x: 14.0 + floorToScreenPixels((badgeFullSize.width - badgeLabelSize.width) / 2.0), y: 5.0), size: badgeLabelSize))
626617
}
627618
} else {

submodules/TelegramCore/Sources/TelegramEngine/Messages/StoryListContext.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,20 +1412,25 @@ public final class PeerStoryListContext: StoryListContext {
14121412
switch result {
14131413
case let .storyAlbum(_, albumId, _, _, _):
14141414
var state = self.stateValue
1415-
state.availableFolders.insert(StoryListContextState.Folder(id: Int64(albumId), title: title), at: 0)
1415+
state.availableFolders.append(StoryListContextState.Folder(id: Int64(albumId), title: title))
14161416
self.stateValue = state
14171417

14181418
let peerId = self.peerId
1419-
let isArchived = self.isArchived
14201419
let items = state.items
14211420
let pinnedIds = state.pinnedIds
14221421
let totalCount = state.totalCount
1423-
let folders = state.availableFolders
14241422
let _ = (self.account.postbox.transaction { transaction -> Void in
14251423
let key = ValueBoxKey(length: 8 + 1)
14261424
key.setInt64(0, value: peerId.toInt64())
1427-
key.setInt8(8, value: isArchived ? 1 : 0)
1428-
if let entry = CodableEntry(CachedPeerStoryListHead(items: items.prefix(100).map { .item($0.storyItem.asStoryItem()) }, pinnedIds: pinnedIds, totalCount: Int32(totalCount), folders: folders)) {
1425+
key.setInt8(8, value: 0)
1426+
1427+
var updatedFolders: [State.Folder] = []
1428+
if let cached = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerStoryListHeads, key: key))?.get(CachedPeerStoryListHead.self) {
1429+
updatedFolders = cached.folders
1430+
}
1431+
updatedFolders.append(StoryListContextState.Folder(id: Int64(albumId), title: title))
1432+
1433+
if let entry = CodableEntry(CachedPeerStoryListHead(items: items.prefix(100).map { .item($0.storyItem.asStoryItem()) }, pinnedIds: pinnedIds, totalCount: Int32(totalCount), folders: updatedFolders)) {
14291434
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerStoryListHeads, key: key), entry: entry)
14301435
}
14311436

submodules/TelegramUI/Components/PeerInfo/PeerInfoScreen/Sources/PeerInfoHeaderNode.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
197197
private var validLayout: (width: CGFloat, statusBarHeight: CGFloat, deviceMetrics: DeviceMetrics)?
198198

199199
private var currentStarRating: TelegramStarRating?
200+
private var currentPendingStarRating: TelegramStarPendingRating?
200201

201202
init(context: AccountContext, controller: PeerInfoScreenImpl, avatarInitiallyExpanded: Bool, isOpenedFromChat: Bool, isMediaOnly: Bool, isSettings: Bool, isMyProfile: Bool, forumTopicThreadId: Int64?, chatLocation: ChatLocation) {
202203
self.context = context
@@ -1955,8 +1956,14 @@ final class PeerInfoHeaderNode: ASDisplayNode {
19551956

19561957
if let cachedData = cachedData as? CachedUserData, let starRating = cachedData.starRating {
19571958
self.currentStarRating = starRating
1959+
self.currentPendingStarRating = cachedData.pendingStarRating
1960+
1961+
#if DEBUG
1962+
self.currentPendingStarRating = TelegramStarPendingRating(rating: TelegramStarRating(level: starRating.level, currentLevelStars: starRating.currentLevelStars, stars: starRating.stars + 123, nextLevelStars: starRating.nextLevelStars), timestamp: 0)
1963+
#endif
19581964
} else {
19591965
self.currentStarRating = nil
1966+
self.currentPendingStarRating = nil
19601967
}
19611968

19621969
if let cachedData = cachedData as? CachedUserData, let starRating = cachedData.starRating {
@@ -1987,6 +1994,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
19871994
context: self.context,
19881995
peer: EnginePeer(peer),
19891996
starRating: currentStarRating,
1997+
pendingStarRating: self.currentPendingStarRating,
19901998
customTheme: self.presentationData?.theme
19911999
))
19922000
}

0 commit comments

Comments
 (0)