Various improvements

This commit is contained in:
Ilya Laktyushin 2024-08-08 15:34:56 +02:00
parent c400ccda24
commit 194190f4fa
5 changed files with 78 additions and 59 deletions

View File

@ -12682,3 +12682,31 @@ Sorry for the inconvenience.";
"Stars.Subscription.Terms" = "By subscribing you agree to the [Terms of Service]()."; "Stars.Subscription.Terms" = "By subscribing you agree to the [Terms of Service]().";
"Stars.Subscription.Terms_URL" = "https://telegram.org/tos/stars"; "Stars.Subscription.Terms_URL" = "https://telegram.org/tos/stars";
"Stars.Transaction.Reaction.Title" = "Star reaction";
"Stars.Transaction.Reaction.Post" = "Post";
"Stars.Transaction.SubscriptionFee" = "Monthly Subscription Fee";
"Stars.Transaction.Subscription.Title" = "Subscription";
"Stars.Transaction.Subscription.Active" = "If you cancel now, you can still access your subscription until %@";
"Stars.Transaction.Subscription.Cancelled" = "You have cancelled your subscription.";
"Stars.Transaction.Subscription.Renew" = "Renew Subscription";
"Stars.Transaction.Subscription.Cancel" = "Cancel Subscription";
"Stars.Transaction.Subscription.PerMonth" = "%@ / month";
"Stars.Transaction.Subscription.PerMonthUsd" = "appx. %@ per month";
"Stars.Transaction.Subscription.Subscription" = "Subscription";
"Stars.Transaction.Subscription.Subscriber" = "Subscriber";
"Stars.Transaction.Subscription.Status.Expires" = "Expires";
"Stars.Transaction.Subscription.Status.Expired" = "Expired";
"Stars.Transaction.Subscription.Status.Renews" = "Renews";
"Stars.Transaction.Subscription.Status.Subscribed" = "Subscribed";
"Stars.Transaction.Subscription.Cancelled.Title" = "Subscription cancelled";
"Stars.Transaction.Subscription.Cancelled.Text" = "You will still have access to [%1$@]() until %2$@.";
"Stars.Transaction.Subscription.Renewed.Title" = "Subscription renewed";
"Stars.Transaction.Subscription.Renewed.Text" = "You renewed your subscription to [%1$@]().";
"Stars.Intro.Transaction.SubscriptionFee.Title" = "Monthly Subscription Fee";
"Stars.Intro.Transaction.Reaction.Title" = "Star Reaction";

View File

