mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Merge commit 'cbb4a890b2'
This commit is contained in:
commit
15c9af3ab2
60 changed files with 1547 additions and 1964 deletions
|
|
@ -51,7 +51,7 @@ private final class ChannelStatsControllerArguments {
|
|||
let buyAds: () -> Void
|
||||
let openMonetizationIntro: () -> Void
|
||||
let openMonetizationInfo: () -> Void
|
||||
let openTonTransaction: (RevenueStatsTransactionsContext.State.Transaction) -> Void
|
||||
let openTonTransaction: (StarsContext.State.Transaction) -> Void
|
||||
let openStarsTransaction: (StarsContext.State.Transaction) -> Void
|
||||
let expandTransactions: (Bool) -> Void
|
||||
let updateCpmEnabled: (Bool) -> Void
|
||||
|
|
@ -59,7 +59,7 @@ private final class ChannelStatsControllerArguments {
|
|||
let openEarnStars: () -> Void
|
||||
let dismissInput: () -> Void
|
||||
|
||||
init(context: AccountContext, loadDetailedGraph: @escaping (StatsGraph, Int64) -> Signal<StatsGraph?, NoError>, openPostStats: @escaping (EnginePeer, StatsPostItem) -> Void, openStory: @escaping (EngineStoryItem, UIView) -> 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, updateStarsSelected: @escaping (Bool) -> Void, requestTonWithdraw: @escaping () -> Void, requestStarsWithdraw: @escaping () -> Void, showTimeoutTooltip: @escaping (Int32) -> Void, buyAds: @escaping () -> Void, openMonetizationIntro: @escaping () -> Void, openMonetizationInfo: @escaping () -> Void, openTonTransaction: @escaping (RevenueStatsTransactionsContext.State.Transaction) -> Void, openStarsTransaction: @escaping (StarsContext.State.Transaction) -> Void, expandTransactions: @escaping (Bool) -> Void, updateCpmEnabled: @escaping (Bool) -> Void, presentCpmLocked: @escaping () -> Void, openEarnStars: @escaping () -> Void, dismissInput: @escaping () -> Void) {
|
||||
init(context: AccountContext, loadDetailedGraph: @escaping (StatsGraph, Int64) -> Signal<StatsGraph?, NoError>, openPostStats: @escaping (EnginePeer, StatsPostItem) -> Void, openStory: @escaping (EngineStoryItem, UIView) -> 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, updateStarsSelected: @escaping (Bool) -> Void, requestTonWithdraw: @escaping () -> Void, requestStarsWithdraw: @escaping () -> Void, showTimeoutTooltip: @escaping (Int32) -> Void, buyAds: @escaping () -> Void, openMonetizationIntro: @escaping () -> Void, openMonetizationInfo: @escaping () -> Void, openTonTransaction: @escaping (StarsContext.State.Transaction) -> Void, openStarsTransaction: @escaping (StarsContext.State.Transaction) -> Void, expandTransactions: @escaping (Bool) -> Void, updateCpmEnabled: @escaping (Bool) -> Void, presentCpmLocked: @escaping () -> Void, openEarnStars: @escaping () -> Void, dismissInput: @escaping () -> Void) {
|
||||
self.context = context
|
||||
self.loadDetailedGraph = loadDetailedGraph
|
||||
self.openPostStats = openPostStats
|
||||
|
|
@ -242,11 +242,11 @@ private enum StatsEntry: ItemListNodeEntry {
|
|||
case adsStarsRevenueGraph(PresentationTheme, PresentationStrings, PresentationDateTimeFormat, StatsGraph, ChartType, Double)
|
||||
|
||||
case adsProceedsTitle(PresentationTheme, String)
|
||||
case adsProceedsOverview(PresentationTheme, RevenueStats?, StarsRevenueStats?)
|
||||
case adsProceedsOverview(PresentationTheme, StarsRevenueStats?, StarsRevenueStats?)
|
||||
case adsProceedsInfo(PresentationTheme, String)
|
||||
|
||||
case adsTonBalanceTitle(PresentationTheme, String)
|
||||
case adsTonBalance(PresentationTheme, RevenueStats, Bool, Bool)
|
||||
case adsTonBalance(PresentationTheme, StarsRevenueStats, Bool, Bool)
|
||||
case adsTonBalanceInfo(PresentationTheme, String)
|
||||
|
||||
case adsStarsBalanceTitle(PresentationTheme, String)
|
||||
|
|
@ -256,7 +256,7 @@ private enum StatsEntry: ItemListNodeEntry {
|
|||
case earnStarsInfo
|
||||
case adsTransactionsTitle(PresentationTheme, String)
|
||||
case adsTransactionsTabs(PresentationTheme, String, String, Bool)
|
||||
case adsTransaction(Int32, PresentationTheme, RevenueStatsTransactionsContext.State.Transaction)
|
||||
case adsTransaction(Int32, PresentationTheme, StarsContext.State.Transaction)
|
||||
case adsStarsTransaction(Int32, PresentationTheme, StarsContext.State.Transaction)
|
||||
case adsTransactionsExpand(PresentationTheme, String, Bool)
|
||||
|
||||
|
|
@ -1155,8 +1155,7 @@ private enum StatsEntry: ItemListNodeEntry {
|
|||
let detailText: String
|
||||
var detailColor: ItemListDisclosureItemDetailLabelColor = .generic
|
||||
|
||||
switch transaction {
|
||||
case let .proceeds(_, fromDate, toDate):
|
||||
if let fromDate = transaction.adsProceedsFromDate, let toDate = transaction.adsProceedsToDate {
|
||||
title = NSAttributedString(string: presentationData.strings.Monetization_Transaction_Proceeds, font: font, textColor: theme.list.itemPrimaryTextColor)
|
||||
let fromDateString = stringForMediumCompactDate(timestamp: fromDate, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, withTime: false)
|
||||
let toDateString = stringForMediumCompactDate(timestamp: toDate, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, withTime: false)
|
||||
|
|
@ -1165,24 +1164,26 @@ private enum StatsEntry: ItemListNodeEntry {
|
|||
} else {
|
||||
detailText = "\(fromDateString) – \(toDateString)"
|
||||
}
|
||||
case let .withdrawal(status, _, date, provider, _, _):
|
||||
title = NSAttributedString(string: presentationData.strings.Monetization_Transaction_Withdrawal(provider).string, font: font, textColor: theme.list.itemPrimaryTextColor)
|
||||
} else if case .fragment = transaction.peer {
|
||||
title = NSAttributedString(string: presentationData.strings.Monetization_Transaction_Withdrawal("Fragment").string, font: font, textColor: theme.list.itemPrimaryTextColor)
|
||||
labelColor = theme.list.itemDestructiveColor
|
||||
switch status {
|
||||
case .succeed:
|
||||
detailText = stringForMediumCompactDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)
|
||||
case .failed:
|
||||
detailText = stringForMediumCompactDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, withTime: false) + " – \(presentationData.strings.Monetization_Transaction_Failed)"
|
||||
detailColor = .destructive
|
||||
case .pending:
|
||||
if transaction.flags.contains(.isPending) {
|
||||
detailText = presentationData.strings.Monetization_Transaction_Pending
|
||||
} else if transaction.flags.contains(.isFailed) {
|
||||
detailText = stringForMediumCompactDate(timestamp: transaction.date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, withTime: false) + " – \(presentationData.strings.Monetization_Transaction_Failed)"
|
||||
detailColor = .destructive
|
||||
} else {
|
||||
detailText = stringForMediumCompactDate(timestamp: transaction.date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)
|
||||
}
|
||||
case let .refund(_, date, _):
|
||||
} else if transaction.flags.contains(.isRefund) {
|
||||
title = NSAttributedString(string: presentationData.strings.Monetization_Transaction_Refund, font: font, textColor: theme.list.itemPrimaryTextColor)
|
||||
detailText = stringForMediumCompactDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)
|
||||
detailText = stringForMediumCompactDate(timestamp: transaction.date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)
|
||||
} else {
|
||||
title = NSAttributedString()
|
||||
detailText = ""
|
||||
}
|
||||
|
||||
let label = tonAmountAttributedString(formatTonAmountText(transaction.amount, dateTimeFormat: presentationData.dateTimeFormat, showPlus: true), integralFont: font, fractionalFont: smallLabelFont, color: labelColor, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
let label = tonAmountAttributedString(formatTonAmountText(transaction.count.amount.value, dateTimeFormat: presentationData.dateTimeFormat, showPlus: true), integralFont: font, fractionalFont: smallLabelFont, color: labelColor, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
|
||||
label.insert(NSAttributedString(string: " $ ", font: font, textColor: labelColor), at: 1)
|
||||
if let range = label.string.range(of: "$"), let icon = generateTintedImage(image: UIImage(bundleImageName: "Ads/TonMedium"), color: labelColor) {
|
||||
|
|
@ -1565,9 +1566,9 @@ private func monetizationEntries(
|
|||
presentationData: PresentationData,
|
||||
state: ChannelStatsControllerState,
|
||||
peer: EnginePeer?,
|
||||
data: RevenueStats?,
|
||||
data: StarsRevenueStats?,
|
||||
boostData: ChannelBoostStatus?,
|
||||
transactionsInfo: RevenueStatsTransactionsContext.State,
|
||||
transactionsInfo: StarsTransactionsContext.State,
|
||||
starsData: StarsRevenueStats?,
|
||||
starsTransactionsInfo: StarsTransactionsContext.State,
|
||||
adsRestricted: Bool,
|
||||
|
|
@ -1587,9 +1588,9 @@ private func monetizationEntries(
|
|||
if canViewRevenue, let data {
|
||||
entries.append(.adsHeader(presentationData.theme, isBot ? presentationData.strings.Monetization_Bot_Header : presentationData.strings.Monetization_Header))
|
||||
|
||||
if !data.topHoursGraph.isEmpty {
|
||||
if let topHoursGraph = data.topHoursGraph, !topHoursGraph.isEmpty {
|
||||
entries.append(.adsImpressionsTitle(presentationData.theme, presentationData.strings.Monetization_ImpressionsTitle))
|
||||
entries.append(.adsImpressionsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, data.topHoursGraph, .hourlyStep))
|
||||
entries.append(.adsImpressionsGraph(presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, topHoursGraph, .hourlyStep))
|
||||
}
|
||||
|
||||
if !data.revenueGraph.isEmpty {
|
||||
|
|
@ -1608,8 +1609,8 @@ private func monetizationEntries(
|
|||
entries.append(.adsProceedsTitle(presentationData.theme, presentationData.strings.Monetization_StarsProceeds_Title))
|
||||
entries.append(.adsProceedsOverview(presentationData.theme, canViewRevenue ? data : nil, canViewStarsRevenue ? starsData : nil))
|
||||
|
||||
let hasTonBalance = (data?.balances.overallRevenue ?? 0) > 0
|
||||
let hasStarsBalance = (starsData?.balances.overallRevenue ?? StarsAmount.zero) > StarsAmount.zero
|
||||
let hasTonBalance = (data?.balances.overallRevenue.amount ?? StarsAmount.zero) > StarsAmount.zero
|
||||
let hasStarsBalance = (starsData?.balances.overallRevenue.amount ?? StarsAmount.zero) > StarsAmount.zero
|
||||
|
||||
let proceedsInfo: String
|
||||
if (canViewStarsRevenue && hasStarsBalance) && (canViewRevenue && hasTonBalance) {
|
||||
|
|
@ -1632,11 +1633,11 @@ private func monetizationEntries(
|
|||
|
||||
if canViewRevenue, let data {
|
||||
entries.append(.adsTonBalanceTitle(presentationData.theme, isBot ? presentationData.strings.Monetization_Bot_BalanceTitle : presentationData.strings.Monetization_TonBalanceTitle))
|
||||
entries.append(.adsTonBalance(presentationData.theme, data, (isCreator || isBot) && data.balances.availableBalance > 0, data.balances.withdrawEnabled))
|
||||
entries.append(.adsTonBalance(presentationData.theme, data, (isCreator || isBot) && data.balances.availableBalance.amount > StarsAmount.zero, data.balances.withdrawEnabled))
|
||||
|
||||
if isCreator || isBot {
|
||||
let withdrawalInfoText: String
|
||||
if data.balances.availableBalance == 0 {
|
||||
if data.balances.availableBalance.amount == StarsAmount.zero {
|
||||
withdrawalInfoText = presentationData.strings.Monetization_Balance_ZeroInfo
|
||||
} else if monetizationConfiguration.withdrawalAvailable {
|
||||
withdrawalInfoText = presentationData.strings.Monetization_Balance_AvailableInfo
|
||||
|
|
@ -1647,9 +1648,9 @@ private func monetizationEntries(
|
|||
}
|
||||
}
|
||||
|
||||
if canViewStarsRevenue, let starsData, starsData.balances.overallRevenue > StarsAmount.zero {
|
||||
if canViewStarsRevenue, let starsData, starsData.balances.overallRevenue.amount > StarsAmount.zero {
|
||||
entries.append(.adsStarsBalanceTitle(presentationData.theme, presentationData.strings.Monetization_StarsBalanceTitle))
|
||||
entries.append(.adsStarsBalance(presentationData.theme, starsData, isCreator && starsData.balances.availableBalance > StarsAmount.zero, !isGroup, starsData.balances.withdrawEnabled, starsData.balances.nextWithdrawalTimestamp))
|
||||
entries.append(.adsStarsBalance(presentationData.theme, starsData, isCreator && starsData.balances.availableBalance.amount > StarsAmount.zero, !isGroup, starsData.balances.withdrawEnabled, starsData.balances.nextWithdrawalTimestamp))
|
||||
entries.append(.adsStarsBalanceInfo(presentationData.theme, isGroup ? presentationData.strings.Monetization_Balance_StarsInfoGroup : presentationData.strings.Monetization_Balance_StarsInfo))
|
||||
}
|
||||
|
||||
|
|
@ -1693,12 +1694,12 @@ private func monetizationEntries(
|
|||
i += 1
|
||||
}
|
||||
|
||||
if transactions.count < transactionsInfo.count {
|
||||
if transactionsInfo.canLoadMore || transactionsInfo.transactions.count > transactions.count {
|
||||
let moreCount: Int32
|
||||
if !state.transactionsExpanded {
|
||||
moreCount = min(20, transactionsInfo.count - Int32(transactions.count))
|
||||
moreCount = min(20, Int32(transactionsInfo.transactions.count - transactions.count))
|
||||
} else {
|
||||
moreCount = min(50, transactionsInfo.count - Int32(transactions.count))
|
||||
moreCount = min(50, Int32(transactionsInfo.transactions.count - transactions.count))
|
||||
}
|
||||
entries.append(.adsTransactionsExpand(presentationData.theme, presentationData.strings.Monetization_Transaction_ShowMoreTransactions(moreCount), false))
|
||||
}
|
||||
|
|
@ -1762,8 +1763,8 @@ private func channelStatsControllerEntries(
|
|||
giveawayAvailable: Bool,
|
||||
isGroup: Bool,
|
||||
boostsOnly: Bool,
|
||||
revenueState: RevenueStats?,
|
||||
revenueTransactions: RevenueStatsTransactionsContext.State,
|
||||
revenueState: StarsRevenueStats?,
|
||||
revenueTransactions: StarsTransactionsContext.State,
|
||||
starsState: StarsRevenueStats?,
|
||||
starsTransactions: StarsTransactionsContext.State,
|
||||
adsRestricted: Bool,
|
||||
|
|
@ -1826,7 +1827,7 @@ public func channelStatsController(
|
|||
updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil,
|
||||
peerId: PeerId,
|
||||
section: ChannelStatsSection = .stats,
|
||||
existingRevenueContext: RevenueStatsContext? = nil,
|
||||
existingRevenueContext: StarsRevenueStatsContext? = nil,
|
||||
existingStarsRevenueContext: StarsRevenueStatsContext? = nil,
|
||||
boostStatus: ChannelBoostStatus? = nil,
|
||||
boostStatusUpdated: ((ChannelBoostStatus) -> Void)? = nil
|
||||
|
|
@ -1887,15 +1888,16 @@ public func channelStatsController(
|
|||
|
||||
let boostsContext = ChannelBoostersContext(account: context.account, peerId: peerId, gift: false)
|
||||
let giftsContext = ChannelBoostersContext(account: context.account, peerId: peerId, gift: true)
|
||||
let revenueContext = existingRevenueContext ?? RevenueStatsContext(account: context.account, peerId: peerId)
|
||||
let revenueState = Promise<RevenueStatsContextState?>()
|
||||
let revenueContext = existingRevenueContext ?? context.engine.payments.peerStarsRevenueContext(peerId: peerId, ton: true)
|
||||
let revenueState = Promise<StarsRevenueStatsContextState?>()
|
||||
revenueState.set(.single(nil) |> then(revenueContext.state |> map(Optional.init)))
|
||||
|
||||
let starsContext = existingStarsRevenueContext ?? context.engine.payments.peerStarsRevenueContext(peerId: peerId)
|
||||
let starsContext = existingStarsRevenueContext ?? context.engine.payments.peerStarsRevenueContext(peerId: peerId, ton: false)
|
||||
let starsState = Promise<StarsRevenueStatsContextState?>()
|
||||
starsState.set(.single(nil) |> then(starsContext.state |> map(Optional.init)))
|
||||
|
||||
let revenueTransactions = RevenueStatsTransactionsContext(account: context.account, peerId: peerId)
|
||||
let revenueTransactions = context.engine.payments.peerStarsTransactionsContext(subject: .peer(peerId: peerId, ton: true), mode: .all)
|
||||
revenueTransactions.loadMore()
|
||||
let starsTransactions = context.engine.payments.peerStarsTransactionsContext(subject: .peer(peerId: peerId, ton: false), mode: .all)
|
||||
starsTransactions.loadMore()
|
||||
|
||||
|
|
@ -1906,7 +1908,7 @@ public func channelStatsController(
|
|||
var navigateToChatImpl: ((EnginePeer) -> Void)?
|
||||
var navigateToMessageImpl: ((EngineMessage.Id) -> Void)?
|
||||
var openBoostImpl: ((Bool) -> Void)?
|
||||
var openTonTransactionImpl: ((RevenueStatsTransactionsContext.State.Transaction) -> Void)?
|
||||
var openTonTransactionImpl: ((StarsContext.State.Transaction) -> Void)?
|
||||
var openStarsTransactionImpl: ((StarsContext.State.Transaction) -> Void)?
|
||||
var requestTonWithdrawImpl: (() -> Void)?
|
||||
var requestStarsWithdrawImpl: (() -> Void)?
|
||||
|
|
@ -2514,7 +2516,7 @@ public func channelStatsController(
|
|||
}
|
||||
}
|
||||
requestTonWithdrawImpl = {
|
||||
withdrawalDisposable.set((context.engine.peers.checkChannelRevenueWithdrawalAvailability()
|
||||
withdrawalDisposable.set((context.engine.peers.checkStarsRevenueWithdrawalAvailability()
|
||||
|> deliverOnMainQueue).start(error: { error in
|
||||
let controller = revenueWithdrawalController(context: context, updatedPresentationData: updatedPresentationData, peerId: peerId, initialError: error, present: { c, _ in
|
||||
presentImpl?(c)
|
||||
|
|
|
|||
|
|
@ -175,14 +175,17 @@ final class MonetizationBalanceItemNode: ListViewItemNode, ItemListItemNode {
|
|||
let value: String
|
||||
|
||||
var isStars = false
|
||||
if let stats = item.stats as? RevenueStats {
|
||||
let cryptoValue = formatTonAmountText(stats.balances.availableBalance, dateTimeFormat: item.presentationData.dateTimeFormat)
|
||||
amountString = tonAmountAttributedString(cryptoValue, integralFont: integralFont, fractionalFont: fractionalFont, color: item.presentationData.theme.list.itemPrimaryTextColor, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator)
|
||||
value = stats.balances.availableBalance == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))"
|
||||
} else if let stats = item.stats as? StarsRevenueStats {
|
||||
amountString = NSAttributedString(string: presentationStringsFormattedNumber(stats.balances.availableBalance, item.presentationData.dateTimeFormat.groupingSeparator), font: integralFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor)
|
||||
value = stats.balances.availableBalance == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))"
|
||||
isStars = true
|
||||
if let stats = item.stats as? StarsRevenueStats {
|
||||
switch stats.balances.availableBalance.currency {
|
||||
case .ton:
|
||||
let cryptoValue = formatTonAmountText(stats.balances.availableBalance.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat)
|
||||
amountString = tonAmountAttributedString(cryptoValue, integralFont: integralFont, fractionalFont: fractionalFont, color: item.presentationData.theme.list.itemPrimaryTextColor, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator)
|
||||
value = stats.balances.availableBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))"
|
||||
case .stars:
|
||||
amountString = NSAttributedString(string: presentationStringsFormattedNumber(stats.balances.availableBalance.amount, item.presentationData.dateTimeFormat.groupingSeparator), font: integralFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor)
|
||||
value = stats.balances.availableBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.amount.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))"
|
||||
isStars = true
|
||||
}
|
||||
} else {
|
||||
fatalError()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ func confirmRevenueWithdrawalController(context: AccountContext, updatedPresenta
|
|||
}
|
||||
contentNode.updateIsChecking(true)
|
||||
|
||||
let signal = context.engine.peers.requestChannelRevenueWithdrawalUrl(peerId: peerId, password: contentNode.password)
|
||||
let signal = context.engine.peers.requestStarsRevenueWithdrawalUrl(peerId: peerId, ton: false, amount: nil, password: contentNode.password)
|
||||
disposable.set((signal |> deliverOnMainQueue).start(next: { url in
|
||||
dismissImpl?()
|
||||
completion(url)
|
||||
|
|
@ -73,7 +73,7 @@ func confirmRevenueWithdrawalController(context: AccountContext, updatedPresenta
|
|||
}
|
||||
|
||||
|
||||
func revenueWithdrawalController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil, peerId: EnginePeer.Id, initialError: RequestRevenueWithdrawalError, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (String) -> Void) -> ViewController {
|
||||
func revenueWithdrawalController(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>)? = nil, peerId: EnginePeer.Id, initialError: RequestStarsRevenueWithdrawalError, present: @escaping (ViewController, Any?) -> Void, completion: @escaping (String) -> Void) -> ViewController {
|
||||
let presentationData = updatedPresentationData?.initial ?? context.sharedContext.currentPresentationData.with { $0 }
|
||||
let theme = AlertControllerTheme(presentationData: presentationData)
|
||||
|
||||
|
|
|
|||
|
|
@ -36,10 +36,6 @@ extension StoryStats: Stats {
|
|||
|
||||
}
|
||||
|
||||
extension RevenueStats: Stats {
|
||||
|
||||
}
|
||||
|
||||
extension StarsRevenueStats: Stats {
|
||||
|
||||
}
|
||||
|
|
@ -763,8 +759,8 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
} else {
|
||||
height += topLeftItemLayoutAndApply!.0.height * 4.0 + verticalSpacing * 3.0
|
||||
}
|
||||
} else if let stats = item.stats as? RevenueStats {
|
||||
if let additionalStats = item.additionalStats as? StarsRevenueStats, additionalStats.balances.overallRevenue > StarsAmount.zero {
|
||||
} else if let stats = item.stats as? StarsRevenueStats, case .ton = stats.balances.overallRevenue.currency {
|
||||
if let additionalStats = item.additionalStats as? StarsRevenueStats, additionalStats.balances.overallRevenue.amount > StarsAmount.zero {
|
||||
twoColumnLayout = true
|
||||
useMinLeftColumnWidth = true
|
||||
|
||||
|
|
@ -772,9 +768,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.availableBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.availableBalance.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Available,
|
||||
(stats.balances.availableBalance == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.availableBalance.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -782,9 +778,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.currentBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.currentBalance.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Current,
|
||||
(stats.balances.currentBalance == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.currentBalance.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -792,9 +788,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.overallRevenue, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.overallRevenue.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Total,
|
||||
(stats.balances.overallRevenue == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.overallRevenue.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -802,9 +798,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(additionalStats.balances.availableBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(additionalStats.balances.availableBalance.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
" ",
|
||||
(additionalStats.balances.availableBalance == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.availableBalance.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(additionalStats.balances.availableBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.availableBalance.amount.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
@ -812,9 +808,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(additionalStats.balances.currentBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(additionalStats.balances.currentBalance.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
" ",
|
||||
(additionalStats.balances.currentBalance == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.currentBalance.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(additionalStats.balances.currentBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.currentBalance.amount.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
@ -822,9 +818,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(additionalStats.balances.overallRevenue, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(additionalStats.balances.overallRevenue.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
" ",
|
||||
(additionalStats.balances.overallRevenue == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.overallRevenue.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(additionalStats.balances.overallRevenue.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(additionalStats.balances.overallRevenue.amount.value, divide: false, rate: additionalStats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
@ -836,9 +832,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.availableBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.availableBalance.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_Overview_Available,
|
||||
(stats.balances.availableBalance == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.availableBalance.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -846,9 +842,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.currentBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.currentBalance.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_Overview_Current,
|
||||
(stats.balances.currentBalance == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.currentBalance.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -856,9 +852,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatTonAmountText(stats.balances.overallRevenue, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatTonAmountText(stats.balances.overallRevenue.amount.value, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_Overview_Total,
|
||||
(stats.balances.overallRevenue == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.overallRevenue.amount.value == 0 ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue.amount.value, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.ton
|
||||
)
|
||||
|
||||
|
|
@ -871,9 +867,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(stats.balances.availableBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(stats.balances.availableBalance.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Available,
|
||||
(stats.balances.availableBalance == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.availableBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.availableBalance.amount.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
@ -881,9 +877,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(stats.balances.currentBalance, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(stats.balances.currentBalance.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Current,
|
||||
(stats.balances.currentBalance == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.currentBalance.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.currentBalance.amount.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
@ -891,9 +887,9 @@ class StatsOverviewItemNode: ListViewItemNode {
|
|||
item.context,
|
||||
params.width,
|
||||
item.presentationData,
|
||||
formatStarsAmountText(stats.balances.overallRevenue, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
formatStarsAmountText(stats.balances.overallRevenue.amount, dateTimeFormat: item.presentationData.dateTimeFormat),
|
||||
item.presentationData.strings.Monetization_StarsProceeds_Total,
|
||||
(stats.balances.overallRevenue == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
(stats.balances.overallRevenue.amount == StarsAmount.zero ? "" : "≈\(formatTonUsdValue(stats.balances.overallRevenue.amount.value, divide: false, rate: stats.usdRate, dateTimeFormat: item.presentationData.dateTimeFormat))", .generic),
|
||||
.stars
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -23,14 +23,14 @@ private final class SheetContent: CombinedComponent {
|
|||
|
||||
let context: AccountContext
|
||||
let peer: EnginePeer
|
||||
let transaction: RevenueStatsTransactionsContext.State.Transaction
|
||||
let transaction: StarsContext.State.Transaction
|
||||
let openExplorer: (String) -> Void
|
||||
let dismiss: () -> Void
|
||||
|
||||
init(
|
||||
context: AccountContext,
|
||||
peer: EnginePeer,
|
||||
transaction: RevenueStatsTransactionsContext.State.Transaction,
|
||||
transaction: StarsContext.State.Transaction,
|
||||
openExplorer: @escaping (String) -> Void,
|
||||
dismiss: @escaping () -> Void
|
||||
) {
|
||||
|
|
@ -136,40 +136,45 @@ private final class SheetContent: CombinedComponent {
|
|||
let labelColor: UIColor
|
||||
|
||||
var showPeer = false
|
||||
switch component.transaction {
|
||||
case let .proceeds(amount, fromDate, toDate):
|
||||
if let fromDate = component.transaction.adsProceedsFromDate, let toDate = component.transaction.adsProceedsToDate {
|
||||
labelColor = theme.list.itemDisclosureActions.constructive.fillColor
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(amount, dateTimeFormat: dateTimeFormat, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(component.transaction.count.amount.value, dateTimeFormat: dateTimeFormat, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = "\(stringForMediumCompactDate(timestamp: fromDate, strings: strings, dateTimeFormat: dateTimeFormat)) – \(stringForMediumCompactDate(timestamp: toDate, strings: strings, dateTimeFormat: dateTimeFormat))"
|
||||
titleString = strings.Monetization_TransactionInfo_Proceeds
|
||||
buttonTitle = strings.Common_OK
|
||||
explorerUrl = nil
|
||||
showPeer = true
|
||||
case let .withdrawal(status, amount, date, provider, _, transactionUrl):
|
||||
} else if case .fragment = component.transaction.peer {
|
||||
labelColor = theme.list.itemDestructiveColor
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(amount, dateTimeFormat: dateTimeFormat), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = stringForFullDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat)
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(component.transaction.count.amount.value, dateTimeFormat: dateTimeFormat), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = stringForFullDate(timestamp: component.transaction.date, strings: strings, dateTimeFormat: dateTimeFormat)
|
||||
|
||||
switch status {
|
||||
case .succeed:
|
||||
titleString = strings.Monetization_TransactionInfo_Withdrawal(provider).string
|
||||
buttonTitle = strings.Monetization_TransactionInfo_ViewInExplorer
|
||||
case .pending:
|
||||
if component.transaction.flags.contains(.isPending) {
|
||||
titleString = strings.Monetization_TransactionInfo_Pending
|
||||
buttonTitle = strings.Common_OK
|
||||
case .failed:
|
||||
} else if component.transaction.flags.contains(.isFailed) {
|
||||
titleString = strings.Monetization_TransactionInfo_Failed
|
||||
buttonTitle = strings.Common_OK
|
||||
titleColor = theme.list.itemDestructiveColor
|
||||
} else {
|
||||
titleString = strings.Monetization_TransactionInfo_Withdrawal("Fragment").string
|
||||
buttonTitle = strings.Monetization_TransactionInfo_ViewInExplorer
|
||||
}
|
||||
explorerUrl = transactionUrl
|
||||
case let .refund(amount, date, _):
|
||||
explorerUrl = component.transaction.transactionUrl
|
||||
} else if component.transaction.flags.contains(.isRefund) {
|
||||
labelColor = theme.list.itemDisclosureActions.constructive.fillColor
|
||||
titleString = strings.Monetization_TransactionInfo_Refund
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(amount, dateTimeFormat: dateTimeFormat, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = stringForFullDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat)
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(component.transaction.count.amount.value, dateTimeFormat: dateTimeFormat, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = stringForFullDate(timestamp: component.transaction.date, strings: strings, dateTimeFormat: dateTimeFormat)
|
||||
buttonTitle = strings.Common_OK
|
||||
explorerUrl = nil
|
||||
} else {
|
||||
labelColor = theme.list.itemDisclosureActions.constructive.fillColor
|
||||
amountString = tonAmountAttributedString(formatTonAmountText(component.transaction.count.amount.value, dateTimeFormat: dateTimeFormat, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor, decimalSeparator: dateTimeFormat.decimalSeparator).mutableCopy() as! NSMutableAttributedString
|
||||
dateString = ""
|
||||
titleString = ""
|
||||
buttonTitle = ""
|
||||
explorerUrl = nil
|
||||
}
|
||||
|
||||
amountString.insert(NSAttributedString(string: " $ ", font: integralFont, textColor: labelColor), at: 1)
|
||||
|
|
@ -293,13 +298,13 @@ private final class SheetContainerComponent: CombinedComponent {
|
|||
|
||||
let context: AccountContext
|
||||
let peer: EnginePeer
|
||||
let transaction: RevenueStatsTransactionsContext.State.Transaction
|
||||
let transaction: StarsContext.State.Transaction
|
||||
let openExplorer: (String) -> Void
|
||||
|
||||
init(
|
||||
context: AccountContext,
|
||||
peer: EnginePeer,
|
||||
transaction: RevenueStatsTransactionsContext.State.Transaction,
|
||||
transaction: StarsContext.State.Transaction,
|
||||
openExplorer: @escaping (String) -> Void
|
||||
) {
|
||||
self.context = context
|
||||
|
|
@ -410,7 +415,7 @@ final class TransactionInfoScreen: ViewControllerComponentContainer {
|
|||
init(
|
||||
context: AccountContext,
|
||||
peer: EnginePeer,
|
||||
transaction: RevenueStatsTransactionsContext.State.Transaction,
|
||||
transaction: StarsContext.State.Transaction,
|
||||
openExplorer: @escaping (String) -> Void
|
||||
) {
|
||||
self.context = context
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue