Various fixes

This commit is contained in:
Ilya Laktyushin 2024-07-13 18:46:42 +04:00
parent 57c071fa4e
commit 6054069e60
13 changed files with 58 additions and 40 deletions

View File

@ -12493,6 +12493,21 @@ Sorry for the inconvenience.";
"Stars.Purchase.GiftStars" = "Gift Stars";
"Stars.Purchase.GiftInfo" = "With Stars, **%1$@** will be able to unlock content and services on Telegram. [See Examples >]()";
"Stars.Purchase.SubscriptionInfo" = "Buy Stars to subscribe for **%@**.";
"Stars.Purchase.SubscriptionRenewInfo" = "Buy Stars to keep your subscription for **%@**.";
"InviteLink.Create.Subscription" = "Require Monthly Fee";
"InviteLink.Create.Subscription.Placeholder" = "Stars amount per month";
"InviteLink.Create.Subscription.PerMonth" = "%@ / month";
"InviteLink.Create.Subscription.Info" = "Charge a subscription fee from people joining your channel via this link. [Learn More >]()";
"InviteLink.Create.Subscription.EditInfo" = "If you need to change the subscription fee, create a new invite link with a different price.";
"InviteLink.Create.RequestApprovalUnavailableInfo" = "You can't enable admin approval for links that require a monthly fee.";
"InviteLink.Subscription.Fee" = "Subscription Fee";
"InviteLink.Subscription.Info" = "You get approximately %@ monthly";
"Notification.StarsGift.Sent" = "%1$@ sent you a gift for %2$@";
"Notification.StarsGift.SentYou" = "You sent a gift for %@";
@ -12502,3 +12517,5 @@ Sorry for the inconvenience.";
"Notification.StarsGift.SubtitleYou" = "With Stars, %@ will be able to unlock content and services on Telegram.";
"Bot.Settings" = "Bot Settings";
"Browser.OpenInNewTap" = "";

View File

