From 831307a61934599a08d22a51d4faa3bbf5aa1f0e Mon Sep 17 00:00:00 2001 From: Paul Von Schrottky Date: Mon, 31 May 2021 19:36:33 -0400 Subject: [PATCH 1/3] Dismiss suggestions UI on space keystroke Users expect the suggestions UI to be dismissed when typing a space immediately after a trigger character (e.g. `@` for mentions, `+` for cross-posts). Addresses https://github.com/WordPress/gutenberg/issues/24425 (for iOS) --- .../ViewRelated/Suggestions/SuggestionsTableView.m | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m b/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m index 44f814cb2ad2..8580b3ffc632 100644 --- a/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m +++ b/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m @@ -246,8 +246,15 @@ - (BOOL)showSuggestionsForWord:(NSString *)word self.searchText = word; if (self.searchText.length > 1) { NSString *searchQuery = [word substringFromIndex:1]; - NSPredicate *predicate = [self predicateFor: searchQuery]; - self.searchResults = [[self.suggestions filteredArrayUsingPredicate:predicate] mutableCopy]; + + // Users type a space after a trigger character to dismiss the suggestions UI + if ([searchQuery isEqualToString:@" "]) { + self.searchText = @""; + [self.searchResults removeAllObjects]; + } else { + NSPredicate *predicate = [self predicateFor: searchQuery]; + self.searchResults = [[self.suggestions filteredArrayUsingPredicate:predicate] mutableCopy]; + } } else { self.searchResults = [self.suggestions mutableCopy]; } From 238067697e62e630df87a649292c2c20a76f5299 Mon Sep 17 00:00:00 2001 From: Paul Von Schrottky Date: Mon, 31 May 2021 21:45:35 -0400 Subject: [PATCH 2/3] Fixed suggestion dismissal for Gutenberg --- .../GutenbergSuggestionsViewController.swift | 7 +++++++ .../ViewRelated/Suggestions/SuggestionsTableView.m | 11 ++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift index 8dd6caa8bde2..31a9223fae1f 100644 --- a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift +++ b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift @@ -114,6 +114,13 @@ extension GutenbergSuggestionsViewController: UITextFieldDelegate { return true } let searchWord = nsString.replacingCharacters(in: range, with: string) + + let dismissSequence = suggestionType.trigger + " " + guard searchWord != dismissSequence else { + onCompletion?(.success("")) + return true + } + if searchWord.hasPrefix(suggestionType.trigger) { suggestionsView.showSuggestions(forWord: searchWord) } else { diff --git a/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m b/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m index 8580b3ffc632..44f814cb2ad2 100644 --- a/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m +++ b/WordPress/Classes/ViewRelated/Suggestions/SuggestionsTableView.m @@ -246,15 +246,8 @@ - (BOOL)showSuggestionsForWord:(NSString *)word self.searchText = word; if (self.searchText.length > 1) { NSString *searchQuery = [word substringFromIndex:1]; - - // Users type a space after a trigger character to dismiss the suggestions UI - if ([searchQuery isEqualToString:@" "]) { - self.searchText = @""; - [self.searchResults removeAllObjects]; - } else { - NSPredicate *predicate = [self predicateFor: searchQuery]; - self.searchResults = [[self.suggestions filteredArrayUsingPredicate:predicate] mutableCopy]; - } + NSPredicate *predicate = [self predicateFor: searchQuery]; + self.searchResults = [[self.suggestions filteredArrayUsingPredicate:predicate] mutableCopy]; } else { self.searchResults = [self.suggestions mutableCopy]; } From 8f511be4520ff52aa8c5f1c690838a379265d7f5 Mon Sep 17 00:00:00 2001 From: Paul Von Schrottky Date: Thu, 3 Jun 2021 10:25:38 -0400 Subject: [PATCH 3/3] Add comment to suggestion space dismiss code --- .../Gutenberg/GutenbergSuggestionsViewController.swift | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift index 31a9223fae1f..596a1f74bf8d 100644 --- a/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift +++ b/WordPress/Classes/ViewRelated/Gutenberg/GutenbergSuggestionsViewController.swift @@ -115,6 +115,16 @@ extension GutenbergSuggestionsViewController: UITextFieldDelegate { } let searchWord = nsString.replacingCharacters(in: range, with: string) + // This feels a bit hacky, so I'll explain what's being done here: + // 1. If the user types "@ ", the so-called "dismiss sequence", + // the user probably typed the space to dismiss the suggestions UI. + // 2. So when this happens, we call the success handler and + // pass in an empty string. + // We pass in an empty string because on the RN side here, the success + // handler inserts the @, followed by the username, followed by a space. + // Since we're essentially passing in an empty username, the result is + // that a "@ " is inserted into the post, which is the desired result. + // The same applies for cross-posts, with "+ " instead of "@ ". let dismissSequence = suggestionType.trigger + " " guard searchWord != dismissSequence else { onCompletion?(.success(""))