From 7d65064f9b6678783e0881df5745dc37ad2c140a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 25 Feb 2026 04:38:32 +0400 Subject: [PATCH] Various improvements --- .../Telegram-iOS/en.lproj/Localizable.strings | 2 +- .../Sources/ItemListAvatarAndNameItem.swift | 2 +- .../Sources/ChannelAdminController.swift | 16 +++++++++++++++- .../Sources/ChannelBannedMemberController.swift | 16 +++++++++++++++- .../Sources/ChatMessageDateHeader.swift | 2 +- .../Sources/RankChatPreviewItem.swift | 7 +++++-- 6 files changed, 38 insertions(+), 7 deletions(-) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index b91bfe9217..1c8d3932c6 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -15910,7 +15910,7 @@ Error: %8$@"; "RankInfo.Owner.Title" = "Owner Tag"; "RankInfo.Owner.Text" = "This purple tag %1$@ is **%2$@'s** owner tag. **%3$@** is the owner of **%4$@**."; "RankInfo.ChangeInfo" = "Only admins can assign member tags in this group."; -"RankInfo.MemberTag" = "Admin Tag"; +"RankInfo.MemberTag" = "Member Tag"; "RankInfo.AdminTag" = "Admin Tag"; "RankInfo.OwnerTag" = "Owner Tag"; "RankInfo.SetMyTag" = "Set My Tag"; diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index 7d415dc328..3c92955fe6 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -194,7 +194,7 @@ public class ItemListAvatarAndNameInfoItem: ListViewItem, ItemListItem, ListItem if case .settings = mode { self.selectable = true } else { - self.selectable = false + self.selectable = action != nil } } diff --git a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift index e1632e50f7..7e8eca0f3f 100644 --- a/submodules/PeerInfoUI/Sources/ChannelAdminController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelAdminController.swift @@ -31,8 +31,9 @@ private final class ChannelAdminControllerArguments { let dismissInput: () -> Void let animateError: () -> Void let toggleIsOptionExpanded: (RightsItem.Sub) -> Void + let openPeer: () -> Void - init(context: AccountContext, updateAdminRights: @escaping (Bool) -> Void, toggleRight: @escaping (RightsItem, TelegramChatAdminRightsFlags, Bool) -> Void, toggleRightWhileDisabled: @escaping (TelegramChatAdminRightsFlags, TelegramChatAdminRightsFlags) -> Void, transferOwnership: @escaping () -> Void, updateRank: @escaping (String, String) -> Void, updateFocusedOnRank: @escaping (Bool) -> Void, dismissAdmin: @escaping () -> Void, dismissInput: @escaping () -> Void, animateError: @escaping () -> Void, toggleIsOptionExpanded: @escaping (RightsItem.Sub) -> Void) { + init(context: AccountContext, updateAdminRights: @escaping (Bool) -> Void, toggleRight: @escaping (RightsItem, TelegramChatAdminRightsFlags, Bool) -> Void, toggleRightWhileDisabled: @escaping (TelegramChatAdminRightsFlags, TelegramChatAdminRightsFlags) -> Void, transferOwnership: @escaping () -> Void, updateRank: @escaping (String, String) -> Void, updateFocusedOnRank: @escaping (Bool) -> Void, dismissAdmin: @escaping () -> Void, dismissInput: @escaping () -> Void, animateError: @escaping () -> Void, toggleIsOptionExpanded: @escaping (RightsItem.Sub) -> Void, openPeer: @escaping () -> Void) { self.context = context self.updateAdminRights = updateAdminRights self.toggleRight = toggleRight @@ -44,6 +45,7 @@ private final class ChannelAdminControllerArguments { self.dismissInput = dismissInput self.animateError = animateError self.toggleIsOptionExpanded = toggleIsOptionExpanded + self.openPeer = openPeer } } @@ -367,6 +369,8 @@ private enum ChannelAdminEntry: ItemListNodeEntry { case let .info(_, _, dateTimeFormat, peer, presence): return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, systemStyle: .glass, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { + }, action: { + arguments.openPeer() }) case let .rankTitle(_, text, count, limit): var accessoryText: ItemListSectionHeaderAccessoryText? @@ -1219,6 +1223,16 @@ public func channelAdminController(context: AccountContext, updatedPresentationD return state } + }, openPeer: { + let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: adminId)) + |> deliverOnMainQueue).start(next: { peer in + guard let peer else { + return + } + if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: updatedPresentationData, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) { + pushControllerImpl?(controller) + } + }) }) let presentationData = updatedPresentationData?.signal ?? context.sharedContext.presentationData diff --git a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift index 2a7f34d471..3c32e26178 100644 --- a/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelBannedMemberController.swift @@ -22,14 +22,16 @@ private final class ChannelBannedMemberControllerArguments { let toggleIsOptionExpanded: (TelegramChatBannedRightsFlags) -> Void let openTimeout: () -> Void let delete: () -> Void + let openPeer: () -> Void - init(context: AccountContext, toggleRight: @escaping (TelegramChatBannedRightsFlags, Bool) -> Void, toggleRightWhileDisabled: @escaping (TelegramChatBannedRightsFlags) -> Void, toggleIsOptionExpanded: @escaping (TelegramChatBannedRightsFlags) -> Void, openTimeout: @escaping () -> Void, delete: @escaping () -> Void) { + init(context: AccountContext, toggleRight: @escaping (TelegramChatBannedRightsFlags, Bool) -> Void, toggleRightWhileDisabled: @escaping (TelegramChatBannedRightsFlags) -> Void, toggleIsOptionExpanded: @escaping (TelegramChatBannedRightsFlags) -> Void, openTimeout: @escaping () -> Void, delete: @escaping () -> Void, openPeer: @escaping () -> Void) { self.context = context self.toggleRight = toggleRight self.toggleRightWhileDisabled = toggleRightWhileDisabled self.toggleIsOptionExpanded = toggleIsOptionExpanded self.openTimeout = openTimeout self.delete = delete + self.openPeer = openPeer } } @@ -218,6 +220,8 @@ private enum ChannelBannedMemberEntry: ItemListNodeEntry { case let .info(_, _, dateTimeFormat, peer, presence): return ItemListAvatarAndNameInfoItem(itemContext: .accountContext(arguments.context), presentationData: presentationData, systemStyle: .glass, dateTimeFormat: dateTimeFormat, mode: .generic, peer: peer, presence: presence, memberCount: nil, state: ItemListAvatarAndNameInfoItemState(), sectionId: self.section, style: .blocks(withTopInset: true, withExtendedBottomInset: false), editingNameUpdated: { _ in }, avatarTapped: { + }, action: { + arguments.openPeer() }) case let .rightsHeader(_, text): return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section) @@ -609,6 +613,16 @@ public func channelBannedMemberController(context: AccountContext, updatedPresen }) ])]) presentControllerImpl?(actionSheet, nil) + }, openPeer: { + let _ = (context.engine.data.get(TelegramEngine.EngineData.Item.Peer.Peer(id: memberId)) + |> deliverOnMainQueue).start(next: { peer in + guard let peer else { + return + } + if let controller = context.sharedContext.makePeerInfoController(context: context, updatedPresentationData: updatedPresentationData, peer: peer._asPeer(), mode: .generic, avatarInitiallyExpanded: false, fromChat: false, requestsContext: nil) { + pushControllerImpl?(controller) + } + }) }) var peerDataItems: [TelegramEngine.EngineData.Item.Peer.Peer] = [] diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageItemImpl/Sources/ChatMessageDateHeader.swift b/submodules/TelegramUI/Components/Chat/ChatMessageItemImpl/Sources/ChatMessageDateHeader.swift index f0babf06cc..42b4a3638f 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageItemImpl/Sources/ChatMessageDateHeader.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageItemImpl/Sources/ChatMessageDateHeader.swift @@ -1054,7 +1054,7 @@ public final class ChatMessageAvatarHeaderNodeImpl: ListViewItemHeaderNode, Chat } public func updatePeer(peer: Peer) { - if let previousPeer = self.peer, previousPeer.nameColor != peer.nameColor || previousPeer.smallProfileImage != peer.smallProfileImage { + if let previousPeer = self.peer, previousPeer.nameColor != peer.nameColor || previousPeer.smallProfileImage != peer.smallProfileImage || previousPeer.displayLetters != peer.displayLetters { self.peer = peer if peer.smallProfileImage != nil { self.avatarNode.setPeerV2(context: self.context, theme: self.presentationData.theme.theme, peer: EnginePeer(peer), authorOfMessage: self.messageReference, overrideImage: nil, emptyColor: .black, synchronousLoad: false, displayDimensions: CGSize(width: avatarHeaderSize(), height: avatarHeaderSize())) diff --git a/submodules/TelegramUI/Components/RankChatPreviewItem/Sources/RankChatPreviewItem.swift b/submodules/TelegramUI/Components/RankChatPreviewItem/Sources/RankChatPreviewItem.swift index ee66c5d33b..4f917066be 100644 --- a/submodules/TelegramUI/Components/RankChatPreviewItem/Sources/RankChatPreviewItem.swift +++ b/submodules/TelegramUI/Components/RankChatPreviewItem/Sources/RankChatPreviewItem.swift @@ -232,11 +232,14 @@ final class RankChatPreviewItemNode: ListViewItemNode { var items: [ListViewItem] = [] for messageItem in item.messageItems.reversed() { - let authorPeerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(0)) + var userPeer = messageItem.peer._asPeer() + + let updatedId = PeerId.Id._internalFromInt64Value(userPeer.id.id._internalGetInt64Value() - 7) + let authorPeerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: updatedId) let groupPeerId = PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(0)) let groupPeer = TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, title: "", username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil, usernames: [], storiesHidden: nil, nameColor: nil, backgroundEmojiId: nil, profileColor: nil, profileBackgroundEmojiId: nil, emojiStatus: nil, approximateBoostLevel: nil, subscriptionUntilDate: nil, verificationIconFileId: nil, sendPaidMessageStars: nil, linkedMonoforumId: nil) - var userPeer = messageItem.peer._asPeer() + if let user = userPeer as? TelegramUser { userPeer = TelegramUser(id: authorPeerId, accessHash: user.accessHash, firstName: user.firstName, lastName: user.lastName, username: "", phone: user.phone, photo: user.photo, botInfo: user.botInfo, restrictionInfo: user.restrictionInfo, flags: user.flags, emojiStatus: user.emojiStatus, usernames: user.usernames, storiesHidden: user.storiesHidden, nameColor: user.nameColor, backgroundEmojiId: user.backgroundEmojiId, profileColor: user.profileColor, profileBackgroundEmojiId: user.profileBackgroundEmojiId, subscriberCount: user.subscriberCount, verificationIconFileId: user.verificationIconFileId) }