diff --git a/submodules/ComposePollUI/Sources/ComposePollScreen.swift b/submodules/ComposePollUI/Sources/ComposePollScreen.swift index b6efad2c57..556236bc7c 100644 --- a/submodules/ComposePollUI/Sources/ComposePollScreen.swift +++ b/submodules/ComposePollUI/Sources/ComposePollScreen.swift @@ -232,6 +232,10 @@ final class ComposePollScreenComponent: Component { } private func item(at point: CGPoint) -> (AnyHashable, ComponentView)? { + if self.scrollView.isTracking || self.scrollView.isDecelerating { + return nil + } + let localPoint = self.pollOptionsSectionContainer.convert(point, from: self) for (id, itemView) in self.pollOptionsSectionContainer.itemViews { if let view = itemView.contents.view as? ListComposePollOptionComponent.View, !view.isRevealed && !view.currentText.isEmpty { @@ -447,6 +451,10 @@ final class ComposePollScreenComponent: Component { return true } + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + self.endEditing(true) + } + func scrollViewDidScroll(_ scrollView: UIScrollView) { if !self.ignoreScrolling { self.updateScrolling(transition: .immediate) diff --git a/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift b/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift index 5fdd9d9118..cedab877c9 100644 --- a/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift +++ b/submodules/TelegramUI/Components/ComposeTodoScreen/Sources/ComposeTodoScreen.swift @@ -180,6 +180,10 @@ final class ComposeTodoScreenComponent: Component { } private func item(at point: CGPoint) -> (AnyHashable, ComponentView)? { + if self.scrollView.isTracking || self.scrollView.isDecelerating { + return nil + } + let localPoint = self.todoItemsSectionContainer.convert(point, from: self) for (id, itemView) in self.todoItemsSectionContainer.itemViews { if let view = itemView.contents.view as? ListComposePollOptionComponent.View, !view.isRevealed && !view.currentText.isEmpty { @@ -371,6 +375,10 @@ final class ComposeTodoScreenComponent: Component { } } + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { + self.endEditing(true) + } + private func updateScrolling(transition: ComponentTransition) { let navigationAlphaDistance: CGFloat = 16.0 let navigationAlpha: CGFloat = max(0.0, min(1.0, self.scrollView.contentOffset.y / navigationAlphaDistance)) @@ -928,17 +936,24 @@ final class ComposeTodoScreenComponent: Component { if case let .text(text) = data { let lines = text.string.components(separatedBy: "\n") if !lines.isEmpty { + self.endEditing(true) var i = 0 for line in lines { + if line.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + continue + } + let line = String(line.prefix(component.initialData.maxTodoItemLength)) if i < self.todoItems.count { self.todoItems[i].resetText = NSAttributedString(string: line) } else { - let todoItem = ComposeTodoScreenComponent.TodoItem( - id: self.nextTodoItemId - ) - todoItem.resetText = NSAttributedString(string: line) - self.todoItems.append(todoItem) - self.nextTodoItemId += 1 + if self.todoItems.count < component.initialData.maxTodoItemsCount { + let todoItem = ComposeTodoScreenComponent.TodoItem( + id: self.nextTodoItemId + ) + todoItem.resetText = NSAttributedString(string: line) + self.todoItems.append(todoItem) + self.nextTodoItemId += 1 + } } i += 1 } diff --git a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenTodoContextMenu.swift b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenTodoContextMenu.swift index 3fb947b592..4e7950a5f3 100644 --- a/submodules/TelegramUI/Sources/Chat/ChatControllerOpenTodoContextMenu.swift +++ b/submodules/TelegramUI/Sources/Chat/ChatControllerOpenTodoContextMenu.swift @@ -66,14 +66,13 @@ extension ChatControllerImpl { items.append(.separator) if canMark { - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Chat_Todo_ContextMenu_UncheckTask, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Clear"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in - f(.default) - + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Chat_Todo_ContextMenu_UncheckTask, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Clear"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, f in guard let self else { return } if !self.context.isPremium { + f(.default) let controller = UndoOverlayController( presentationData: self.presentationData, content: .premiumPaywall(title: nil, text: self.presentationData.strings.Chat_Todo_PremiumRequired, customUndoText: nil, timeout: nil, linkAction: nil), @@ -89,21 +88,22 @@ extension ChatControllerImpl { } ) self.present(controller, in: .current) + } else { + c?.dismiss(completion: { + let _ = self.context.engine.messages.requestUpdateTodoMessageItems(messageId: message.id, completedIds: [], incompletedIds: [todoItemId]).start() + }) } - - let _ = self.context.engine.messages.requestUpdateTodoMessageItems(messageId: message.id, completedIds: [], incompletedIds: [todoItemId]).start() }))) } } else { if canMark { - items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Chat_Todo_ContextMenu_CheckTask, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Select"), color: theme.contextMenu.primaryColor) }, action: { [weak self] _, f in - f(.default) - + items.append(.action(ContextMenuActionItem(text: self.presentationData.strings.Chat_Todo_ContextMenu_CheckTask, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Select"), color: theme.contextMenu.primaryColor) }, action: { [weak self] c, f in guard let self else { return } if !self.context.isPremium { + f(.default) let controller = UndoOverlayController( presentationData: self.presentationData, content: .premiumPaywall(title: nil, text: self.presentationData.strings.Chat_Todo_PremiumRequired, customUndoText: nil, timeout: nil, linkAction: nil), @@ -119,9 +119,11 @@ extension ChatControllerImpl { } ) self.present(controller, in: .current) + } else { + c?.dismiss(completion: { + let _ = self.context.engine.messages.requestUpdateTodoMessageItems(messageId: message.id, completedIds: [todoItemId], incompletedIds: []).start() + }) } - - let _ = self.context.engine.messages.requestUpdateTodoMessageItems(messageId: message.id, completedIds: [todoItemId], incompletedIds: []).start() }))) } }