From dd20006e40bc9aa72bac52c14c83c5380474a3f4 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 6 Jun 2022 16:57:25 +0400 Subject: [PATCH] Various fixes --- .../Items/ItemListMultilineInputItem.swift | 11 ++++++++++ .../TelegramUI/Sources/AccountContext.swift | 9 ++++++++- .../Sources/PeerInfo/PeerInfoScreen.swift | 20 ++++++++++++++++++- .../PeerInfoScreenMultilineInputtem.swift | 6 +++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift index d1cea4832c..138f9d20fd 100644 --- a/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift +++ b/submodules/ItemListUI/Sources/Items/ItemListMultilineInputItem.swift @@ -127,6 +127,8 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod return self.item?.tag } + private var exceededLimit = false + public init() { self.backgroundNode = ASDisplayNode() self.backgroundNode.isLayerBacked = true @@ -197,6 +199,7 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod var limitTextString: NSAttributedString? var rightInset: CGFloat = params.rightInset + var exceededLimit = false if let maxLength = item.maxLength, maxLength.display { let textLength: Int switch maxLength.mode { @@ -210,6 +213,7 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod if displayTextLimit { limitTextString = NSAttributedString(string: "\(remainingCount)", font: Font.regular(13.0), textColor: remainingCount < 0 ? item.presentationData.theme.list.itemDestructiveColor : item.presentationData.theme.list.itemSecondaryTextColor) } + exceededLimit = remainingCount < 0 rightInset += 30.0 + 4.0 } @@ -254,6 +258,7 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod if let strongSelf = self { strongSelf.item = item strongSelf.layoutParams = params + strongSelf.exceededLimit = exceededLimit if let _ = updatedTheme { strongSelf.topStripeNode.backgroundColor = itemSeparatorColor @@ -470,6 +475,12 @@ public class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNod self.textNode.layer.addShakeAnimation() } + public func animateErrorIfNeeded() { + if self.exceededLimit { + self.animateError() + } + } + @objc private func inlineActionPressed() { if let action = self.item?.inlineAction?.action { action() diff --git a/submodules/TelegramUI/Sources/AccountContext.swift b/submodules/TelegramUI/Sources/AccountContext.swift index c9dc7f0b23..944d5bcb33 100644 --- a/submodules/TelegramUI/Sources/AccountContext.swift +++ b/submodules/TelegramUI/Sources/AccountContext.swift @@ -286,7 +286,14 @@ public final class AccountContextImpl: AccountContext { strongSelf.animatedEmojiStickers = stickers }) - self.userLimitsConfigurationDisposable = (self.engine.data.subscribe(TelegramEngine.EngineData.Item.Configuration.UserLimits(isPremium: false)) + self.userLimitsConfigurationDisposable = (self.account.postbox.peerView(id: self.account.peerId) + |> mapToSignal { peerView -> Signal in + if let peer = peerView.peers[peerView.peerId] { + return self.engine.data.subscribe(TelegramEngine.EngineData.Item.Configuration.UserLimits(isPremium: peer.isPremium)) + } else { + return .complete() + } + } |> deliverOnMainQueue).start(next: { [weak self] value in guard let strongSelf = self else { return diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index e7cd0e07c8..c028aea13b 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -219,6 +219,14 @@ private final class PeerInfoScreenItemSectionContainerNode: ASDisplayNode { return contentHeight } + + func animateErrorIfNeeded() { + for (_, itemNode) in self.itemNodes { + if let itemNode = itemNode as? PeerInfoScreenMultilineInputItemNode { + itemNode.animateErrorIfNeeded() + } + } + } } final class PeerInfoSelectionPanelNode: ASDisplayNode { @@ -2636,7 +2644,6 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate }) strongSelf.controller?.navigationItem.setLeftBarButton(UIBarButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, style: .plain, target: strongSelf, action: #selector(strongSelf.editingCancelPressed)), animated: true) case .done, .cancel: - (strongSelf.controller?.parent as? TabBarController)?.updateIsTabBarHidden(false, transition: .animated(duration: 0.3, curve: .linear)) strongSelf.view.endEditing(true) if case .done = key { guard let data = strongSelf.data else { @@ -2649,6 +2656,16 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate let lastName = strongSelf.headerNode.editingContentNode.editingTextForKey(.lastName) ?? "" let bio = strongSelf.state.updatingBio + if let bio = bio { + if Int32(bio.count) > strongSelf.context.userLimits.maxAboutLength { + for (_, section) in strongSelf.editingSections { + section.animateErrorIfNeeded() + } + strongSelf.hapticFeedback?.error() + return + } + } + if peer.firstName != firstName || peer.lastName != lastName || (bio != nil && bio != cachedData.about) { var updateNameSignal: Signal = .complete() var hasProgress = false @@ -2889,6 +2906,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate }, completion: nil) strongSelf.controller?.navigationItem.setLeftBarButton(nil, animated: true) } + (strongSelf.controller?.parent as? TabBarController)?.updateIsTabBarHidden(false, transition: .animated(duration: 0.3, curve: .linear)) case .select: strongSelf.state = strongSelf.state.withSelectedMessageIds(Set()) if let (layout, navigationHeight) = strongSelf.validLayout { diff --git a/submodules/TelegramUI/Sources/PeerInfoScreenMultilineInputtem.swift b/submodules/TelegramUI/Sources/PeerInfoScreenMultilineInputtem.swift index 41c7c682c4..8127aa0509 100644 --- a/submodules/TelegramUI/Sources/PeerInfoScreenMultilineInputtem.swift +++ b/submodules/TelegramUI/Sources/PeerInfoScreenMultilineInputtem.swift @@ -29,7 +29,7 @@ final class PeerInfoScreenMultilineInputItem: PeerInfoScreenItem { } } -private final class PeerInfoScreenMultilineInputItemNode: PeerInfoScreenItemNode { +final class PeerInfoScreenMultilineInputItemNode: PeerInfoScreenItemNode { private let bottomSeparatorNode: ASDisplayNode private let maskNode: ASImageNode @@ -118,4 +118,8 @@ private final class PeerInfoScreenMultilineInputItemNode: PeerInfoScreenItemNode return height } + + func animateErrorIfNeeded() { + self.itemNode?.animateErrorIfNeeded() + } }