@ -1150,7 +1150,7 @@ private enum StatsEntry: ItemListNodeEntry {
detailText = stringForMediumCompactDate(timestamp: date, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)
}
let label = amountAttributedString(formatBalanceText(transaction.amount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator, showPlus: true), integralFont: font, fractionalFont: smallLabelFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
let label = tonAmountAttributedString(formatTonAmountText(transaction.amount, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator, showPlus: true), integralFont: font, fractionalFont: smallLabelFont, color: labelColor).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) {

View File

@ -12,6 +12,7 @@ import TextFormat
import ComponentFlow
import ButtonComponent
import BundleIconComponent
import TelegramStringFormatting
final class MonetizationBalanceItem: ListViewItem, ItemListItem {
let context: AccountContext
@ -175,12 +176,12 @@ final class MonetizationBalanceItemNode: ListViewItemNode, ItemListItemNode {
var isStars = false
if let stats = item.stats as? RevenueStats {
let cryptoValue = formatBalanceText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator)
amountString = amountAttributedString(cryptoValue, integralFont: integralFont, fractionalFont: fractionalFont, color: item.presentationData.theme.list.itemPrimaryTextColor)
value = stats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(stats.balances.availableBalance, rate: stats.usdRate))"
let cryptoValue = formatTonAmountText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator)
amountString = tonAmountAttributedString(cryptoValue, integralFont: integralFont, fractionalFont: fractionalFont, color: item.presentationData.theme.list.itemPrimaryTextColor)
value = stats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate))"
} else if let stats = item.stats as? StarsRevenueStats {
amountString = NSAttributedString(string: presentationStringsFormattedNumber(Int32(stats.balances.availableBalance), item.presentationData.dateTimeFormat.groupingSeparator), font: integralFont, textColor: item.presentationData.theme.list.itemPrimaryTextColor)
value = stats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(stats.balances.availableBalance, divide: false, rate: stats.usdRate))"
value = stats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.availableBalance, divide: false, rate: stats.usdRate))"
isStars = true
} else {
fatalError()

View File

@ -10,6 +10,7 @@ import PresentationDataUtils
import EmojiTextAttachmentView
import TextFormat
import AccountContext
import TelegramStringFormatting
protocol Stats {
@ -200,7 +201,7 @@ private final class ValueItemNode: ASDisplayNode {
let valueString: NSAttributedString
if case .ton = mode {
valueString = amountAttributedString(value, integralFont: valueFont, fractionalFont: smallValueFont, color: valueColor)
valueString = tonAmountAttributedString(value, integralFont: valueFont, fractionalFont: smallValueFont, color: valueColor)
} else {
valueString = NSAttributedString(string: value, font: valueFont, textColor: valueColor)
}
@ -771,9 +772,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Available,
(stats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
(stats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
.ton
)
@ -781,9 +782,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.currentBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.currentBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Current,
(stats.balances.currentBalance == 0 ? "" : "\(formatUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
(stats.balances.currentBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
.ton
)
@ -791,9 +792,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.overallRevenue, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.overallRevenue, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Total,
(stats.balances.overallRevenue == 0 ? "" : "\(formatUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
(stats.balances.overallRevenue == 0 ? "" : "\(formatTonUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
.ton
)
@ -803,7 +804,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(additionalStats.balances.availableBalance), item.presentationData.dateTimeFormat.groupingSeparator),
" ",
(additionalStats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(additionalStats.balances.availableBalance, divide: false, rate: additionalStats.usdRate))", .generic),
(additionalStats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(additionalStats.balances.availableBalance, divide: false, rate: additionalStats.usdRate))", .generic),
.stars
)
@ -813,7 +814,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(additionalStats.balances.currentBalance), item.presentationData.dateTimeFormat.groupingSeparator),
" ",
(additionalStats.balances.currentBalance == 0 ? "" : "\(formatUsdValue(additionalStats.balances.currentBalance, divide: false, rate: additionalStats.usdRate))", .generic),
(additionalStats.balances.currentBalance == 0 ? "" : "\(formatTonUsdValue(additionalStats.balances.currentBalance, divide: false, rate: additionalStats.usdRate))", .generic),
.stars
)
@ -823,7 +824,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(additionalStats.balances.overallRevenue), item.presentationData.dateTimeFormat.groupingSeparator),
" ",
(additionalStats.balances.overallRevenue == 0 ? "" : "\(formatUsdValue(additionalStats.balances.overallRevenue, divide: false, rate: additionalStats.usdRate))", .generic),
(additionalStats.balances.overallRevenue == 0 ? "" : "\(formatTonUsdValue(additionalStats.balances.overallRevenue, divide: false, rate: additionalStats.usdRate))", .generic),
.stars
)
@ -835,9 +836,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.availableBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_Overview_Available,
(stats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
(stats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
.ton
)
@ -845,9 +846,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.currentBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.currentBalance, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_Overview_Current,
(stats.balances.currentBalance == 0 ? "" : "\(formatUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
(stats.balances.currentBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
.ton
)
@ -855,9 +856,9 @@ class StatsOverviewItemNode: ListViewItemNode {
item.context,
params.width,
item.presentationData,
formatBalanceText(stats.balances.overallRevenue, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
formatTonAmountText(stats.balances.overallRevenue, decimalSeparator: item.presentationData.dateTimeFormat.decimalSeparator),
item.presentationData.strings.Monetization_Overview_Total,
(stats.balances.overallRevenue == 0 ? "" : "\(formatUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
(stats.balances.overallRevenue == 0 ? "" : "\(formatTonUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
.ton
)
@ -872,7 +873,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(stats.balances.availableBalance), item.presentationData.dateTimeFormat.groupingSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Available,
(stats.balances.availableBalance == 0 ? "" : "\(formatUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
(stats.balances.availableBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.availableBalance, rate: stats.usdRate))", .generic),
.stars
)
@ -882,7 +883,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(stats.balances.currentBalance), item.presentationData.dateTimeFormat.groupingSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Current,
(stats.balances.currentBalance == 0 ? "" : "\(formatUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
(stats.balances.currentBalance == 0 ? "" : "\(formatTonUsdValue(stats.balances.currentBalance, rate: stats.usdRate))", .generic),
.stars
)
@ -892,7 +893,7 @@ class StatsOverviewItemNode: ListViewItemNode {
item.presentationData,
presentationStringsFormattedNumber(Int32(stats.balances.overallRevenue), item.presentationData.dateTimeFormat.groupingSeparator),
item.presentationData.strings.Monetization_StarsProceeds_Total,
(stats.balances.overallRevenue == 0 ? "" : "\(formatUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
(stats.balances.overallRevenue == 0 ? "" : "\(formatTonUsdValue(stats.balances.overallRevenue, rate: stats.usdRate))", .generic),
.stars
)

View File

@ -139,7 +139,7 @@ private final class SheetContent: CombinedComponent {
switch component.transaction {
case let .proceeds(amount, fromDate, toDate):
labelColor = theme.list.itemDisclosureActions.constructive.fillColor
amountString = amountAttributedString(formatBalanceText(amount, decimalSeparator: dateTimeFormat.decimalSeparator, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
amountString = tonAmountAttributedString(formatTonAmountText(amount, decimalSeparator: dateTimeFormat.decimalSeparator, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).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
@ -147,7 +147,7 @@ private final class SheetContent: CombinedComponent {
showPeer = true
case let .withdrawal(status, amount, date, provider, _, transactionUrl):
labelColor = theme.list.itemDestructiveColor
amountString = amountAttributedString(formatBalanceText(amount, decimalSeparator: dateTimeFormat.groupingSeparator), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
amountString = tonAmountAttributedString(formatTonAmountText(amount, decimalSeparator: dateTimeFormat.groupingSeparator), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
dateString = stringForFullDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat)
switch status {
@ -166,7 +166,7 @@ private final class SheetContent: CombinedComponent {
case let .refund(amount, date, _):
labelColor = theme.list.itemDisclosureActions.constructive.fillColor
titleString = strings.Monetization_TransactionInfo_Refund
amountString = amountAttributedString(formatBalanceText(amount, decimalSeparator: dateTimeFormat.decimalSeparator, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
amountString = tonAmountAttributedString(formatTonAmountText(amount, decimalSeparator: dateTimeFormat.decimalSeparator, showPlus: true), integralFont: integralFont, fractionalFont: fractionalFont, color: labelColor).mutableCopy() as! NSMutableAttributedString
dateString = stringForFullDate(timestamp: date, strings: strings, dateTimeFormat: dateTimeFormat)
buttonTitle = strings.Common_OK
explorerUrl = nil

View File

@ -1044,8 +1044,6 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
attributedString = mutableString
case .unknown:
attributedString = nil
case .paymentRefunded, .giftStars:
attributedString = nil
}
break

View File

@ -3,19 +3,19 @@ import UIKit
let walletAddressLength: Int = 48
func formatAddress(_ address: String) -> String {
public func formatTonAddress(_ address: String) -> String {
var address = address
address.insert("\n", at: address.index(address.startIndex, offsetBy: address.count / 2))
return address
}
func formatUsdValue(_ value: Int64, divide: Bool = true, rate: Double) -> String {
public func formatTonUsdValue(_ value: Int64, divide: Bool = true, rate: Double) -> String {
let normalizedValue: Double = divide ? Double(value) / 1000000000 : Double(value)
let formattedValue = String(format: "%0.2f", normalizedValue * rate)
return "$\(formattedValue)"
}
func formatBalanceText(_ value: Int64, decimalSeparator: String, showPlus: Bool = false) -> String {
public func formatTonAmountText(_ value: Int64, decimalSeparator: String, showPlus: Bool = false) -> String {
var balanceText = "\(abs(value))"
while balanceText.count < 10 {
balanceText.insert("0", at: balanceText.startIndex)
@ -48,7 +48,7 @@ func formatBalanceText(_ value: Int64, decimalSeparator: String, showPlus: Bool
}
private let invalidAddressCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=").inverted
func isValidAddress(_ address: String, exactLength: Bool = false) -> Bool {
public func isValidTonAddress(_ address: String, exactLength: Bool = false) -> Bool {
if address.count > walletAddressLength || address.rangeOfCharacter(from: invalidAddressCharacters) != nil {
return false
}
@ -59,7 +59,7 @@ func isValidAddress(_ address: String, exactLength: Bool = false) -> Bool {
}
private let amountDelimeterCharacters = CharacterSet(charactersIn: "0123456789-+").inverted
func amountAttributedString(_ string: String, integralFont: UIFont, fractionalFont: UIFont, color: UIColor) -> NSAttributedString {
public func tonAmountAttributedString(_ string: String, integralFont: UIFont, fractionalFont: UIFont, color: UIColor) -> NSAttributedString {
let result = NSMutableAttributedString()
if let range = string.rangeOfCharacter(from: amountDelimeterCharacters) {
let integralPart = String(string[..<range.lowerBound])
@ -71,3 +71,4 @@ func amountAttributedString(_ string: String, integralFont: UIFont, fractionalFo
}
return result
}

View File

@ -1689,7 +1689,7 @@ private func infoItems(data: PeerInfoScreenData?, context: AccountContext, prese
if overallRevenueBalance > 0 || overallStarsBalance > 0 {
var string = ""
if overallRevenueBalance > 0 {
string.append("#\(revenueBalance)")
string.append("#\(formatTonAmountText(revenueBalance, decimalSeparator: presentationData.dateTimeFormat.decimalSeparator))")
}
if overallStarsBalance > 0 {
if !string.isEmpty {

View File

@ -288,7 +288,7 @@ public final class StarsImageComponent: Component {
return false
}
case let .gift(lhsCount):
if case let .gift = rhs(rhsCount) {
if case let .gift(rhsCount) = rhs, lhsCount == rhsCount {
return true
} else {
return false

View File

@ -362,7 +362,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
let imageSubject: StarsImageComponent.Subject
if isGift {
imageSubject = .gift
imageSubject = .gift(count)
} else if !media.isEmpty {
imageSubject = .media(media)
} else if let photo {

View File

@ -168,7 +168,7 @@ final class StarsBalanceComponent: Component {
let subtitleText: String
if let rate = component.rate {
subtitleText = "\(formatUsdValue(component.count, rate: rate))"
subtitleText = "\(formatStarsUsdValue(component.count, rate: rate))"
} else {
subtitleText = component.strings.Stars_Intro_YourBalance
}

View File

@ -80,7 +80,7 @@ final class StarsOverviewItemComponent: Component {
}
let valueString = presentationStringsFormattedNumber(Int32(component.value), component.dateTimeFormat.groupingSeparator)
let usdValueString = formatUsdValue(component.value, rate: component.rate)
let usdValueString = formatStarsUsdValue(component.value, rate: component.rate)
let valueSize = self.value.update(
transition: .immediate,

View File

@ -1,6 +1,6 @@
import Foundation
func formatUsdValue(_ value: Int64, rate: Double) -> String {
func formatStarsUsdValue(_ value: Int64, rate: Double) -> String {
let formattedValue = String(format: "%0.2f", (Double(value)) * rate)
return "$\(formattedValue)"
}