Various improvements

This commit is contained in:
Isaac 2025-06-27 17:36:37 +02:00
parent 10c28d982e
commit f79a244bf2
6 changed files with 204 additions and 89 deletions

View File

@ -1259,10 +1259,26 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
messagePeer = EnginePeer(messagePeerValue)
} else if message.id.peerId.namespace == Namespaces.Peer.CloudChannel, let peer = message.peers[message.id.peerId] as? TelegramChannel, peer.isMonoForum {
if let author = message.author, let threadId = message.threadId, let threadPeer = message.peers[PeerId(threadId)], author.id != threadPeer.id {
if case .channel = author {
var isUser = true
if let peer = message.peers[message.id.peerId] as? TelegramChannel {
if peer.isMonoForum, let linkedMonoforumId = peer.linkedMonoforumId, let mainChannel = message.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.hasPermission(.manageDirect) {
isUser = false
}
}
if isUser {
messagePeer = author
} else {
messagePeer = EnginePeer(threadPeer)
isOutgoing = true
}
} else {
isOutgoing = true
messagePeer = EnginePeer(threadPeer)
}
}
}
if isOutgoing, let messagePeer {
let peerName = messagePeer.compactDisplayTitle
@ -1450,12 +1466,51 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
}
}
attributedString = NSAttributedString(string: string, font: titleFont, textColor: primaryTextColor)
case .suggestedPostSuccess:
case let .suggestedPostSuccess(amount):
var isUser = true
var channelName: String = ""
if let peer = message.peers[message.id.peerId] as? TelegramChannel {
channelName = peer.title
if peer.isMonoForum, let linkedMonoforumId = peer.linkedMonoforumId, let mainChannel = message.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.hasPermission(.manageDirect) {
isUser = false
}
}
let _ = isUser
//TODO:localize
attributedString = NSAttributedString(string: "Suggested post was posted", font: titleFont, textColor: primaryTextColor)
case .suggestedPostRefund:
let amountString: String
switch amount.currency {
case .stars:
if amount.amount.value == 1 {
amountString = "1 Star"
} else {
amountString = "\(amount.amount.value) Stars"
}
case .ton:
amountString = "\(formatTonAmountText(amount.amount.value, dateTimeFormat: dateTimeFormat)) TON"
}
attributedString = parseMarkdownIntoAttributedString("**\(channelName)** received **\(amountString)** for publishing this post", attributes: MarkdownAttributes(body: bodyAttributes, bold: boldAttributes, link: bodyAttributes, linkAttribute: { _ in return nil }))
case let .suggestedPostRefund(info):
var isUser = true
var channelName: String = ""
if let peer = message.peers[message.id.peerId] as? TelegramChannel {
channelName = peer.title
if peer.isMonoForum, let linkedMonoforumId = peer.linkedMonoforumId, let mainChannel = message.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.hasPermission(.manageDirect) {
isUser = false
}
}
let _ = channelName
//TODO:localize
attributedString = NSAttributedString(string: "Suggested post was refunded", font: titleFont, textColor: primaryTextColor)
if info.isUserInitiated {
if isUser {
attributedString = NSAttributedString(string: "Suggested post was refunded because you didn't have enough funds", font: titleFont, textColor: primaryTextColor)
} else {
attributedString = NSAttributedString(string: "Suggested post was refunded because the user didn't have enough funds", font: titleFont, textColor: primaryTextColor)
}
} else {
attributedString = NSAttributedString(string: "Suggested post was refunded because the message was deleted", font: titleFont, textColor: primaryTextColor)
}
case let .giftTon(currency, amount, _, _, _):
attributedString = nil
if !forAdditionalServiceMessage {

View File

@ -1408,7 +1408,7 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
layoutSize.height += additionalTopHeight
imageFrame.origin.y += additionalTopHeight
var headersOffset: CGFloat = 0.0
var headersOffset: CGFloat = additionalTopHeight
if let (threadInfoSize, _) = threadInfoApply {
headersOffset += threadInfoSize.height + 10.0
}
@ -1625,7 +1625,7 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
}
}
var headersOffset: CGFloat = 0.0
var headersOffset: CGFloat = additionalTopHeight
if let (threadInfoSize, threadInfoApply) = threadInfoApply {
let threadInfoNode = threadInfoApply(synchronousLoads)
if strongSelf.threadInfoNode == nil {

View File

@ -991,7 +991,7 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
baseShareButtonFrame.origin.x = dateAndStatusFrame.maxX + 8.0
}
var headersOffset: CGFloat = 0.0
var headersOffset: CGFloat = additionalTopHeight
if let (threadInfoSize, _) = threadInfoApply {
headersOffset += threadInfoSize.height + 10.0
}
@ -1149,7 +1149,7 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
}
}
var headersOffset: CGFloat = 0.0
var headersOffset: CGFloat = additionalTopHeight
if let (threadInfoSize, threadInfoApply) = threadInfoApply {
let threadInfoNode = threadInfoApply(synchronousLoads)
if strongSelf.threadInfoNode == nil {

View File

@ -172,6 +172,8 @@ final class ForumSettingsScreenComponent: Component {
if let controller = self.environment?.controller(), let navigationController = controller.navigationController as? NavigationController {
var viewControllers = navigationController.viewControllers
if case .legacyGroup = peer {
} else {
if self.isOn && self.mode == .list {
for i in 0 ..< viewControllers.count {
if let chatController = viewControllers[i] as? ChatController, chatController.chatLocation.peerId == component.peerId {
@ -193,6 +195,7 @@ final class ForumSettingsScreenComponent: Component {
}
}
}
}
if self.isOn {
if case .legacyGroup = peer {
@ -232,6 +235,34 @@ final class ForumSettingsScreenComponent: Component {
}
if let resultPeerId {
self.peerIdPromise.set(resultPeerId)
let _ = component.context.engine.peers.setChannelForumMode(id: resultPeerId, isForum: true, displayForumAsTabs: self.mode == .tabs).startStandalone()
if let controller = self.environment?.controller(), let navigationController = controller.navigationController as? NavigationController {
var viewControllers = navigationController.viewControllers
if self.mode == .list {
for i in 0 ..< viewControllers.count {
if let chatController = viewControllers[i] as? ChatController, chatController.chatLocation.peerId == component.peerId {
let chatListController = component.context.sharedContext.makeChatListController(context: component.context, location: .forum(peerId: resultPeerId), controlsHistoryPreload: false, hideNetworkActivityStatus: false, previewing: false, enableDebugActions: false)
viewControllers[i] = chatListController
}
}
navigationController.setViewControllers(viewControllers, animated: false)
} else {
for i in (0 ..< viewControllers.count).reversed() {
if let chatListController = viewControllers[i] as? ChatListController, chatListController.location == .forum(peerId: component.peerId) {
viewControllers.remove(at: i)
} else if let peerInfoScreen = viewControllers[i] as? PeerInfoScreen, peerInfoScreen.peerId == component.peerId {
viewControllers.remove(at: i)
}
}
navigationController.setViewControllers(viewControllers, animated: false)
if let baseController = navigationController as? TelegramRootControllerInterface, let chatListController = baseController.getChatsController() as? ChatListController {
chatListController.resetForumStackIfOpen()
}
}
}
} else {
self.isOn = false
self.state?.updated(transition: .easeInOut(duration: 0.2))

View File

@ -299,7 +299,23 @@ private final class SheetContent: CombinedComponent {
if let tonBalance = state.tonBalance {
tonBalanceValue = tonBalance
}
if case let .suggestedPost(mode, _, _, _) = component.mode, (state.currency == .ton || tonBalanceValue > StarsAmount.zero) {
if case let .suggestedPost(mode, _, _, _) = component.mode {
var displayCurrencySelector = false
switch mode {
case let .sender(_, isFromAdmin):
if isFromAdmin {
displayCurrencySelector = true
} else {
if state.currency == .ton || tonBalanceValue > StarsAmount.zero {
displayCurrencySelector = true
}
}
case .admin:
displayCurrencySelector = true
}
if displayCurrencySelector {
//TODO:localize
let selectedId: AnyHashable = state.currency == .stars ? AnyHashable(0 as Int) : AnyHashable(1 as Int)
let starsTitle: String
@ -363,6 +379,7 @@ private final class SheetContent: CombinedComponent {
contentSize.height += currencyToggle.size.height + 29.0
}
}
let amountFont = Font.regular(13.0)
let boldAmountFont = Font.semibold(13.0)
@ -506,7 +523,7 @@ private final class SheetContent: CombinedComponent {
accentColor: theme.list.itemAccentColor,
value: state.amount?.value,
minValue: minAmount?.value,
maxValue: state.currency == .ton ? nil : maxAmount?.value,
maxValue: maxAmount?.value,
placeholderText: amountPlaceholder,
labelText: amountLabel,
currency: state.currency,
@ -658,7 +675,7 @@ private final class SheetContent: CombinedComponent {
//TODO:localize
switch mode {
case .sender:
if let amount = state.amount {
if let amount = state.amount, amount != .zero {
let currencySymbol: String
let currencyAmount: String
switch state.currency {
@ -1164,9 +1181,14 @@ private final class AmountFieldStarsFormatter: NSObject, UITextFieldDelegate {
// Convert and combine
if let whole = Int64(wholeSlice),
let frac = Int64(fractionStr) {
let whole = min(whole, Int64.max / scale)
amount = whole * scale + frac
}
} else if let whole = Int64(text) { // string had no dot at all
let whole = min(whole, Int64.max / scale)
amount = whole * scale
}
}
@ -1241,7 +1263,7 @@ private final class AmountFieldStarsFormatter: NSObject, UITextFieldDelegate {
case .stars:
textField.text = "\(self.maxValue)"
case .ton:
textField.text = "\(formatTonAmountText(self.maxValue, dateTimeFormat: self.dateTimeFormat))"
textField.text = "\(formatTonAmountText(self.maxValue, dateTimeFormat: PresentationDateTimeFormat(timeFormat: self.dateTimeFormat.timeFormat, dateFormat: self.dateTimeFormat.dateFormat, dateSeparator: "", dateSuffix: "", requiresFullYear: false, decimalSeparator: ".", groupingSeparator: "")))"
}
self.onTextChanged(text: self.textField.text ?? "")
self.animateError()
@ -1396,13 +1418,13 @@ private final class AmountFieldComponent: Component {
self.textField.textColor = component.textColor
if self.component?.currency != component.currency {
if let value = component.value {
if let value = component.value, value != .zero {
var text = ""
switch component.currency {
case .stars:
text = "\(value)"
case .ton:
text = "\(formatTonAmountText(value, dateTimeFormat: component.dateTimeFormat))"
text = "\(formatTonAmountText(value, dateTimeFormat: PresentationDateTimeFormat(timeFormat: component.dateTimeFormat.timeFormat, dateFormat: component.dateTimeFormat.dateFormat, dateSeparator: "", dateSuffix: "", requiresFullYear: false, decimalSeparator: ".", groupingSeparator: "")))"
}
self.textField.text = text
} else {
@ -1461,7 +1483,7 @@ private final class AmountFieldComponent: Component {
currency: component.currency,
dateTimeFormat: component.dateTimeFormat,
minValue: component.minValue ?? 0,
maxValue: component.maxValue ?? Int64.max,
maxValue: component.maxValue ?? 10000000,
updated: { [weak self] value in
guard let self, let component = self.component else {
return

View File

@ -1523,6 +1523,13 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate, Ch
if case let .media(value) = editMessageState.content {
isEditingMedia = !value.isEmpty
isMediaEnabled = !value.isEmpty
if interfaceState.interfaceState.postSuggestionState != nil {
if value.contains(.file) {
isEditingMedia = false
isMediaEnabled = false
}
}
} else {
isMediaEnabled = true
}