@ -238,9 +238,10 @@ final class StarsTransactionItemNode: ListViewItemNode, ItemListItemNode {
itemTitle = title itemTitle = title
itemSubtitle = peer.displayTitle(strings: item.presentationData.strings, displayOrder: .firstLast) itemSubtitle = peer.displayTitle(strings: item.presentationData.strings, displayOrder: .firstLast)
} else { } else {
if let _ = item.transaction.subscriptionPeriod { if item.transaction.flags.contains(.isReaction) {
//TODO:localize itemSubtitle = item.presentationData.strings.Stars_Intro_Transaction_Reaction_Title
itemSubtitle = "Monthly subscription fee" } else if let _ = item.transaction.subscriptionPeriod {
itemSubtitle = item.presentationData.strings.Stars_Intro_Transaction_SubscriptionFee_Title
} else { } else {
itemSubtitle = nil itemSubtitle = nil
} }

View File

@ -405,6 +405,9 @@ private extension StarsContext.State.Transaction {
if (apiFlags & (1 << 10)) != 0 { if (apiFlags & (1 << 10)) != 0 {
flags.insert(.isGift) flags.insert(.isGift)
} }
if (apiFlags & (1 << 11)) != 0 {
flags.insert(.isReaction)
}
let media = extendedMedia.flatMap({ $0.compactMap { textMediaAndExpirationTimerFromApiMedia($0, PeerId(0)).media } }) ?? [] let media = extendedMedia.flatMap({ $0.compactMap { textMediaAndExpirationTimerFromApiMedia($0, PeerId(0)).media } }) ?? []
let _ = subscriptionPeriod let _ = subscriptionPeriod
@ -450,6 +453,7 @@ public final class StarsContext {
public static let isPending = Flags(rawValue: 1 << 2) public static let isPending = Flags(rawValue: 1 << 2)
public static let isFailed = Flags(rawValue: 1 << 3) public static let isFailed = Flags(rawValue: 1 << 3)
public static let isGift = Flags(rawValue: 1 << 4) public static let isGift = Flags(rawValue: 1 << 4)
public static let isReaction = Flags(rawValue: 1 << 5)
} }
public enum Peer: Equatable { public enum Peer: Equatable {

View File

@ -197,12 +197,12 @@ private final class StarsTransactionSheetContent: CombinedComponent {
let count: Int64 let count: Int64
var countIsGeneric = false var countIsGeneric = false
var countOnTop = false var countOnTop = false
let transactionId: String? var transactionId: String?
let date: Int32 let date: Int32
let via: String? var via: String?
let messageId: EngineMessage.Id? var messageId: EngineMessage.Id?
let toPeer: EnginePeer? var toPeer: EnginePeer?
let transactionPeer: StarsContext.State.Transaction.Peer? var transactionPeer: StarsContext.State.Transaction.Peer?
var media: [AnyMediaReference] = [] var media: [AnyMediaReference] = []
var photo: TelegramMediaWebFile? var photo: TelegramMediaWebFile?
var transactionStatus: (String, UIColor)? = nil var transactionStatus: (String, UIColor)? = nil
@ -211,59 +211,48 @@ private final class StarsTransactionSheetContent: CombinedComponent {
var isSubscriber = false var isSubscriber = false
var isSubscriptionFee = false var isSubscriptionFee = false
var isCancelled = false var isCancelled = false
var isReaction = false
var delayedCloseOnOpenPeer = true var delayedCloseOnOpenPeer = true
switch subject { switch subject {
case let .importer(peer, pricing, importer, usdRate): case let .importer(peer, pricing, importer, usdRate):
let usdValue = formatTonUsdValue(pricing.amount, divide: false, rate: usdRate, dateTimeFormat: environment.dateTimeFormat) let usdValue = formatTonUsdValue(pricing.amount, divide: false, rate: usdRate, dateTimeFormat: environment.dateTimeFormat)
titleText = "Subscription" titleText = strings.Stars_Transaction_Subscription_Title
descriptionText = "appx. \(usdValue) per month" descriptionText = strings.Stars_Transaction_Subscription_PerMonthUsd(usdValue).string
count = pricing.amount count = pricing.amount
countOnTop = true countOnTop = true
transactionId = nil
date = importer.date date = importer.date
via = nil
messageId = nil
toPeer = importer.peer.peer.flatMap(EnginePeer.init) toPeer = importer.peer.peer.flatMap(EnginePeer.init)
transactionPeer = .peer(peer) transactionPeer = .peer(peer)
isSubscriber = true isSubscriber = true
case let .subscription(subscription): case let .subscription(subscription):
titleText = "Subscription" titleText = strings.Stars_Transaction_Subscription_Title
descriptionText = "" descriptionText = ""
count = subscription.pricing.amount count = subscription.pricing.amount
transactionId = nil
date = subscription.untilDate date = subscription.untilDate
via = nil
messageId = nil
toPeer = subscription.peer toPeer = subscription.peer
transactionPeer = .peer(subscription.peer) transactionPeer = .peer(subscription.peer)
isSubscription = true isSubscription = true
if subscription.flags.contains(.isCancelled) { if subscription.flags.contains(.isCancelled) {
statusText = "You have cancelled your subscription" statusText = strings.Stars_Transaction_Subscription_Cancelled
statusIsDestructive = true statusIsDestructive = true
buttonText = "Renew Subscription" buttonText = strings.Stars_Transaction_Subscription_Renew
isCancelled = true isCancelled = true
} else { } else {
statusText = "If you cancel now, you can still access your subscription until \(stringForMediumDate(timestamp: subscription.untilDate, strings: strings, dateTimeFormat: dateTimeFormat, withTime: false))" statusText = strings.Stars_Transaction_Subscription_Active(stringForMediumDate(timestamp: subscription.untilDate, strings: strings, dateTimeFormat: dateTimeFormat, withTime: false)).string
buttonText = "Cancel Subscription" buttonText = strings.Stars_Transaction_Subscription_Cancel
buttonIsDestructive = true buttonIsDestructive = true
} }
case let .transaction(transaction, parentPeer): case let .transaction(transaction, parentPeer):
if let _ = transaction.subscriptionPeriod { if let _ = transaction.subscriptionPeriod {
//TODO:localize titleText = strings.Stars_Transaction_SubscriptionFee
titleText = "Monthly subscription fee"
descriptionText = "" descriptionText = ""
count = transaction.count count = transaction.count
countOnTop = false
transactionId = transaction.id transactionId = transaction.id
via = nil
messageId = nil
date = transaction.date date = transaction.date
if case let .peer(peer) = transaction.peer { if case let .peer(peer) = transaction.peer {
toPeer = peer toPeer = peer
} else {
toPeer = nil
} }
transactionPeer = transaction.peer transactionPeer = transaction.peer
isSubscriptionFee = true isSubscriptionFee = true
@ -273,16 +262,24 @@ private final class StarsTransactionSheetContent: CombinedComponent {
count = transaction.count count = transaction.count
countOnTop = true countOnTop = true
transactionId = transaction.id transactionId = transaction.id
via = nil
messageId = nil
date = transaction.date date = transaction.date
if case let .peer(peer) = transaction.peer { if case let .peer(peer) = transaction.peer {
toPeer = peer toPeer = peer
} else {
toPeer = nil
} }
transactionPeer = transaction.peer transactionPeer = transaction.peer
isGift = true isGift = true
} else if transaction.flags.contains(.isReaction) {
titleText = strings.Stars_Transaction_Reaction_Title
descriptionText = ""
messageId = transaction.paidMessageId
count = transaction.count
transactionId = transaction.id
date = transaction.date
if case let .peer(peer) = transaction.peer {
toPeer = peer
}
transactionPeer = transaction.peer
isReaction = true
} else { } else {
switch transaction.peer { switch transaction.peer {
case let .peer(peer): case let .peer(peer):
@ -291,7 +288,6 @@ private final class StarsTransactionSheetContent: CombinedComponent {
} else { } else {
titleText = transaction.title ?? peer.compactDisplayTitle titleText = transaction.title ?? peer.compactDisplayTitle
} }
via = nil
case .appStore: case .appStore:
titleText = strings.Stars_Transaction_AppleTopUp_Title titleText = strings.Stars_Transaction_AppleTopUp_Title
via = strings.Stars_Transaction_AppleTopUp_Subtitle via = strings.Stars_Transaction_AppleTopUp_Subtitle
@ -314,7 +310,6 @@ private final class StarsTransactionSheetContent: CombinedComponent {
via = strings.Stars_Transaction_TelegramAds_Subtitle via = strings.Stars_Transaction_TelegramAds_Subtitle
case .unsupported: case .unsupported:
titleText = strings.Stars_Transaction_Unsupported_Title titleText = strings.Stars_Transaction_Unsupported_Title
via = nil
} }
if !transaction.media.isEmpty { if !transaction.media.isEmpty {
var description: String = "" var description: String = ""
@ -354,8 +349,6 @@ private final class StarsTransactionSheetContent: CombinedComponent {
date = transaction.date date = transaction.date
if case let .peer(peer) = transaction.peer { if case let .peer(peer) = transaction.peer {
toPeer = peer toPeer = peer
} else {
toPeer = nil
} }
transactionPeer = transaction.peer transactionPeer = transaction.peer
media = transaction.media.map { AnyMediaReference.starsTransaction(transaction: StarsTransactionReference(peerId: parentPeer.id, id: transaction.id, isRefund: transaction.flags.contains(.isRefund)), media: $0) } media = transaction.media.map { AnyMediaReference.starsTransaction(transaction: StarsTransactionReference(peerId: parentPeer.id, id: transaction.id, isRefund: transaction.flags.contains(.isRefund)), media: $0) }
@ -371,16 +364,11 @@ private final class StarsTransactionSheetContent: CombinedComponent {
titleText = receipt.invoiceMedia.title titleText = receipt.invoiceMedia.title
descriptionText = receipt.invoiceMedia.description descriptionText = receipt.invoiceMedia.description
count = (receipt.invoice.prices.first?.amount ?? receipt.invoiceMedia.totalAmount) * -1 count = (receipt.invoice.prices.first?.amount ?? receipt.invoiceMedia.totalAmount) * -1
via = nil
messageId = nil
transactionId = receipt.transactionId transactionId = receipt.transactionId
date = receipt.date date = receipt.date
if let peer = state.peerMap[receipt.botPaymentId] { if let peer = state.peerMap[receipt.botPaymentId] {
toPeer = peer toPeer = peer
} else {
toPeer = nil
} }
transactionPeer = nil
photo = receipt.invoiceMedia.photo photo = receipt.invoiceMedia.photo
delayedCloseOnOpenPeer = false delayedCloseOnOpenPeer = false
case let .gift(message): case let .gift(message):
@ -398,15 +386,12 @@ private final class StarsTransactionSheetContent: CombinedComponent {
} else { } else {
fatalError() fatalError()
} }
via = nil
messageId = nil
date = message.timestamp date = message.timestamp
if message.id.peerId.id._internalGetInt64Value() == 777000 { if message.id.peerId.id._internalGetInt64Value() == 777000 {
toPeer = nil toPeer = nil
} else { } else {
toPeer = state.peerMap[message.id.peerId] toPeer = state.peerMap[message.id.peerId]
} }
transactionPeer = nil
isGift = true isGift = true
delayedCloseOnOpenPeer = false delayedCloseOnOpenPeer = false
} }
@ -427,7 +412,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
let formattedAmount = presentationStringsFormattedNumber(abs(Int32(count)), dateTimeFormat.groupingSeparator) let formattedAmount = presentationStringsFormattedNumber(abs(Int32(count)), dateTimeFormat.groupingSeparator)
let countColor: UIColor let countColor: UIColor
if isSubscription || isSubscriber { if isSubscription || isSubscriber {
amountText = "\(formattedAmount) / month" amountText = strings.Stars_Transaction_Subscription_PerMonth(formattedAmount).string
countColor = theme.list.itemSecondaryTextColor countColor = theme.list.itemSecondaryTextColor
} else if countIsGeneric { } else if countIsGeneric {
amountText = "\(formattedAmount)" amountText = "\(formattedAmount)"
@ -543,9 +528,9 @@ private final class StarsTransactionSheetContent: CombinedComponent {
} else if let toPeer { } else if let toPeer {
let title: String let title: String
if isSubscription { if isSubscription {
title = "Subscription" title = strings.Stars_Transaction_Subscription_Subscription
} else if isSubscriber { } else if isSubscriber {
title = "Subscriber" title = strings.Stars_Transaction_Subscription_Subscriber
} else { } else {
title = count < 0 || countIsGeneric ? strings.Stars_Transaction_To : strings.Stars_Transaction_From title = count < 0 || countIsGeneric ? strings.Stars_Transaction_To : strings.Stars_Transaction_From
} }
@ -604,7 +589,7 @@ private final class StarsTransactionSheetContent: CombinedComponent {
} }
tableItems.append(.init( tableItems.append(.init(
id: "media", id: "media",
title: strings.Stars_Transaction_Media, title: isReaction ? strings.Stars_Transaction_Reaction_Post : strings.Stars_Transaction_Media,
component: AnyComponent( component: AnyComponent(
Button( Button(
content: AnyComponent( content: AnyComponent(
@ -647,15 +632,15 @@ private final class StarsTransactionSheetContent: CombinedComponent {
if isSubscription { if isSubscription {
if isCancelled { if isCancelled {
if date > Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970) { if date > Int32(CFAbsoluteTimeGetCurrent() + kCFAbsoluteTimeIntervalSince1970) {
dateTitle = "Expires" dateTitle = strings.Stars_Transaction_Subscription_Status_Expires
} else { } else {
dateTitle = "Expired" dateTitle = strings.Stars_Transaction_Subscription_Status_Expired
} }
} else { } else {
dateTitle = "Renews" dateTitle = strings.Stars_Transaction_Subscription_Status_Renews
} }
} else if isSubscriber { } else if isSubscriber {
dateTitle = "Subscribed" dateTitle = strings.Stars_Transaction_Subscription_Status_Subscribed
} else { } else {
dateTitle = strings.Stars_Transaction_Date dateTitle = strings.Stars_Transaction_Date
} }
@ -1223,11 +1208,11 @@ public class StarsTransactionScreen: ViewControllerComponentContainer {
let text: String let text: String
switch action { switch action {
case .cancel: case .cancel:
title = "Subscription cancelled" title = presentationData.strings.Stars_Transaction_Subscription_Cancelled_Title
text = "You will still have access top [\(subscription.peer.compactDisplayTitle)]() until \(stringForMediumDate(timestamp: subscription.untilDate, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat))." text = presentationData.strings.Stars_Transaction_Subscription_Cancelled_Text(subscription.peer.compactDisplayTitle, stringForMediumDate(timestamp: subscription.untilDate, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat)).string
case .renew: case .renew:
title = "Subscription renewed" title = presentationData.strings.Stars_Transaction_Subscription_Renewed_Title
text = "You renewed your subscription to [\(subscription.peer.compactDisplayTitle)]()." text = presentationData.strings.Stars_Transaction_Subscription_Renewed_Text(subscription.peer.compactDisplayTitle).string
} }
let controller = UndoOverlayController(presentationData: presentationData, content: .invitedToVoiceChat(context: context, peer: subscription.peer, title: title, text: text, action: nil, duration: 3.0), elevatedLayout: false, position: .bottom, action: { _ in return true }) let controller = UndoOverlayController(presentationData: presentationData, content: .invitedToVoiceChat(context: context, peer: subscription.peer, title: title, text: text, action: nil, duration: 3.0), elevatedLayout: false, position: .bottom, action: { _ in return true })

View File

@ -217,11 +217,12 @@ final class StarsTransactionsListPanelComponent: Component {
itemSubtitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast) itemSubtitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast)
} else { } else {
itemTitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast) itemTitle = peer.displayTitle(strings: environment.strings, displayOrder: .firstLast)
if item.flags.contains(.isGift) { if item.flags.contains(.isReaction) {
itemSubtitle = environment.strings.Stars_Intro_Transaction_Reaction_Title
} else if item.flags.contains(.isGift) {
itemSubtitle = environment.strings.Stars_Intro_Transaction_Gift_Title itemSubtitle = environment.strings.Stars_Intro_Transaction_Gift_Title
} else if let _ = item.subscriptionPeriod { } else if let _ = item.subscriptionPeriod {
//TODO:localize itemSubtitle = environment.strings.Stars_Intro_Transaction_SubscriptionFee_Title
itemSubtitle = "Monthly subscription fee"
} else { } else {
itemSubtitle = nil itemSubtitle = nil
} }