@@ -8,6 +8,7 @@ import '../api/model/model.dart';
8
8
import '../api/route/channels.dart' ;
9
9
import '../generated/l10n/zulip_localizations.dart' ;
10
10
import '../widgets/compose_box.dart' ;
11
+ import 'algorithms.dart' ;
11
12
import 'compose.dart' ;
12
13
import 'emoji.dart' ;
13
14
import 'narrow.dart' ;
@@ -635,16 +636,18 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
635
636
636
637
@override
637
638
Future <List <MentionAutocompleteResult >?> computeResults () async {
638
- final results = < MentionAutocompleteResult > [];
639
+ final unsorted = < MentionAutocompleteResult > [];
639
640
// Give priority to wildcard mentions.
640
- computeWildcardMentionResults (results: results ,
641
+ computeWildcardMentionResults (results: unsorted ,
641
642
isComposingChannelMessage: narrow is ChannelNarrow || narrow is TopicNarrow );
642
643
643
644
if (await filterCandidates (filter: _testUser,
644
- candidates: sortedUsers, results: results )) {
645
+ candidates: sortedUsers, results: unsorted )) {
645
646
return null ;
646
647
}
647
- return results;
648
+
649
+ return bucketSort (unsorted,
650
+ (r) => r.rank, numBuckets: MentionAutocompleteQuery ._numResultRanks);
648
651
}
649
652
650
653
MentionAutocompleteResult ? _testUser (MentionAutocompleteQuery query, User user) {
@@ -749,7 +752,8 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
749
752
final matches = wildcardOption.canonicalString.contains (_lowercase)
750
753
|| wildcardOption.localizedCanonicalString (localizations).contains (_lowercase);
751
754
if (! matches) return null ;
752
- return WildcardMentionAutocompleteResult (wildcardOption: wildcardOption);
755
+ return WildcardMentionAutocompleteResult (
756
+ wildcardOption: wildcardOption, rank: _rankWildcardResult);
753
757
}
754
758
755
759
MentionAutocompleteResult ? testUser (User user, PerAccountStore store) {
@@ -760,13 +764,30 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
760
764
// TODO(#236) test email too, not just name
761
765
if (! _testName (user, cache)) return null ;
762
766
763
- return UserMentionAutocompleteResult (userId: user.userId);
767
+ return UserMentionAutocompleteResult (
768
+ userId: user.userId, rank: _rankUserResult (user));
764
769
}
765
770
766
771
bool _testName (User user, AutocompleteDataCache cache) {
767
772
return _testContainsQueryWords (cache.nameWordsForUser (user));
768
773
}
769
774
775
+ /// A measure of a wildcard result's quality in the context of the query,
776
+ /// from 0 (best) to one less than [_numResultRanks] .
777
+ ///
778
+ /// See also [_rankUserResult] .
779
+ static const _rankWildcardResult = 0 ;
780
+
781
+ /// A measure of a user result's quality in the context of the query,
782
+ /// from 0 (best) to one less than [_numResultRanks] .
783
+ ///
784
+ /// See also [_rankWildcardResult] .
785
+ static int _rankUserResult (User user) => 1 ;
786
+
787
+ /// The number of possible values returned by
788
+ /// [_rankWildcardResult] and [_rankUserResult] .
789
+ static const _numResultRanks = 2 ;
790
+
770
791
@override
771
792
String toString () {
772
793
return '${objectRuntimeType (this , 'MentionAutocompleteQuery' )}(raw: $raw , silent: $silent })' ;
@@ -853,20 +874,31 @@ class EmojiAutocompleteResult extends ComposeAutocompleteResult {
853
874
/// This is abstract because there are several kinds of result
854
875
/// that can all be offered in the same @-mention autocomplete interaction:
855
876
/// a user, a wildcard, or a user group.
856
- sealed class MentionAutocompleteResult extends ComposeAutocompleteResult {}
877
+ sealed class MentionAutocompleteResult extends ComposeAutocompleteResult {
878
+ /// A measure of the result's quality in the context of the query.
879
+ ///
880
+ /// Used internally by [MentionAutocompleteView] for ranking the results.
881
+ int get rank;
882
+ }
857
883
858
884
/// An autocomplete result for an @-mention of an individual user.
859
885
class UserMentionAutocompleteResult extends MentionAutocompleteResult {
860
- UserMentionAutocompleteResult ({required this .userId});
886
+ UserMentionAutocompleteResult ({required this .userId, required this .rank });
861
887
862
888
final int userId;
889
+
890
+ @override
891
+ final int rank;
863
892
}
864
893
865
894
/// An autocomplete result for an @-mention of all the users in a conversation.
866
895
class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
867
- WildcardMentionAutocompleteResult ({required this .wildcardOption});
896
+ WildcardMentionAutocompleteResult ({required this .wildcardOption, required this .rank });
868
897
869
898
final WildcardMentionOption wildcardOption;
899
+
900
+ @override
901
+ final int rank;
870
902
}
871
903
872
904
// TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
0 commit comments