@@ -423,8 +423,8 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
423
423
424
424
factory MentionAutocompleteView .init ({
425
425
required PerAccountStore store,
426
- required Narrow narrow,
427
426
required MentionAutocompleteQuery query,
427
+ required Narrow narrow,
428
428
}) {
429
429
final view = MentionAutocompleteView ._(
430
430
store: store,
@@ -492,8 +492,6 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
492
492
required String ? topic,
493
493
required PerAccountStore store,
494
494
}) {
495
- // TODO(#234): give preference to "all", "everyone" or "stream"
496
-
497
495
// TODO(#618): give preference to subscribed users first
498
496
499
497
if (streamId != null ) {
@@ -601,13 +599,47 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
601
599
@override
602
600
Future <List <MentionAutocompleteResult >?> computeResults () async {
603
601
final results = < MentionAutocompleteResult > [];
602
+ // Give priority to wildcard mentions.
603
+ results.addAll (wildcardMentionResults);
604
+
604
605
if (await filterCandidates (filter: _testUser,
605
606
candidates: sortedUsers, results: results)) {
606
607
return null ;
607
608
}
608
609
return results;
609
610
}
610
611
612
+ List <WildcardMentionAutocompleteResult > get wildcardMentionResults {
613
+ final isChannelWildcardAvailable = store.account.zulipFeatureLevel >= 247 ; // TODO(server-9)
614
+ final isChannelOrTopicNarrow = narrow is ChannelNarrow || narrow is TopicNarrow ;
615
+
616
+ final wildcardMentions = < WildcardMentionAutocompleteResult > [];
617
+ if (query.testWildcard (Wildcard .all)) {
618
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
619
+ wildcard: Wildcard .all));
620
+ } else if (query.testWildcard (Wildcard .everyone)) {
621
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
622
+ wildcard: Wildcard .everyone));
623
+ } else if (isChannelOrTopicNarrow) {
624
+ if (query.testWildcard (Wildcard .channel) && isChannelWildcardAvailable) {
625
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
626
+ wildcard: Wildcard .channel));
627
+ } else if (query.testWildcard (Wildcard .stream)) {
628
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
629
+ wildcard: Wildcard .stream));
630
+ }
631
+ }
632
+
633
+ final isTopicWildcardAvailable = store.account.zulipFeatureLevel >= 188 ; // TODO(sever-8)
634
+ if (isChannelOrTopicNarrow
635
+ && isTopicWildcardAvailable
636
+ && query.testWildcard (Wildcard .topic)) {
637
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
638
+ wildcard: Wildcard .topic));
639
+ }
640
+ return wildcardMentions;
641
+ }
642
+
611
643
MentionAutocompleteResult ? _testUser (MentionAutocompleteQuery query, User user) {
612
644
if (query.testUser (user, store.autocompleteViewManager.autocompleteDataCache)) {
613
645
return UserMentionAutocompleteResult (userId: user.userId);
@@ -625,6 +657,8 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
625
657
}
626
658
}
627
659
660
+ enum Wildcard { all, everyone, channel, stream, topic }
661
+
628
662
/// A query the user has entered into some form of autocomplete.
629
663
///
630
664
/// Subclasses correspond to different types of autocomplete interaction
@@ -694,9 +728,12 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
694
728
return MentionAutocompleteView .init (store: store, narrow: narrow, query: this );
695
729
}
696
730
731
+ bool testWildcard (Wildcard wildcard) {
732
+ return wildcard.name.contains (raw.toLowerCase ());
733
+ }
734
+
697
735
bool testUser (User user, AutocompleteDataCache cache) {
698
736
// TODO(#236) test email too, not just name
699
-
700
737
if (! user.isActive) return false ;
701
738
702
739
return _testName (user, cache);
@@ -778,6 +815,12 @@ class UserMentionAutocompleteResult extends MentionAutocompleteResult {
778
815
final int userId;
779
816
}
780
817
818
+ class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
819
+ WildcardMentionAutocompleteResult ({required this .wildcard});
820
+
821
+ final Wildcard wildcard;
822
+ }
823
+
781
824
// TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
782
825
783
826
// TODO(#234): // class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
0 commit comments