Various fixes

This commit is contained in:
Ilya Laktyushin
2025-03-01 19:38:31 +04:00
parent 3f8152d0b1
commit e351bbfd42
13 changed files with 207 additions and 110 deletions

View File

@@ -22,6 +22,7 @@ import ListSectionComponent
import ListItemComponentAdaptor
import TelegramStringFormatting
import UndoUI
import ChatMessagePaymentAlertController
private final class SheetContent: CombinedComponent {
typealias EnvironmentType = ViewControllerComponentContainer.Environment
@@ -410,45 +411,100 @@ public final class WebAppMessagePreviewScreen: ViewControllerComponentContainer
fatalError("init(coder:) has not been implemented")
}
fileprivate func complete(peers: [EnginePeer]) {
for peer in peers {
let _ = self.context.engine.messages.enqueueOutgoingMessage(
to: peer.id,
replyTo: nil,
storyId: nil,
content: .preparedInlineMessage(self.preparedMessage)
).start()
}
private func presentPaidMessageAlertIfNeeded(peers: [EnginePeer], requiresStars: [EnginePeer.Id: Int64], completion: @escaping () -> Void) {
let text: String
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
if peers.count == 1, let peer = peers.first {
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_Chat_One(peerName).string
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
let firstPeerName = firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
let secondPeerName = secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_TwoChats_One(firstPeerName, secondPeerName).string
} else if let peer = peers.first {
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_ManyChats_One(peerName, "\(peers.count - 1)").string
} else {
text = ""
}
if let navigationController = self.navigationController as? NavigationController {
Queue.mainQueue().after(1.0) {
guard let lastController = navigationController.viewControllers.last as? ViewController else {
}
fileprivate func complete(peers: [EnginePeer], controller: ViewController?) {
let _ = (self.context.engine.data.get(
EngineDataMap(
peers.map { TelegramEngine.EngineData.Item.Peer.SendPaidMessageStars.init(id: $0.id) }
)
)
|> deliverOnMainQueue).start(next: { [weak self] sendPaidMessageStars in
guard let self else {
return
}
var totalAmount: StarsAmount = .zero
var chargingPeers: [EnginePeer] = []
for peer in peers {
if let maybeAmount = sendPaidMessageStars[peer.id], let amount = maybeAmount {
totalAmount = totalAmount + amount
chargingPeers.append(peer)
}
}
let presentationData = self.context.sharedContext.currentPresentationData.with { $0 }
let proceed = { [weak self] in
guard let self else {
return
}
lastController.present(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: false, text: text), elevatedLayout: false, position: .top, animateInAsReplacement: true, action: { action in
return false
}), in: .window(.root))
for peer in peers {
var starsAmount: StarsAmount?
if let maybeAmount = sendPaidMessageStars[peer.id], let amount = maybeAmount {
starsAmount = amount
}
let _ = self.context.engine.messages.enqueueOutgoingMessage(
to: peer.id,
replyTo: nil,
storyId: nil,
content: .preparedInlineMessage(self.preparedMessage),
sendPaidMessageStars: starsAmount
).start()
}
let text: String
if peers.count == 1, let peer = peers.first {
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_Chat_One(peerName).string
} else if peers.count == 2, let firstPeer = peers.first, let secondPeer = peers.last {
let firstPeerName = firstPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
let secondPeerName = secondPeer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_TwoChats_One(firstPeerName, secondPeerName).string
} else if let peer = peers.first {
let peerName = peer.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder)
text = presentationData.strings.Conversation_ForwardTooltip_ManyChats_One(peerName, "\(peers.count - 1)").string
} else {
text = ""
}
if let navigationController = self.navigationController as? NavigationController {
Queue.mainQueue().after(1.0) {
guard let lastController = navigationController.viewControllers.last as? ViewController else {
return
}
lastController.present(UndoOverlayController(presentationData: presentationData, content: .forward(savedMessages: false, text: text), elevatedLayout: false, position: .top, animateInAsReplacement: true, action: { action in
return false
}), in: .window(.root))
}
}
self.completeWithResult(true)
self.dismiss()
controller?.dismiss()
}
}
self.completeWithResult(true)
self.dismiss()
if totalAmount.value > 0 {
let controller = chatMessagePaymentAlertController(
context: nil,
presentationData: presentationData,
updatedPresentationData: nil,
peers: chargingPeers,
count: 1,
amount: totalAmount,
totalAmount: totalAmount,
hasCheck: false,
navigationController: self.navigationController as? NavigationController,
completion: { _ in
proceed()
}
)
self.present(controller, in: .window(.root))
} else {
proceed()
}
})
}
private var completed = false
@@ -468,8 +524,7 @@ public final class WebAppMessagePreviewScreen: ViewControllerComponentContainer
guard let self else {
return
}
self.complete(peers: peers)
controller?.dismiss()
self.complete(peers: peers, controller: controller)
}
self.push(controller)