From 84daba87cdfcda21c2bd47cd77acd040e722576a Mon Sep 17 00:00:00 2001 From: CMK Date: Wed, 21 Jul 2021 19:47:20 +0800 Subject: [PATCH] fix: emoji input for poll set wrong offset issue --- .../CustomEmojiPickerInputViewModel.swift | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/Mastodon/Scene/Compose/View/CustomEmojiPickerInputViewModel.swift b/Mastodon/Scene/Compose/View/CustomEmojiPickerInputViewModel.swift index 760203a3..d421759b 100644 --- a/Mastodon/Scene/Compose/View/CustomEmojiPickerInputViewModel.swift +++ b/Mastodon/Scene/Compose/View/CustomEmojiPickerInputViewModel.swift @@ -7,6 +7,7 @@ import UIKit import Combine +import MetaTextView final class CustomEmojiPickerInputViewModel { @@ -48,19 +49,26 @@ extension CustomEmojiPickerInputViewModel { for reference in customEmojiReplaceableTextInputReferences { guard let textInput = reference.value else { continue } guard textInput.isFirstResponder == true else { continue } + guard let selectedTextRange = textInput.selectedTextRange else { continue } - let selectedTextRange = textInput.selectedTextRange textInput.insertText(text) // due to insert text render as attachment // the cursor reset logic not works // hack with hard code +2 offset assert(text.hasSuffix(": ")) - if text.hasPrefix(":") && text.hasSuffix(": "), - let selectedTextRange = selectedTextRange, - let newPosition = textInput.position(from: selectedTextRange.start, offset: 2) { - let newSelectedTextRange = textInput.textRange(from: newPosition, to: newPosition) - textInput.selectedTextRange = newSelectedTextRange + guard text.hasPrefix(":") && text.hasSuffix(": ") else { continue } + + if let _ = textInput as? MetaTextView { + if let newPosition = textInput.position(from: selectedTextRange.start, offset: 2) { + let newSelectedTextRange = textInput.textRange(from: newPosition, to: newPosition) + textInput.selectedTextRange = newSelectedTextRange + } + } else { + if let newPosition = textInput.position(from: selectedTextRange.start, offset: text.length) { + let newSelectedTextRange = textInput.textRange(from: newPosition, to: newPosition) + textInput.selectedTextRange = newSelectedTextRange + } } return reference