Fix compose autocomplete suggestions not displaying

c737354ed3 was overzealous
This commit is contained in:
Shadowfacts 2021-05-01 19:18:00 -04:00
parent 698b045f86
commit 90f17693f1
Signed by untrusted user: shadowfacts
GPG Key ID: 94A5AB95422746E5
2 changed files with 28 additions and 2 deletions

View File

@ -32,7 +32,11 @@ struct ComposeContentWarningTextField: UIViewRepresentable {
} }
func updateUIView(_ uiView: UITextField, context: Context) { func updateUIView(_ uiView: UITextField, context: Context) {
uiView.text = text if context.coordinator.skipSettingTextOnNextUpdate {
context.coordinator.skipSettingTextOnNextUpdate = false
} else {
uiView.text = text
}
} }
func makeCoordinator() -> Coordinator { func makeCoordinator() -> Coordinator {
@ -44,6 +48,8 @@ struct ComposeContentWarningTextField: UIViewRepresentable {
var text: Binding<String>! var text: Binding<String>!
var uiState: ComposeUIState! var uiState: ComposeUIState!
var skipSettingTextOnNextUpdate = false
@objc func didChange(_ textField: UITextField) { @objc func didChange(_ textField: UITextField) {
text.wrappedValue = textField.text ?? "" text.wrappedValue = textField.text ?? ""
} }
@ -57,6 +63,12 @@ struct ComposeContentWarningTextField: UIViewRepresentable {
updateAutocompleteState(textField: textField) updateAutocompleteState(textField: textField)
} }
func textFieldDidChangeSelection(_ textField: UITextField) {
// see MainComposeTextView.Coordinator.textViewDidChangeSelection(_:)
skipSettingTextOnNextUpdate = true
self.updateAutocompleteState(textField: textField)
}
func autocomplete(with string: String) { func autocomplete(with string: String) {
guard let textField = textField, guard let textField = textField,
let text = textField.text, let text = textField.text,

View File

@ -135,7 +135,11 @@ struct MainComposeWrappedTextView: UIViewRepresentable {
} }
func updateUIView(_ uiView: UITextView, context: Context) { func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text if context.coordinator.skipSettingTextOnNextUpdate {
context.coordinator.skipSettingTextOnNextUpdate = false
} else {
uiView.text = text
}
if let visibilityButton = visibilityButton { if let visibilityButton = visibilityButton {
visibilityButton.image = UIImage(systemName: visibility.imageName) visibilityButton.image = UIImage(systemName: visibility.imageName)
@ -199,6 +203,8 @@ struct MainComposeWrappedTextView: UIViewRepresentable {
var uiState: ComposeUIState var uiState: ComposeUIState
var caretScrollPositionAnimator: UIViewPropertyAnimator? var caretScrollPositionAnimator: UIViewPropertyAnimator?
var skipSettingTextOnNextUpdate = false
init(text: Binding<String>, uiState: ComposeUIState, didChange: @escaping (UITextView) -> Void) { init(text: Binding<String>, uiState: ComposeUIState, didChange: @escaping (UITextView) -> Void) {
self.text = text self.text = text
self.didChange = didChange self.didChange = didChange
@ -258,6 +264,14 @@ struct MainComposeWrappedTextView: UIViewRepresentable {
updateAutocompleteState() updateAutocompleteState()
} }
func textViewDidChangeSelection(_ textView: UITextView) {
// Setting the text view's text causes it to move the cursor to the end (though only
// when the text contains an emoji :/), so skip setting the text on the next SwiftUI update
// that's triggered by setting the autocomplete state.
skipSettingTextOnNextUpdate = true
self.updateAutocompleteState()
}
func autocomplete(with string: String) { func autocomplete(with string: String) {
guard let textView = textView, guard let textView = textView,
let text = textView.text, let text = textView.text,