diff --git a/submodules/ComposePollUI/Sources/CreatePollController.swift b/submodules/ComposePollUI/Sources/CreatePollController.swift index 2659b26e3b..af294cccda 100644 --- a/submodules/ComposePollUI/Sources/CreatePollController.swift +++ b/submodules/ComposePollUI/Sources/CreatePollController.swift @@ -148,7 +148,7 @@ private func processPollText(_ text: String) -> String { private final class CreatePollControllerArguments { let updatePollText: (String) -> Void - let updateOptionText: (Int, String) -> Void + let updateOptionText: (Int, String, Bool) -> Void let moveToNextOption: (Int) -> Void let moveToPreviousOption: (Int) -> Void let removeOption: (Int, Bool) -> Void @@ -160,7 +160,7 @@ private final class CreatePollControllerArguments { let displayMultipleChoiceDisabled: () -> Void let updateQuiz: (Bool) -> Void - init(updatePollText: @escaping (String) -> Void, updateOptionText: @escaping (Int, String) -> Void, moveToNextOption: @escaping (Int) -> Void, moveToPreviousOption: @escaping (Int) -> Void, removeOption: @escaping (Int, Bool) -> Void, optionFocused: @escaping (Int, Bool) -> Void, setItemIdWithRevealedOptions: @escaping (Int?, Int?) -> Void, toggleOptionSelected: @escaping (Int) -> Void, updateAnonymous: @escaping (Bool) -> Void, updateMultipleChoice: @escaping (Bool) -> Void, displayMultipleChoiceDisabled: @escaping () -> Void, updateQuiz: @escaping (Bool) -> Void) { + init(updatePollText: @escaping (String) -> Void, updateOptionText: @escaping (Int, String, Bool) -> Void, moveToNextOption: @escaping (Int) -> Void, moveToPreviousOption: @escaping (Int) -> Void, removeOption: @escaping (Int, Bool) -> Void, optionFocused: @escaping (Int, Bool) -> Void, setItemIdWithRevealedOptions: @escaping (Int?, Int?) -> Void, toggleOptionSelected: @escaping (Int) -> Void, updateAnonymous: @escaping (Bool) -> Void, updateMultipleChoice: @escaping (Bool) -> Void, displayMultipleChoiceDisabled: @escaping () -> Void, updateQuiz: @escaping (Bool) -> Void) { self.updatePollText = updatePollText self.updateOptionText = updateOptionText self.moveToNextOption = moveToNextOption @@ -317,8 +317,8 @@ private enum CreatePollEntry: ItemListNodeEntry { case let .option(id, _, placeholder, text, revealed, hasNext, isLast, isSelected): return CreatePollOptionItem(presentationData: presentationData, id: id, placeholder: placeholder, value: text, isSelected: isSelected, maxLength: maxOptionLength, editing: CreatePollOptionItemEditing(editable: true, hasActiveRevealControls: revealed), sectionId: self.section, setItemIdWithRevealedOptions: { id, fromId in arguments.setItemIdWithRevealedOptions(id, fromId) - }, updated: { value in - arguments.updateOptionText(id, value) + }, updated: { value, isFocused in + arguments.updateOptionText(id, value, isFocused) }, next: hasNext ? { arguments.moveToNextOption(id) } : nil, delete: { focused in @@ -456,13 +456,15 @@ public func createPollController(context: AccountContext, peer: Peer, isQuiz: Bo return state } ensureTextVisibleImpl?() - }, updateOptionText: { id, value in + }, updateOptionText: { id, value, isFocused in var ensureVisibleId = id updateState { state in var state = state for i in 0 ..< state.options.count { if state.options[i].item.id == id { - state.focusOptionId = id + if isFocused { + state.focusOptionId = id + } state.options.update(at: i, { option in option.text = value }) @@ -478,7 +480,9 @@ public func createPollController(context: AccountContext, peer: Peer, isQuiz: Bo } return state } - ensureOptionVisibleImpl?(ensureVisibleId) + if isFocused { + ensureOptionVisibleImpl?(ensureVisibleId) + } }, moveToNextOption: { id in var resetFocusOptionId: Int? updateState { state in diff --git a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift index ad5046f164..233208574a 100644 --- a/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift +++ b/submodules/ComposePollUI/Sources/CreatePollOptionItem.swift @@ -23,7 +23,7 @@ class CreatePollOptionItem: ListViewItem, ItemListItem { let editing: CreatePollOptionItemEditing let sectionId: ItemListSectionId let setItemIdWithRevealedOptions: (Int?, Int?) -> Void - let updated: (String) -> Void + let updated: (String, Bool) -> Void let next: (() -> Void)? let delete: (Bool) -> Void let canDelete: Bool @@ -31,7 +31,7 @@ class CreatePollOptionItem: ListViewItem, ItemListItem { let toggleSelected: () -> Void let tag: ItemListItemTag? - init(presentationData: ItemListPresentationData, id: Int, placeholder: String, value: String, isSelected: Bool?, maxLength: Int, editing: CreatePollOptionItemEditing, sectionId: ItemListSectionId, setItemIdWithRevealedOptions: @escaping (Int?, Int?) -> Void, updated: @escaping (String) -> Void, next: (() -> Void)?, delete: @escaping (Bool) -> Void, canDelete: Bool, focused: @escaping (Bool) -> Void, toggleSelected: @escaping () -> Void, tag: ItemListItemTag?) { + init(presentationData: ItemListPresentationData, id: Int, placeholder: String, value: String, isSelected: Bool?, maxLength: Int, editing: CreatePollOptionItemEditing, sectionId: ItemListSectionId, setItemIdWithRevealedOptions: @escaping (Int?, Int?) -> Void, updated: @escaping (String, Bool) -> Void, next: (() -> Void)?, delete: @escaping (Bool) -> Void, canDelete: Bool, focused: @escaping (Bool) -> Void, toggleSelected: @escaping () -> Void, tag: ItemListItemTag?) { self.presentationData = presentationData self.id = id self.placeholder = placeholder @@ -182,7 +182,7 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, } func editableTextNodeDidFinishEditing(_ editableTextNode: ASEditableTextNode) { - self.editableTextNodeDidUpdateText(editableTextNode) + self.internalEditableTextNodeDidUpdateText(editableTextNode, isLosingFocus: true) self.item?.focused(false) } @@ -213,6 +213,10 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, } func editableTextNodeDidUpdateText(_ editableTextNode: ASEditableTextNode) { + self.internalEditableTextNodeDidUpdateText(editableTextNode, isLosingFocus: false) + } + + private func internalEditableTextNodeDidUpdateText(_ editableTextNode: ASEditableTextNode, isLosingFocus: Bool) { if let item = self.item { let text = self.textNode.attributedText ?? NSAttributedString() @@ -226,11 +230,11 @@ class CreatePollOptionItemNode: ItemListRevealOptionsItemNode, ItemListItemNode, if text.string != updatedAttributedText.string { self.textNode.attributedText = updatedAttributedText } - item.updated(updatedText) + item.updated(updatedText, !isLosingFocus && editableTextNode.isFirstResponder()) if hadReturn { if let next = item.next { next() - } else { + } else if !isLosingFocus { editableTextNode.resignFirstResponder() } }