From eed0f5cee6feae37275d9e85f898979fe8b567ff Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 15 Mar 2023 14:26:00 +0400 Subject: [PATCH] Use participants names for group title placeholder --- .../Telegram-iOS/en.lproj/Localizable.strings | 8 +++ .../Sources/CreatePollOptionItem.swift | 4 ++ .../Sources/CreatePollTextInputItem.swift | 4 ++ .../Sources/ItemListAvatarAndNameItem.swift | 4 ++ .../ItemListUI/Sources/ItemListItem.swift | 1 + .../Items/ItemListMultilineInputItem.swift | 4 ++ .../Items/ItemListSingleLineInputItem.swift | 4 ++ .../Sources/UserInfoEditingPhoneItem.swift | 4 ++ .../Sources/CreateGroupController.swift | 53 +++++++++++++++++++ 9 files changed, 86 insertions(+) diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 178835ee82..39413c8dc6 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -9073,3 +9073,11 @@ Sorry for the inconvenience."; "DataUsage.Reset" = "Reset Statistics"; "Conversation.SendWhenOnlineTooltip" = "Long tap to send the message later."; + +"Bot.Active" = "bot is active now"; +"Bot.Inactive" = "bot is not active"; +"Bot.Slow" = "bot replies slowly"; +"Bot.TapToUse" = "Tap here to use this bot"; + +"CreateGroup.PeersTitleDelimeter" = ", "; +"CreateGroup.PeersTitleLastDelimeter" = " and "; diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index 4b7366ab5f..40ec5723d8 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -507,6 +507,10 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, self.textNode.becomeFirstResponder() } + func selectAll() { + self.textNode.textView.selectAll(nil) + } + override func isReorderable(at point: CGPoint) -> Bool { if self.reorderControlNode.frame.contains(point), !self.reorderControlNode.isHidden, !self.isDisplayingRevealedOptions { return true diff --git a/submodules/ComposePollUI/Sources/CreatePollTextInputItem.swift b/submodules/ComposePollUI/Sources/CreatePollTextInputItem.swift index b08ccbddb6..fc8bc56aab 100644 --- a/submodules/ComposePollUI/Sources/CreatePollTextInputItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollTextInputItem.swift @@ -617,6 +617,10 @@ public class CreatePollTextInputItemNode: ListViewItemNode, ASEditableTextNodeDe } } + public func selectAll() { + self.textNode.textView.selectAll(nil) + } + public func animateError() { self.textNode.layer.addShakeAnimation() } diff --git a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift index 18f03ec57f..efc5bc8c84 100644 --- a/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift +++ b/submodules/ItemListAvatarAndNameInfoItem/Sources/ItemListAvatarAndNameItem.swift @@ -1118,6 +1118,10 @@ public class ItemListAvatarAndNameInfoItemNode: ListViewItemNode, ItemListItemNo self.inputFirstField?.becomeFirstResponder() } + public func selectAll() { + self.inputFirstField?.selectAll(nil) + } + override public func longTapped() { self.item?.longTapAction?() } diff --git a/submodules/ItemListUI/Sources/ItemListItem.swift b/submodules/ItemListUI/Sources/ItemListItem.swift index 6fc5f3d183..ca0b6987a4 100644 --- a/submodules/ItemListUI/Sources/ItemListItem.swift +++ b/submodules/ItemListUI/Sources/ItemListItem.swift @@ -37,6 +37,7 @@ public protocol ItemListItemNode { public protocol ItemListItemFocusableNode { func focus() + func selectAll() } public enum ItemListInsetWithOtherSection { diff --git a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift index c83ebd5a1c..c776212ada 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift @@ -472,6 +472,10 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod } } + public func selectAll() { + self.textNode.textView.selectAll(nil) + } + public func animateError() { self.textNode.layer.addShakeAnimation() } diff --git a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift index c5a7d1596a..3a6b41e5ec 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListSingleLineInputItem.swift @@ -473,6 +473,10 @@ public class ItemListSingleLineInputItemNode: ListViewItemNode, UITextFieldDeleg } } + public func selectAll() { + self.textNode.textField.selectAll(nil) + } + @objc public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if let item = self.item { let newText = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string) diff --git a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift index 0c27148ed1..1329820447 100644 --- a/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift +++ b/submodules/PeerInfoUI/Sources/UserInfoEditingPhoneItem.swift @@ -347,4 +347,8 @@ class UserInfoEditingPhoneItemNode: ItemListRevealOptionsItemNode, ItemListItemN func focus() { self.phoneNode.numberField?.becomeFirstResponder() } + + func selectAll() { + self.phoneNode.numberField?.textField.selectAll(nil) + } } diff --git a/submodules/TelegramUI/Sources/CreateGroupController.swift b/submodules/TelegramUI/Sources/CreateGroupController.swift index 13cf818851..8d623903fe 100644 --- a/submodules/TelegramUI/Sources/CreateGroupController.swift +++ b/submodules/TelegramUI/Sources/CreateGroupController.swift @@ -553,6 +553,7 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId] var endEditingImpl: (() -> Void)? var ensureItemVisibleImpl: ((CreateGroupEntryTag, Bool) -> Void)? var findAutoremoveReferenceNode: (() -> ItemListDisclosureItemNode?)? + var selectTitleImpl: (() -> Void)? let actionsDisposable = DisposableSet() @@ -564,6 +565,50 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId] let uploadedAvatar = Promise() var uploadedVideoAvatar: (Promise, Double?)? = nil + if initialTitle == nil && peerIds.count > 0 && peerIds.count < 5 { + let _ = (context.engine.data.get( + TelegramEngine.EngineData.Item.Peer.Peer(id: context.account.peerId), + EngineDataList( + peerIds.map(TelegramEngine.EngineData.Item.Peer.Peer.init) + ) + ) + |> deliverOnMainQueue).start(next: { accountPeer, peers in + var allNames: [String] = [] + if case let .user(user) = accountPeer, let firstName = user.firstName, !firstName.isEmpty { + allNames.append(firstName) + } + for peer in peers { + if case let .user(user) = peer, let firstName = user.firstName, !firstName.isEmpty { + allNames.append(firstName) + } + } + + if allNames.count > 1 { + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + var title: String = "" + for i in 0 ..< allNames.count { + if i == 0 { + } else if i < allNames.count - 1 { + title.append(presentationData.strings.CreateGroup_PeersTitleDelimeter) + } else { + title.append(presentationData.strings.CreateGroup_PeersTitleLastDelimeter) + } + title.append(allNames[i]) + } + + updateState { current in + var current = current + current.editingName = .title(title: title, type: .group) + return current + } + + Queue.mainQueue().after(0.3) { + selectTitleImpl?() + } + } + }) + } + let addressPromise = Promise(nil) let venuesPromise = Promise<[TelegramMediaMap]?>(nil) if case let .locatedGroup(latitude, longitude, address) = mode { @@ -1341,6 +1386,14 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId] } } + selectTitleImpl = { [weak controller] in + controller?.forEachItemNode({ itemNode in + if let itemNode = itemNode as? ItemListAvatarAndNameInfoItemNode { + itemNode.selectAll() + } + }) + } + return controller }