From b33d7888b82c4a1300044a3566ebb37f3a9edfc5 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Wed, 27 Oct 2021 20:18:29 +0400 Subject: [PATCH] Various fixes --- .../Sources/InviteLinkEditController.swift | 43 ++++++++++++++++++- .../Sources/InviteLinkViewController.swift | 8 +++- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift index f66b81e7e9..48242a237e 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkEditController.swift @@ -20,12 +20,14 @@ import UndoUI private final class InviteLinkEditControllerArguments { let context: AccountContext let updateState: ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void + let scrollToUsage: () -> Void let dismissInput: () -> Void let revoke: () -> Void - init(context: AccountContext, updateState: @escaping ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void, dismissInput: @escaping () -> Void, revoke: @escaping () -> Void) { + init(context: AccountContext, updateState: @escaping ((InviteLinkEditControllerState) -> InviteLinkEditControllerState) -> Void, scrollToUsage: @escaping () -> Void, dismissInput: @escaping () -> Void, revoke: @escaping () -> Void) { self.context = context self.updateState = updateState + self.scrollToUsage = scrollToUsage self.dismissInput = dismissInput self.revoke = revoke } @@ -39,6 +41,18 @@ private enum InviteLinksEditSection: Int32 { case revoke } +private enum InviteLinksEditEntryTag: ItemListItemTag { + case usage + + func isEqual(to other: ItemListItemTag) -> Bool { + if let other = other as? InviteLinksEditEntryTag, self == other { + return true + } else { + return false + } + } +} + private let invalidAmountCharacters = CharacterSet(charactersIn: "01234567890.,").inverted func isValidNumberOfUsers(_ number: String) -> Bool { if number.isEmpty { @@ -298,7 +312,7 @@ private enum InviteLinksEditEntry: ItemListNodeEntry { } else { text = focused ? "" : presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsersUnlimited } - return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsers, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, alignment: .right, selectAllOnFocus: true, secondaryStyle: !customValue, tag: nil, sectionId: self.section, textUpdated: { updatedText in + return ItemListSingleLineInputItem(presentationData: presentationData, title: NSAttributedString(string: presentationData.strings.InviteLink_Create_UsersLimitNumberOfUsers, textColor: theme.list.itemPrimaryTextColor), text: text, placeholder: "", type: .number, alignment: .right, selectAllOnFocus: true, secondaryStyle: !customValue, tag: InviteLinksEditEntryTag.usage, sectionId: self.section, textUpdated: { updatedText in arguments.updateState { state in var updatedState = state if updatedText.isEmpty { @@ -318,6 +332,7 @@ private enum InviteLinksEditEntry: ItemListNodeEntry { updatedState.pickingUsageLimit = true return updatedState } + arguments.scrollToUsage() } else { arguments.updateState { state in var updatedState = state @@ -436,9 +451,12 @@ public func inviteLinkEditController(context: AccountContext, updatedPresentatio var dismissImpl: (() -> Void)? var dismissInputImpl: (() -> Void)? + var scrollToUsageImpl: (() -> Void)? let arguments = InviteLinkEditControllerArguments(context: context, updateState: { f in updateState(f) + }, scrollToUsage: { + scrollToUsageImpl?() }, dismissInput: { dismissInputImpl?() }, revoke: { @@ -599,6 +617,27 @@ public func inviteLinkEditController(context: AccountContext, updatedPresentatio controller.present(c, in: .window(.root), with: p) } } + scrollToUsageImpl = { [weak controller] in + controller?.afterLayout({ + guard let controller = controller else { + return + } + + var resultItemNode: ListViewItemNode? + let _ = controller.frameForItemNode({ itemNode in + if let itemNode = itemNode as? ItemListSingleLineInputItemNode { + if let tag = itemNode.tag as? InviteLinksEditEntryTag, tag == .usage { + resultItemNode = itemNode + return true + } + } + return false + }) + if let resultItemNode = resultItemNode { + controller.ensureItemNodeVisible(resultItemNode) + } + }) + } dismissInputImpl = { [weak controller] in controller?.view.endEditing(true) } diff --git a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift index d2e5e47fa8..84441f06c6 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift @@ -375,7 +375,7 @@ public final class InviteLinkViewController: ViewController { private let context: AccountContext private let peerId: EnginePeer.Id - private let invite: ExportedInvitation + private var invite: ExportedInvitation private let importersContext: PeerInvitationImportersContext private let requestsContext: PeerInvitationImportersContext? @@ -823,6 +823,11 @@ public final class InviteLinkViewController: ViewController { self?.controller?.dismiss() } else { invitationsContext?.update(invite) + + if let strongSelf = self, let layout = strongSelf.validLayout { + strongSelf.invite = invite + strongSelf.containerLayoutUpdated(layout, transition: .immediate) + } } } }) @@ -936,7 +941,6 @@ public final class InviteLinkViewController: ViewController { var titleText = self.presentationData.strings.InviteLink_InviteLink - var subtitleText = "" var subtitleColor = self.presentationData.theme.list.itemSecondaryTextColor if self.invite.isRevoked {