Skip to content

Commit ef652c0

Browse files
author
Isaac
committed
Stars refs
1 parent acf5f3c commit ef652c0

File tree

4 files changed

+104
-24
lines changed

4 files changed

+104
-24
lines changed

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

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,7 @@ func _internal_requestConnectedStarRefBots(account: Account, id: EnginePeer.Id,
752752
public final class TelegramSuggestedStarRefBotList: Equatable {
753753
public enum SortMode {
754754
case date
755-
case commission
755+
case profitability
756756
case revenue
757757
}
758758

@@ -805,7 +805,7 @@ func _internal_requestSuggestedStarRefBots(account: Account, id: EnginePeer.Id,
805805
flags |= 1 << 0
806806
case .date:
807807
flags |= 1 << 1
808-
case .commission:
808+
case .profitability:
809809
break
810810
}
811811
return account.network.request(Api.functions.payments.getSuggestedStarRefBots(
@@ -1008,3 +1008,48 @@ func _internal_getStarRefBotConnection(account: Account, id: EnginePeer.Id, targ
10081008
}
10091009
}
10101010
}
1011+
1012+
func _internal_getPossibleStarRefBotTargets(account: Account) -> Signal<[EnginePeer], NoError> {
1013+
return combineLatest(
1014+
account.network.request(Api.functions.bots.getAdminedBots())
1015+
|> `catch` { _ -> Signal<[Api.User], NoError> in
1016+
return .single([])
1017+
},
1018+
account.network.request(Api.functions.channels.getAdminedPublicChannels(flags: 0))
1019+
|> map(Optional.init)
1020+
|> `catch` { _ -> Signal<Api.messages.Chats?, NoError> in
1021+
return .single(nil)
1022+
}
1023+
)
1024+
|> mapToSignal { apiBots, apiChannels -> Signal<[EnginePeer], NoError> in
1025+
return account.postbox.transaction { transaction -> [EnginePeer] in
1026+
var result: [EnginePeer] = []
1027+
1028+
if let peer = transaction.getPeer(account.peerId) {
1029+
result.append(EnginePeer(peer))
1030+
}
1031+
1032+
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: AccumulatedPeers(users: apiBots))
1033+
for bot in apiBots {
1034+
if let peer = transaction.getPeer(bot.peerId) {
1035+
result.append(EnginePeer(peer))
1036+
}
1037+
}
1038+
1039+
if let apiChannels {
1040+
switch apiChannels {
1041+
case let .chats(chats), let .chatsSlice(_, chats):
1042+
updatePeers(transaction: transaction, accountPeerId: account.peerId, peers: AccumulatedPeers(chats: chats, users: []))
1043+
1044+
for chat in chats {
1045+
if let peer = transaction.getPeer(chat.peerId) {
1046+
result.append(EnginePeer(peer))
1047+
}
1048+
}
1049+
}
1050+
}
1051+
1052+
return result
1053+
}
1054+
}
1055+
}

submodules/TelegramCore/Sources/TelegramEngine/Peers/TelegramEnginePeers.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,6 +1656,10 @@ public extension TelegramEngine {
16561656
public func getStarRefBotConnection(id: EnginePeer.Id, targetId: EnginePeer.Id) -> Signal<TelegramConnectedStarRefBotList.Item?, NoError> {
16571657
return _internal_getStarRefBotConnection(account: self.account, id: id, targetId: targetId)
16581658
}
1659+
1660+
public func getPossibleStarRefBotTargets() -> Signal<[EnginePeer], NoError> {
1661+
return _internal_getPossibleStarRefBotTargets(account: self.account)
1662+
}
16591663
}
16601664
}
16611665

submodules/TelegramUI/Components/PeerInfo/AffiliateProgramSetupScreen/Sources/AffiliateProgramSetupScreen.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ If you end your affiliate program:
413413
let availableModes: [(TelegramSuggestedStarRefBotList.SortMode, String)] = [
414414
(.date, "Date"),
415415
(.revenue, "Revenue"),
416-
(.commission, "Commission")
416+
(.profitability, "Profitability")
417417
]
418418
for (mode, title) in availableModes {
419419
let isSelected = mode == self.suggestedSortMode

submodules/TelegramUI/Components/PeerInfo/AffiliateProgramSetupScreen/Sources/JoinAffiliateProgramScreen.swift

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ private final class JoinAffiliateProgramScreenComponent: Component {
120120

121121
private var currentTargetPeer: EnginePeer?
122122

123+
private var possibleTargetPeers: [EnginePeer] = []
124+
private var possibleTargetPeersDisposable: Disposable?
125+
123126
private var cachedCloseImage: UIImage?
124127

125128
override init(frame: CGRect) {
@@ -189,6 +192,10 @@ private final class JoinAffiliateProgramScreenComponent: Component {
189192
fatalError("init(coder:) has not been implemented")
190193
}
191194

195+
deinit {
196+
self.possibleTargetPeersDisposable?.dispose()
197+
}
198+
192199
func scrollViewDidScroll(_ scrollView: UIScrollView) {
193200
if !self.ignoreScrolling {
194201
self.updateScrolling(transition: .immediate)
@@ -338,9 +345,9 @@ private final class JoinAffiliateProgramScreenComponent: Component {
338345

339346
let presentationData = component.context.sharedContext.currentPresentationData.with({ $0 })
340347

341-
let peers: [EnginePeer] = [
348+
let peers: [EnginePeer] = self.possibleTargetPeers.isEmpty ? [
342349
join.initialTargetPeer
343-
]
350+
] : self.possibleTargetPeers
344351

345352
let avatarSize = CGSize(width: 30.0, height: 30.0)
346353

@@ -383,11 +390,24 @@ private final class JoinAffiliateProgramScreenComponent: Component {
383390
let sideInset: CGFloat = 16.0 + environment.safeInsets.left
384391

385392
if self.component == nil {
393+
var loadPossibleTargetPeers = false
386394
switch component.mode {
387395
case let .join(join):
388396
self.currentTargetPeer = join.initialTargetPeer
397+
loadPossibleTargetPeers = join.canSelectTargetPeer
389398
case let .active(active):
390399
self.currentTargetPeer = active.targetPeer
400+
loadPossibleTargetPeers = true
401+
}
402+
403+
if loadPossibleTargetPeers {
404+
self.possibleTargetPeersDisposable = (component.context.engine.peers.getPossibleStarRefBotTargets()
405+
|> deliverOnMainQueue).startStrict(next: { [weak self] result in
406+
guard let self else {
407+
return
408+
}
409+
self.possibleTargetPeers = result
410+
})
391411
}
392412
}
393413

@@ -701,6 +721,7 @@ private final class JoinAffiliateProgramScreenComponent: Component {
701721
isTargetPeerSelectable = join.canSelectTargetPeer
702722
case .active:
703723
displayTargetPeer = true
724+
isTargetPeerSelectable = true
704725
}
705726

706727
if displayTargetPeer {
@@ -1154,7 +1175,7 @@ private final class PeerBadgeComponent: Component {
11541175
if let current = self.avatarNode {
11551176
avatarNode = current
11561177
} else {
1157-
avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 15.0))
1178+
avatarNode = AvatarNode(font: avatarPlaceholderFont(size: floor(avatarDiameter * 0.5)))
11581179
avatarNode.isUserInteractionEnabled = false
11591180
avatarNode.displaysAsynchronously = false
11601181
self.avatarNode = avatarNode
@@ -1252,18 +1273,13 @@ private final class AvatarComponent: Component {
12521273
}
12531274

12541275
final class View: UIView {
1255-
private let avatarNode: AvatarNode
1276+
private var avatarNode: AvatarNode?
12561277

12571278
private var component: AvatarComponent?
12581279
private weak var state: EmptyComponentState?
12591280

12601281
override init(frame: CGRect) {
1261-
self.avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 18.0))
1262-
self.avatarNode.displaysAsynchronously = false
1263-
12641282
super.init(frame: frame)
1265-
1266-
self.addSubnode(self.avatarNode)
12671283
}
12681284

12691285
required init?(coder: NSCoder) {
@@ -1276,14 +1292,24 @@ private final class AvatarComponent: Component {
12761292

12771293
let size = component.size ?? availableSize
12781294

1279-
self.avatarNode.frame = CGRect(origin: CGPoint(), size: size)
1280-
self.avatarNode.setPeer(
1295+
let avatarNode: AvatarNode
1296+
if let current = self.avatarNode {
1297+
avatarNode = current
1298+
} else {
1299+
avatarNode = AvatarNode(font: avatarPlaceholderFont(size: floor(size.width * 0.5)))
1300+
avatarNode.displaysAsynchronously = false
1301+
self.avatarNode = avatarNode
1302+
self.addSubview(avatarNode.view)
1303+
}
1304+
avatarNode.frame = CGRect(origin: CGPoint(), size: size)
1305+
avatarNode.setPeer(
12811306
context: component.context,
12821307
theme: component.context.sharedContext.currentPresentationData.with({ $0 }).theme,
12831308
peer: component.peer,
12841309
synchronousLoad: true,
12851310
displayDimensions: size
12861311
)
1312+
avatarNode.updateSize(size: size)
12871313

12881314
return size
12891315
}
@@ -1634,8 +1660,8 @@ final class BotSectionSortButtonComponent: Component {
16341660
switch component.sortMode {
16351661
case .date:
16361662
sortByString = "SORT BY [DATE]()"
1637-
case .commission:
1638-
sortByString = "SORT BY [COMMISSION]()"
1663+
case .profitability:
1664+
sortByString = "SORT BY [PROFITABILITY]()"
16391665
case .revenue:
16401666
sortByString = "SORT BY [REVENUE]()"
16411667
}
@@ -1732,7 +1758,7 @@ final class PeerBadgeAvatarComponent: Component {
17321758
}
17331759

17341760
final class View: UIView {
1735-
private let avatarNode: AvatarNode
1761+
private var avatarNode: AvatarNode?
17361762

17371763
private let badgeBackground = UIImageView()
17381764
private let badgeIcon = UIImageView()
@@ -1744,12 +1770,7 @@ final class PeerBadgeAvatarComponent: Component {
17441770
private static let badgeIconImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Links/Link"), color: .white)?.withRenderingMode(.alwaysTemplate)
17451771

17461772
override init(frame: CGRect) {
1747-
self.avatarNode = AvatarNode(font: avatarPlaceholderFont(size: 15.0))
1748-
self.avatarNode.displaysAsynchronously = false
1749-
17501773
super.init(frame: frame)
1751-
1752-
self.addSubnode(self.avatarNode)
17531774
}
17541775

17551776
required init?(coder: NSCoder) {
@@ -1765,8 +1786,18 @@ final class PeerBadgeAvatarComponent: Component {
17651786

17661787
let badgeFrame = CGRect(origin: CGPoint(x: size.width - badgeSize, y: size.height - badgeSize), size: CGSize(width: badgeSize, height: badgeSize))
17671788

1768-
self.avatarNode.frame = CGRect(origin: CGPoint(), size: size)
1769-
self.avatarNode.setPeer(
1789+
let avatarNode: AvatarNode
1790+
if let current = self.avatarNode {
1791+
avatarNode = current
1792+
} else {
1793+
avatarNode = AvatarNode(font: avatarPlaceholderFont(size: floor(size.width * 0.5)))
1794+
avatarNode.displaysAsynchronously = false
1795+
self.avatarNode = avatarNode
1796+
self.addSubview(avatarNode.view)
1797+
}
1798+
1799+
avatarNode.frame = CGRect(origin: CGPoint(), size: size)
1800+
avatarNode.setPeer(
17701801
context: component.context,
17711802
theme: component.context.sharedContext.currentPresentationData.with({ $0 }).theme,
17721803
peer: component.peer,

0 commit comments

Comments
 (0)