@@ -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 ) {
@@ -598,9 +596,45 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
598
596
return userAName.compareTo (userBName); // TODO(i18n): add locale-aware sorting
599
597
}
600
598
599
+ List <WildcardMentionAutocompleteResult > get wildcardMentionResults {
600
+ final isChannelWildcardAvailable = store.account.zulipFeatureLevel >= 247 ; // TODO(server-9)
601
+ final isChannelOrTopicNarrow = narrow is ChannelNarrow || narrow is TopicNarrow ;
602
+
603
+ final wildcardMentions = < WildcardMentionAutocompleteResult > [];
604
+ // Only one of the (all, everyone, channel, stream) channel wildcards are
605
+ // shown.
606
+ if (query.testWildcard (Wildcard .all)) {
607
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
608
+ wildcard: Wildcard .all));
609
+ } else if (query.testWildcard (Wildcard .everyone)) {
610
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
611
+ wildcard: Wildcard .everyone));
612
+ } else if (isChannelOrTopicNarrow) {
613
+ if (query.testWildcard (Wildcard .channel) && isChannelWildcardAvailable) {
614
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
615
+ wildcard: Wildcard .channel));
616
+ } else if (query.testWildcard (Wildcard .stream)) {
617
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
618
+ wildcard: Wildcard .stream));
619
+ }
620
+ }
621
+
622
+ final isTopicWildcardAvailable = store.account.zulipFeatureLevel >= 224 ; // TODO(sever-8)
623
+ if (isChannelOrTopicNarrow
624
+ && isTopicWildcardAvailable
625
+ && query.testWildcard (Wildcard .topic)) {
626
+ wildcardMentions.add (WildcardMentionAutocompleteResult (
627
+ wildcard: Wildcard .topic));
628
+ }
629
+ return wildcardMentions;
630
+ }
631
+
601
632
@override
602
633
Future <List <MentionAutocompleteResult >?> computeResults () async {
603
634
final results = < MentionAutocompleteResult > [];
635
+ // Give priority to wildcard mentions.
636
+ results.addAll (wildcardMentionResults);
637
+
604
638
if (await filterCandidates (filter: _testUser,
605
639
candidates: sortedUsers, results: results)) {
606
640
return null ;
@@ -625,6 +659,9 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
625
659
}
626
660
}
627
661
662
+ // The available user wildcard mention options.
663
+ enum Wildcard { all, everyone, channel, stream, topic }
664
+
628
665
/// A query the user has entered into some form of autocomplete.
629
666
///
630
667
/// Subclasses correspond to different types of autocomplete interaction
@@ -694,9 +731,12 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
694
731
return MentionAutocompleteView .init (store: store, narrow: narrow, query: this );
695
732
}
696
733
734
+ bool testWildcard (Wildcard wildcard) {
735
+ return wildcard.name.contains (raw.toLowerCase ());
736
+ }
737
+
697
738
bool testUser (User user, AutocompleteDataCache cache) {
698
739
// TODO(#236) test email too, not just name
699
-
700
740
if (! user.isActive) return false ;
701
741
702
742
return _testName (user, cache);
@@ -778,9 +818,13 @@ class UserMentionAutocompleteResult extends MentionAutocompleteResult {
778
818
final int userId;
779
819
}
780
820
781
- // TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
821
+ class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
822
+ WildcardMentionAutocompleteResult ({required this .wildcard});
823
+
824
+ final Wildcard wildcard;
825
+ }
782
826
783
- // TODO(#234 ): // class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
827
+ // TODO(#233 ): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
784
828
785
829
/// An autocomplete interaction for choosing a topic for a message.
786
830
class TopicAutocompleteView extends AutocompleteView <TopicAutocompleteQuery , TopicAutocompleteResult > {
0 commit comments