mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 17:30:12 +00:00
Display USD revenue in graph details
This commit is contained in:
parent
df62e25f5a
commit
4696ca34b8
@ -12851,3 +12851,7 @@ Sorry for the inconvenience.";
|
|||||||
"Stars.Transaction.Giveaway.Prize" = "Prize";
|
"Stars.Transaction.Giveaway.Prize" = "Prize";
|
||||||
"Stars.Transaction.Giveaway.Stars_1" = "%@ Star";
|
"Stars.Transaction.Giveaway.Stars_1" = "%@ Star";
|
||||||
"Stars.Transaction.Giveaway.Stars_any" = "%@ Stars";
|
"Stars.Transaction.Giveaway.Stars_any" = "%@ Stars";
|
||||||
|
|
||||||
|
"Stats.RevenueInTon" = "Revenue in TON";
|
||||||
|
"Stats.RevenueInStars" = "Revenue in Stars";
|
||||||
|
"Stats.RevenueInUsd" = "Revenue in USD";
|
||||||
|
|||||||
@ -35,6 +35,9 @@ class GeneralChartComponentController: ChartThemeContainer {
|
|||||||
var initialHorizontalRange: ClosedRange<CGFloat> = BaseConstants.defaultRange
|
var initialHorizontalRange: ClosedRange<CGFloat> = BaseConstants.defaultRange
|
||||||
var initialVerticalRange: ClosedRange<CGFloat> = BaseConstants.defaultRange
|
var initialVerticalRange: ClosedRange<CGFloat> = BaseConstants.defaultRange
|
||||||
|
|
||||||
|
var currency: GraphCurrency?
|
||||||
|
var conversionRate: Double = 1.0
|
||||||
|
|
||||||
public var cartViewBounds: (() -> CGRect) = { fatalError() }
|
public var cartViewBounds: (() -> CGRect) = { fatalError() }
|
||||||
public var chartFrame: (() -> CGRect) = { fatalError() }
|
public var chartFrame: (() -> CGRect) = { fatalError() }
|
||||||
|
|
||||||
@ -201,7 +204,7 @@ class GeneralChartComponentController: ChartThemeContainer {
|
|||||||
|
|
||||||
var detailsVisible = false
|
var detailsVisible = false
|
||||||
func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animated: Bool, feedback: Bool) {
|
func showDetailsView(at chartPosition: CGFloat, detailsViewPosition: CGFloat, dataIndex: Int, date: Date, animated: Bool, feedback: Bool) {
|
||||||
setDetailsViewModel?(chartDetailsViewModel(closestDate: date, pointIndex: dataIndex), animated, feedback)
|
setDetailsViewModel?(chartDetailsViewModel(closestDate: date, pointIndex: dataIndex, currency: self.currency, rate: self.conversionRate), animated, feedback)
|
||||||
setDetailsChartVisibleClosure?(true, true)
|
setDetailsChartVisibleClosure?(true, true)
|
||||||
setDetailsViewPositionClosure?(detailsViewPosition)
|
setDetailsViewPositionClosure?(detailsViewPosition)
|
||||||
detailsVisible = true
|
detailsVisible = true
|
||||||
@ -329,8 +332,8 @@ class GeneralChartComponentController: ChartThemeContainer {
|
|||||||
return (updatedRange, verticalLabels)
|
return (updatedRange, verticalLabels)
|
||||||
}
|
}
|
||||||
|
|
||||||
func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel {
|
func chartDetailsViewModel(closestDate: Date, pointIndex: Int, currency: GraphCurrency? = nil, rate: Double = 1.0) -> ChartDetailsViewModel {
|
||||||
let values: [ChartDetailsViewModel.Value] = chartsCollection.chartValues.enumerated().map { arg in
|
var values: [ChartDetailsViewModel.Value] = chartsCollection.chartValues.enumerated().map { arg in
|
||||||
let (index, component) = arg
|
let (index, component) = arg
|
||||||
return ChartDetailsViewModel.Value(prefix: nil,
|
return ChartDetailsViewModel.Value(prefix: nil,
|
||||||
title: component.name,
|
title: component.name,
|
||||||
@ -338,6 +341,39 @@ class GeneralChartComponentController: ChartThemeContainer {
|
|||||||
color: component.color,
|
color: component.color,
|
||||||
visible: chartVisibility[index])
|
visible: chartVisibility[index])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let currency, let firstValue = values.first, let color = GColor(hexString: "#dda747") {
|
||||||
|
let updatedTitle: String
|
||||||
|
switch currency {
|
||||||
|
case .ton:
|
||||||
|
updatedTitle = self.strings.revenueInTon
|
||||||
|
case .xtr:
|
||||||
|
updatedTitle = self.strings.revenueInStars
|
||||||
|
}
|
||||||
|
values[0] = ChartDetailsViewModel.Value(
|
||||||
|
prefix: nil,
|
||||||
|
title: updatedTitle,
|
||||||
|
value: firstValue.value,
|
||||||
|
color: color,
|
||||||
|
visible: firstValue.visible
|
||||||
|
)
|
||||||
|
|
||||||
|
let convertedValue = (self.verticalLimitsNumberFormatter.number(from: firstValue.value) as? Double ?? 0.0) * rate
|
||||||
|
let convertedValueString: String
|
||||||
|
if convertedValue > 1.0 {
|
||||||
|
convertedValueString = String(format: "%0.1f", convertedValue)
|
||||||
|
} else {
|
||||||
|
convertedValueString = String(format: "%0.3f", convertedValue)
|
||||||
|
}
|
||||||
|
values.append(ChartDetailsViewModel.Value(
|
||||||
|
prefix: nil,
|
||||||
|
title: self.strings.revenueInUsd,
|
||||||
|
value: "≈$\(convertedValueString)",
|
||||||
|
color: color,
|
||||||
|
visible: firstValue.visible
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
let dateString: String
|
let dateString: String
|
||||||
if isZoomed {
|
if isZoomed {
|
||||||
dateString = BaseConstants.timeDateFormatter.string(from: closestDate)
|
dateString = BaseConstants.timeDateFormatter.string(from: closestDate)
|
||||||
|
|||||||
@ -131,7 +131,7 @@ class PercentChartComponentController: GeneralChartComponentController {
|
|||||||
verticalScalesRenderer.setVisible(visibility.contains(true), animated: animated)
|
verticalScalesRenderer.setVisible(visibility.contains(true), animated: animated)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel {
|
override func chartDetailsViewModel(closestDate: Date, pointIndex: Int, currency: GraphCurrency? = nil, rate: Double = 1.0) -> ChartDetailsViewModel {
|
||||||
let visibleValues = visibleDetailsChartValues
|
let visibleValues = visibleDetailsChartValues
|
||||||
|
|
||||||
let total = visibleValues.map { $0.values[pointIndex] }.reduce(0, +)
|
let total = visibleValues.map { $0.values[pointIndex] }.reduce(0, +)
|
||||||
|
|||||||
@ -149,7 +149,6 @@ class BarsComponentController: GeneralChartComponentController {
|
|||||||
components: visibleComponents)
|
components: visibleComponents)
|
||||||
}
|
}
|
||||||
|
|
||||||
var conversionRate: Double = 1.0
|
|
||||||
func verticalLimitsLabels(verticalRange: ClosedRange<CGFloat>, secondary: Bool) -> (ClosedRange<CGFloat>, [LinesChartLabel]) {
|
func verticalLimitsLabels(verticalRange: ClosedRange<CGFloat>, secondary: Bool) -> (ClosedRange<CGFloat>, [LinesChartLabel]) {
|
||||||
var (range, labels) = super.verticalLimitsLabels(verticalRange: verticalRange)
|
var (range, labels) = super.verticalLimitsLabels(verticalRange: verticalRange)
|
||||||
if secondary {
|
if secondary {
|
||||||
@ -223,8 +222,8 @@ class BarsComponentController: GeneralChartComponentController {
|
|||||||
return visibleCharts
|
return visibleCharts
|
||||||
}
|
}
|
||||||
|
|
||||||
override func chartDetailsViewModel(closestDate: Date, pointIndex: Int) -> ChartDetailsViewModel {
|
override func chartDetailsViewModel(closestDate: Date, pointIndex: Int, currency: GraphCurrency? = nil, rate: Double = 1.0) -> ChartDetailsViewModel {
|
||||||
var viewModel = super.chartDetailsViewModel(closestDate: closestDate, pointIndex: pointIndex)
|
var viewModel = super.chartDetailsViewModel(closestDate: closestDate, pointIndex: pointIndex, currency: currency, rate: rate)
|
||||||
let visibleChartValues = self.visibleChartValues
|
let visibleChartValues = self.visibleChartValues
|
||||||
let totalSumm: CGFloat = visibleChartValues.map { CGFloat($0.values[pointIndex]) }.reduce(0, +)
|
let totalSumm: CGFloat = visibleChartValues.map { CGFloat($0.values[pointIndex]) }.reduce(0, +)
|
||||||
viewModel.hideAction = { [weak self] in
|
viewModel.hideAction = { [weak self] in
|
||||||
|
|||||||
@ -28,8 +28,6 @@ public enum GraphCurrency : String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class StackedBarsChartController: BaseChartController {
|
public class StackedBarsChartController: BaseChartController {
|
||||||
|
|
||||||
|
|
||||||
let barsController: BarsComponentController
|
let barsController: BarsComponentController
|
||||||
let zoomedBarsController: BarsComponentController
|
let zoomedBarsController: BarsComponentController
|
||||||
|
|
||||||
@ -55,6 +53,7 @@ public class StackedBarsChartController: BaseChartController {
|
|||||||
secondaryScalesRenderer: secondaryScalesRenderer,
|
secondaryScalesRenderer: secondaryScalesRenderer,
|
||||||
previewBarsChartRenderer: BarChartRenderer())
|
previewBarsChartRenderer: BarChartRenderer())
|
||||||
if let currency {
|
if let currency {
|
||||||
|
barsController.currency = currency
|
||||||
barsController.conversionRate = rate
|
barsController.conversionRate = rate
|
||||||
barsController.verticalLimitsNumberFormatter = currency.formatter
|
barsController.verticalLimitsNumberFormatter = currency.formatter
|
||||||
barsController.detailsNumberFormatter = currency.formatter
|
barsController.detailsNumberFormatter = currency.formatter
|
||||||
|
|||||||
@ -30,13 +30,31 @@ public protocol ChartThemeContainer {
|
|||||||
public class ChartStrings {
|
public class ChartStrings {
|
||||||
public let zoomOut: String
|
public let zoomOut: String
|
||||||
public let total: String
|
public let total: String
|
||||||
|
public let revenueInTon: String
|
||||||
|
public let revenueInStars: String
|
||||||
|
public let revenueInUsd: String
|
||||||
|
|
||||||
public init(zoomOut: String, total: String) {
|
public init(
|
||||||
|
zoomOut: String,
|
||||||
|
total: String,
|
||||||
|
revenueInTon: String,
|
||||||
|
revenueInStars: String,
|
||||||
|
revenueInUsd: String
|
||||||
|
) {
|
||||||
self.zoomOut = zoomOut
|
self.zoomOut = zoomOut
|
||||||
self.total = total
|
self.total = total
|
||||||
|
self.revenueInTon = revenueInTon
|
||||||
|
self.revenueInStars = revenueInStars
|
||||||
|
self.revenueInUsd = revenueInUsd
|
||||||
}
|
}
|
||||||
|
|
||||||
public static var defaultStrings = ChartStrings(zoomOut: "Zoom Out", total: "Total")
|
public static var defaultStrings = ChartStrings(
|
||||||
|
zoomOut: "Zoom Out",
|
||||||
|
total: "Total",
|
||||||
|
revenueInTon: "Revenue in TON",
|
||||||
|
revenueInStars: "Revenue in Stars",
|
||||||
|
revenueInUsd: "Revenue in USD"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChartTheme {
|
public class ChartTheme {
|
||||||
|
|||||||
@ -295,7 +295,16 @@ public final class StatsGraphItemNode: ListViewItemNode {
|
|||||||
strongSelf.activityIndicator.type = .custom(item.presentationData.theme.list.itemSecondaryTextColor, 16.0, 2.0, false)
|
strongSelf.activityIndicator.type = .custom(item.presentationData.theme.list.itemSecondaryTextColor, 16.0, 2.0, false)
|
||||||
|
|
||||||
if let updatedTheme = updatedTheme {
|
if let updatedTheme = updatedTheme {
|
||||||
strongSelf.chartNode.setup(theme: ChartTheme(presentationTheme: updatedTheme), strings: ChartStrings(zoomOut: item.presentationData.strings.Stats_ZoomOut, total: item.presentationData.strings.Stats_Total))
|
strongSelf.chartNode.setup(
|
||||||
|
theme: ChartTheme(presentationTheme: updatedTheme),
|
||||||
|
strings: ChartStrings(
|
||||||
|
zoomOut: item.presentationData.strings.Stats_ZoomOut,
|
||||||
|
total: item.presentationData.strings.Stats_Total,
|
||||||
|
revenueInTon: item.presentationData.strings.Stats_RevenueInTon,
|
||||||
|
revenueInStars: item.presentationData.strings.Stats_RevenueInStars,
|
||||||
|
revenueInUsd: item.presentationData.strings.Stats_RevenueInUsd
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let updatedGraph = updatedGraph {
|
if let updatedGraph = updatedGraph {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user