Skip to content

Commit 3778357

Browse files
committed
Merge branches 'master' and 'master' of gitlab.com:peter-iakovlev/telegram-ios
2 parents f81443e + ef3b593 commit 3778357

File tree

20 files changed

+819
-217
lines changed

20 files changed

+819
-217
lines changed

submodules/AccountContext/Sources/AccountContext.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -896,14 +896,12 @@ public enum JoinAffiliateProgramScreenMode {
896896

897897
public final class Active {
898898
public let targetPeer: EnginePeer
899-
public let link: String
900-
public let userCount: Int
901-
public let copyLink: () -> Void
899+
public let bot: TelegramConnectedStarRefBotList.Item
900+
public let copyLink: (TelegramConnectedStarRefBotList.Item) -> Void
902901

903-
public init(targetPeer: EnginePeer, link: String, userCount: Int, copyLink: @escaping () -> Void) {
902+
public init(targetPeer: EnginePeer, bot: TelegramConnectedStarRefBotList.Item, copyLink: @escaping (TelegramConnectedStarRefBotList.Item) -> Void) {
904903
self.targetPeer = targetPeer
905-
self.link = link
906-
self.userCount = userCount
904+
self.bot = bot
907905
self.copyLink = copyLink
908906
}
909907
}
@@ -1106,7 +1104,7 @@ public protocol SharedAccountContext: AnyObject {
11061104
func makeAffiliateProgramSetupScreenInitialData(context: AccountContext, peerId: EnginePeer.Id, mode: AffiliateProgramSetupScreenMode) -> Signal<AffiliateProgramSetupScreenInitialData, NoError>
11071105
func makeAffiliateProgramSetupScreen(context: AccountContext, initialData: AffiliateProgramSetupScreenInitialData) -> ViewController
11081106

1109-
func makeAffiliateProgramJoinScreen(context: AccountContext, sourcePeer: EnginePeer, commissionPermille: Int32, programDuration: Int32?, mode: JoinAffiliateProgramScreenMode) -> ViewController
1107+
func makeAffiliateProgramJoinScreen(context: AccountContext, sourcePeer: EnginePeer, commissionPermille: Int32, programDuration: Int32?, revenuePerUser: Double, mode: JoinAffiliateProgramScreenMode) -> ViewController
11101108

11111109
func makeDebugSettingsController(context: AccountContext?) -> ViewController?
11121110

submodules/AvatarNode/Sources/PeerAvatar.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public func peerAvatarImage(postbox: Postbox, network: Network, peerReference: P
299299
if let cutoutRect {
300300
context.setBlendMode(.copy)
301301
context.setFillColor(UIColor.clear.cgColor)
302-
context.fillEllipse(in: cutoutRect)
302+
context.fillEllipse(in: cutoutRect.offsetBy(dx: 0.0, dy: size.height - cutoutRect.maxY - cutoutRect.height))
303303
}
304304
})
305305
let unroundedImage: UIImage?
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import Foundation
2+
import UIKit
3+
4+
public final class TransformContents<ChildEnvironment: Equatable>: CombinedComponent {
5+
public typealias EnvironmentType = ChildEnvironment
6+
7+
private let content: AnyComponent<ChildEnvironment>
8+
private let fixedSize: CGSize?
9+
private let translation: CGPoint
10+
11+
public init(content: AnyComponent<ChildEnvironment>, fixedSize: CGSize? = nil, translation: CGPoint) {
12+
self.content = content
13+
self.fixedSize = fixedSize
14+
self.translation = translation
15+
}
16+
17+
public static func ==(lhs: TransformContents<ChildEnvironment>, rhs: TransformContents<ChildEnvironment>) -> Bool {
18+
if lhs.content != rhs.content {
19+
return false
20+
}
21+
if lhs.fixedSize != rhs.fixedSize {
22+
return false
23+
}
24+
if lhs.translation != rhs.translation {
25+
return false
26+
}
27+
return true
28+
}
29+
30+
public static var body: Body {
31+
let child = Child(environment: ChildEnvironment.self)
32+
33+
return { context in
34+
let child = child.update(
35+
component: context.component.content,
36+
environment: { context.environment[ChildEnvironment.self] },
37+
availableSize: context.availableSize,
38+
transition: context.transition
39+
)
40+
41+
let size = context.component.fixedSize ?? child.size
42+
43+
var childFrame = child.size.centered(in: CGRect(origin: CGPoint(), size: size))
44+
childFrame.origin.x += context.component.translation.x
45+
childFrame.origin.y += context.component.translation.y
46+
47+
context.add(child
48+
.position(childFrame.center)
49+
)
50+
51+
return size
52+
}
53+
}
54+
}

submodules/Display/Source/TextNode.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2529,7 +2529,16 @@ open class TextNode: ASDisplayNode, TextNodeProtocol {
25292529
textColor = color
25302530
}
25312531
}
2532-
if let textColor {
2532+
if image.renderingMode == .alwaysOriginal {
2533+
let imageRect = CGRect(origin: CGPoint(x: attachment.frame.midX - image.size.width * 0.5, y: attachment.frame.midY - image.size.height * 0.5 + 1.0), size: image.size).offsetBy(dx: lineFrame.minX, dy: lineFrame.minY)
2534+
context.translateBy(x: imageRect.midX, y: imageRect.midY)
2535+
context.scaleBy(x: 1.0, y: -1.0)
2536+
context.translateBy(x: -imageRect.midX, y: -imageRect.midY)
2537+
context.draw(image.cgImage!, in: imageRect)
2538+
context.translateBy(x: imageRect.midX, y: imageRect.midY)
2539+
context.scaleBy(x: 1.0, y: -1.0)
2540+
context.translateBy(x: -imageRect.midX, y: -imageRect.midY)
2541+
} else if let textColor {
25332542
if let tintedImage = generateTintedImage(image: image, color: textColor) {
25342543
let imageRect = CGRect(origin: CGPoint(x: attachment.frame.midX - tintedImage.size.width * 0.5, y: attachment.frame.midY - tintedImage.size.height * 0.5 + 1.0), size: tintedImage.size).offsetBy(dx: lineFrame.minX, dy: lineFrame.minY)
25352544
context.translateBy(x: imageRect.midX, y: imageRect.midY)

submodules/StatisticsUI/Sources/ChannelStatsController.swift

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,8 @@ private func monetizationEntries(
15751575
premiumConfiguration: PremiumConfiguration,
15761576
monetizationConfiguration: MonetizationConfiguration,
15771577
canViewRevenue: Bool,
1578-
canViewStarsRevenue: Bool
1578+
canViewStarsRevenue: Bool,
1579+
canJoinRefPrograms: Bool
15791580
) -> [StatsEntry] {
15801581
var entries: [StatsEntry] = []
15811582

@@ -1700,8 +1701,10 @@ private func monetizationEntries(
17001701

17011702
if displayStarsTransactions {
17021703
if !addedTransactionsTabs {
1703-
//TODO:localize
1704-
entries.append(.earnStarsInfo)
1704+
if canJoinRefPrograms {
1705+
//TODO:localize
1706+
entries.append(.earnStarsInfo)
1707+
}
17051708

17061709
entries.append(.adsTransactionsTitle(presentationData.theme, presentationData.strings.Monetization_StarsTransactions.uppercased()))
17071710
}
@@ -1767,7 +1770,8 @@ private func channelStatsControllerEntries(
17671770
premiumConfiguration: PremiumConfiguration,
17681771
monetizationConfiguration: MonetizationConfiguration,
17691772
canViewRevenue: Bool,
1770-
canViewStarsRevenue: Bool
1773+
canViewStarsRevenue: Bool,
1774+
canJoinRefPrograms: Bool
17711775
) -> [StatsEntry] {
17721776
switch state.section {
17731777
case .stats:
@@ -1809,7 +1813,8 @@ private func channelStatsControllerEntries(
18091813
premiumConfiguration: premiumConfiguration,
18101814
monetizationConfiguration: monetizationConfiguration,
18111815
canViewRevenue: canViewRevenue,
1812-
canViewStarsRevenue: canViewStarsRevenue
1816+
canViewStarsRevenue: canViewStarsRevenue,
1817+
canJoinRefPrograms: canJoinRefPrograms
18131818
)
18141819
}
18151820
}
@@ -2157,6 +2162,15 @@ public func channelStatsController(
21572162
let (canViewStats, adsRestricted, _, canViewStarsRevenue) = peerData
21582163
var canViewRevenue = peerData.2
21592164

2165+
var canJoinRefPrograms = false
2166+
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["starref_connect_allowed"] {
2167+
if let value = value as? Double {
2168+
canJoinRefPrograms = value != 0.0
2169+
} else if let value = value as? Bool {
2170+
canJoinRefPrograms = value
2171+
}
2172+
}
2173+
21602174
let _ = canViewStatsValue.swap(canViewStats)
21612175

21622176
var isGroup = false
@@ -2262,7 +2276,7 @@ public func channelStatsController(
22622276
}
22632277

22642278
let controllerState = ItemListControllerState(presentationData: ItemListPresentationData(presentationData), title: title, leftNavigationButton: leftNavigationButton, rightNavigationButton: nil, backNavigationButton: ItemListBackButton(title: presentationData.strings.Common_Back), animateChanges: true)
2265-
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: channelStatsControllerEntries(presentationData: presentationData, state: state, peer: peer, data: data, messages: messages, stories: stories, interactions: interactions, boostData: boostData, boostersState: boostersState, giftsState: giftsState, giveawayAvailable: premiumConfiguration.giveawayGiftsPurchaseAvailable, isGroup: isGroup, boostsOnly: boostsOnly, revenueState: revenueState?.stats, revenueTransactions: revenueTransactions, starsState: starsState?.stats, starsTransactions: starsTransactions, adsRestricted: adsRestricted, premiumConfiguration: premiumConfiguration, monetizationConfiguration: monetizationConfiguration, canViewRevenue: canViewRevenue, canViewStarsRevenue: canViewStarsRevenue), style: .blocks, emptyStateItem: emptyStateItem, headerItem: headerItem, crossfadeState: previous == nil, animateChanges: false)
2279+
let listState = ItemListNodeState(presentationData: ItemListPresentationData(presentationData), entries: channelStatsControllerEntries(presentationData: presentationData, state: state, peer: peer, data: data, messages: messages, stories: stories, interactions: interactions, boostData: boostData, boostersState: boostersState, giftsState: giftsState, giveawayAvailable: premiumConfiguration.giveawayGiftsPurchaseAvailable, isGroup: isGroup, boostsOnly: boostsOnly, revenueState: revenueState?.stats, revenueTransactions: revenueTransactions, starsState: starsState?.stats, starsTransactions: starsTransactions, adsRestricted: adsRestricted, premiumConfiguration: premiumConfiguration, monetizationConfiguration: monetizationConfiguration, canViewRevenue: canViewRevenue, canViewStarsRevenue: canViewStarsRevenue, canJoinRefPrograms: canJoinRefPrograms), style: .blocks, emptyStateItem: emptyStateItem, headerItem: headerItem, crossfadeState: previous == nil, animateChanges: false)
22662280

22672281
return (controllerState, (listState, arguments))
22682282
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,18 @@ func _internal_removeChatManagingBot(account: Account, chatId: EnginePeer.Id) ->
589589
}
590590
}
591591

592+
public func formatPermille(_ value: Int32) -> String {
593+
return formatPermille(Int(value))
594+
}
595+
596+
public func formatPermille(_ value: Int) -> String {
597+
if value % 10 == 0 {
598+
return "\(value / 10)"
599+
} else {
600+
return String(format: "%.1f", Double(value) / 10.0)
601+
}
602+
}
603+
592604
func _internal_updateStarRefProgram(account: Account, id: EnginePeer.Id, program: (commissionPermille: Int32, durationMonths: Int32?)?) -> Signal<Never, NoError> {
593605
return account.postbox.transaction { transaction -> Api.InputUser? in
594606
return transaction.getPeer(id).flatMap(apiInputUser)
@@ -632,7 +644,6 @@ func _internal_updateStarRefProgram(account: Account, id: EnginePeer.Id, program
632644
}
633645

634646
public final class TelegramConnectedStarRefBotList : Equatable {
635-
636647
public final class Item: Equatable {
637648
public let peer: EnginePeer
638649
public let url: String

submodules/TelegramCore/Sources/TelegramEngine/Payments/Stars.swift

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,15 @@ public struct StarsAmount: Equatable, Comparable, Hashable, Codable, CustomStrin
281281
}
282282

283283
public var stringValue: String {
284+
return "\(totalValue)"
285+
}
286+
287+
public var totalValue: Double {
284288
if self.nanos == 0 {
285-
return "\(self.value)"
289+
return Double(self.value)
286290
} else {
287291
let totalValue = (Double(self.value) * 1e9 + Double(self.nanos)) / 1e9
288-
return "\(totalValue)"
292+
return totalValue
289293
}
290294
}
291295

@@ -302,6 +306,10 @@ public struct StarsAmount: Equatable, Comparable, Hashable, Codable, CustomStrin
302306
}
303307

304308
public static func +(lhs: StarsAmount, rhs: StarsAmount) -> StarsAmount {
309+
if rhs.value < 0 || rhs.nanos < 0 {
310+
return lhs - StarsAmount(value: abs(rhs.value), nanos: abs(rhs.nanos))
311+
}
312+
305313
let totalNanos = Int64(lhs.nanos) + Int64(rhs.nanos)
306314
let overflow = totalNanos / 1_000_000_000
307315
let remainingNanos = totalNanos % 1_000_000_000
@@ -529,7 +537,7 @@ private final class StarsContextImpl {
529537
}
530538
var transactions = state.transactions
531539
if addTransaction {
532-
transactions.insert(.init(flags: [.isLocal], id: "\(arc4random())", count: balance, date: Int32(Date().timeIntervalSince1970), peer: .appStore, title: nil, description: nil, photo: nil, transactionDate: nil, transactionUrl: nil, paidMessageId: nil, giveawayMessageId: nil, media: [], subscriptionPeriod: nil, starGift: nil, floodskipNumber: nil), at: 0)
540+
transactions.insert(.init(flags: [.isLocal], id: "\(arc4random())", count: balance, date: Int32(Date().timeIntervalSince1970), peer: .appStore, title: nil, description: nil, photo: nil, transactionDate: nil, transactionUrl: nil, paidMessageId: nil, giveawayMessageId: nil, media: [], subscriptionPeriod: nil, starGift: nil, floodskipNumber: nil, starrefCommissionPermille: nil, starrefPeerId: nil, starrefAmount: nil), at: 0)
533541
}
534542

535543
self.updateState(StarsContext.State(flags: [.isPendingBalance], balance: max(StarsAmount(value: 0, nanos: 0), state.balance + balance), subscriptions: state.subscriptions, canLoadMoreSubscriptions: state.canLoadMoreSubscriptions, transactions: transactions, canLoadMoreTransactions: state.canLoadMoreTransactions, isLoading: state.isLoading))
@@ -552,10 +560,6 @@ private extension StarsContext.State.Transaction {
552560
init?(apiTransaction: Api.StarsTransaction, peerId: EnginePeer.Id?, transaction: Transaction) {
553561
switch apiTransaction {
554562
case let .starsTransaction(apiFlags, id, stars, date, transactionPeer, title, description, photo, transactionDate, transactionUrl, _, messageId, extendedMedia, subscriptionPeriod, giveawayPostId, starGift, floodskipNumber, starrefCommissionPermille, starrefPeer, starrefAmount):
555-
let _ = starrefCommissionPermille
556-
let _ = starrefPeer
557-
let _ = starrefAmount
558-
559563
let parsedPeer: StarsContext.State.Transaction.Peer
560564
var paidMessageId: MessageId?
561565
var giveawayMessageId: MessageId?
@@ -611,7 +615,7 @@ private extension StarsContext.State.Transaction {
611615

612616
let media = extendedMedia.flatMap({ $0.compactMap { textMediaAndExpirationTimerFromApiMedia($0, PeerId(0)).media } }) ?? []
613617
let _ = subscriptionPeriod
614-
self.init(flags: flags, id: id, count: StarsAmount(apiAmount: stars), date: date, peer: parsedPeer, title: title, description: description, photo: photo.flatMap(TelegramMediaWebFile.init), transactionDate: transactionDate, transactionUrl: transactionUrl, paidMessageId: paidMessageId, giveawayMessageId: giveawayMessageId, media: media, subscriptionPeriod: subscriptionPeriod, starGift: starGift.flatMap { StarGift(apiStarGift: $0) }, floodskipNumber: floodskipNumber)
618+
self.init(flags: flags, id: id, count: StarsAmount(apiAmount: stars), date: date, peer: parsedPeer, title: title, description: description, photo: photo.flatMap(TelegramMediaWebFile.init), transactionDate: transactionDate, transactionUrl: transactionUrl, paidMessageId: paidMessageId, giveawayMessageId: giveawayMessageId, media: media, subscriptionPeriod: subscriptionPeriod, starGift: starGift.flatMap { StarGift(apiStarGift: $0) }, floodskipNumber: floodskipNumber, starrefCommissionPermille: starrefCommissionPermille, starrefPeerId: starrefPeer.flatMap(\.peerId), starrefAmount: starrefAmount.flatMap(StarsAmount.init(apiAmount:)))
615619
}
616620
}
617621
}
@@ -686,6 +690,9 @@ public final class StarsContext {
686690
public let subscriptionPeriod: Int32?
687691
public let starGift: StarGift?
688692
public let floodskipNumber: Int32?
693+
public let starrefCommissionPermille: Int32?
694+
public let starrefPeerId: PeerId?
695+
public let starrefAmount: StarsAmount?
689696

690697
public init(
691698
flags: Flags,
@@ -703,7 +710,10 @@ public final class StarsContext {
703710
media: [Media],
704711
subscriptionPeriod: Int32?,
705712
starGift: StarGift?,
706-
floodskipNumber: Int32?
713+
floodskipNumber: Int32?,
714+
starrefCommissionPermille: Int32?,
715+
starrefPeerId: PeerId?,
716+
starrefAmount: StarsAmount?
707717
) {
708718
self.flags = flags
709719
self.id = id
@@ -721,6 +731,9 @@ public final class StarsContext {
721731
self.subscriptionPeriod = subscriptionPeriod
722732
self.starGift = starGift
723733
self.floodskipNumber = floodskipNumber
734+
self.starrefCommissionPermille = starrefCommissionPermille
735+
self.starrefPeerId = starrefPeerId
736+
self.starrefAmount = starrefAmount
724737
}
725738

726739
public static func == (lhs: Transaction, rhs: Transaction) -> Bool {
@@ -772,6 +785,15 @@ public final class StarsContext {
772785
if lhs.floodskipNumber != rhs.floodskipNumber {
773786
return false
774787
}
788+
if lhs.starrefCommissionPermille != rhs.starrefCommissionPermille {
789+
return false
790+
}
791+
if lhs.starrefPeerId != rhs.starrefPeerId {
792+
return false
793+
}
794+
if lhs.starrefAmount != rhs.starrefAmount {
795+
return false
796+
}
775797
return true
776798
}
777799
}

submodules/TelegramUI/Components/Chat/ChatMessageActionButtonsNode/Sources/ChatMessageActionButtonsNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ private final class ChatMessageActionButtonNode: ASDisplayNode {
180180
iconImage = incoming ? graphics.chatBubbleActionButtonIncomingMessageIconImage : graphics.chatBubbleActionButtonOutgoingMessageIconImage
181181
case let .url(value):
182182
var isApp = false
183-
if isTelegramMeLink(value), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, url: value) {
183+
if isTelegramMeLink(value), let internalUrl = parseFullInternalUrl(sharedContext: context.sharedContext, context: context, url: value) {
184184
if case .peer(_, .appStart) = internalUrl {
185185
isApp = true
186186
} else if case .peer(_, .attachBotStart) = internalUrl {

submodules/TelegramUI/Components/Chat/ChatMessageInteractiveMediaNode/Sources/ChatMessageInteractiveMediaNode.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,7 @@ public final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTr
798798

799799
var useInlineHLS = true
800800
if let data = context.currentAppConfiguration.with({ $0 }).data {
801-
if let value = data["ios_inline_hls"] as? Double {
801+
if let value = data["ios_inline_hls_v2"] as? Double {
802802
useInlineHLS = value != 0.0
803803
}
804804
}

0 commit comments

Comments
 (0)