Merge commit 'df3eab0a744ca9469cd88d0cd79b150d98132f96'

This commit is contained in:
Isaac 2025-06-28 23:42:22 +02:00
commit dee385f501
3 changed files with 41 additions and 16 deletions

View File

@ -232,6 +232,10 @@ final class ComposePollScreenComponent: Component {
}
private func item(at point: CGPoint) -> (AnyHashable, ComponentView<Empty>)? {
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)

View File

@ -180,6 +180,10 @@ final class ComposeTodoScreenComponent: Component {
}
private func item(at point: CGPoint) -> (AnyHashable, ComponentView<Empty>)? {
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
}

View File

@ -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()
})))
}
}