@@ -423,8 +423,8 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
423423
424424  factory  MentionAutocompleteView .init ({
425425    required  PerAccountStore  store,
426-     required  Narrow  narrow,
427426    required  MentionAutocompleteQuery  query,
427+     required  Narrow  narrow,
428428  }) {
429429    final  view =  MentionAutocompleteView ._(
430430      store:  store,
@@ -492,8 +492,6 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
492492    required  String ?  topic,
493493    required  PerAccountStore  store,
494494  }) {
495-     // TODO(#234): give preference to "all", "everyone" or "stream" 
496- 
497495    // TODO(#618): give preference to subscribed users first 
498496
499497    if  (streamId !=  null ) {
@@ -598,9 +596,45 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
598596    return  userAName.compareTo (userBName); // TODO(i18n): add locale-aware sorting 
599597  }
600598
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+ 
601632  @override 
602633  Future <List <MentionAutocompleteResult >?> computeResults () async  {
603634    final  results =  < MentionAutocompleteResult > [];
635+     // Give priority to wildcard mentions. 
636+     results.addAll (wildcardMentionResults);
637+ 
604638    if  (await  filterCandidates (filter:  _testUser,
605639        candidates:  sortedUsers, results:  results)) {
606640      return  null ;
@@ -625,6 +659,9 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
625659  }
626660}
627661
662+ // The available user wildcard mention options. 
663+ enum  Wildcard  { all, everyone, channel, stream, topic }
664+ 
628665/// A query the user has entered into some form of autocomplete. 
629666/// 
630667/// Subclasses correspond to different types of autocomplete interaction 
@@ -694,9 +731,12 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
694731    return  MentionAutocompleteView .init (store:  store, narrow:  narrow, query:  this );
695732  }
696733
734+   bool  testWildcard (Wildcard  wildcard) {
735+     return  wildcard.name.contains (raw.toLowerCase ());
736+   }
737+ 
697738  bool  testUser (User  user, AutocompleteDataCache  cache) {
698739    // TODO(#236) test email too, not just name 
699- 
700740    if  (! user.isActive) return  false ;
701741
702742    return  _testName (user, cache);
@@ -778,9 +818,13 @@ class UserMentionAutocompleteResult extends MentionAutocompleteResult {
778818  final  int  userId;
779819}
780820
781- // TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult { 
821+ class  WildcardMentionAutocompleteResult  extends  MentionAutocompleteResult  {
822+   WildcardMentionAutocompleteResult ({required  this .wildcard});
823+ 
824+   final  Wildcard  wildcard;
825+ }
782826
783- // TODO(#234 ): // class WildcardMentionAutocompleteResult  extends MentionAutocompleteResult { 
827+ // TODO(#233 ): // class UserGroupMentionAutocompleteResult  extends MentionAutocompleteResult { 
784828
785829/// An autocomplete interaction for choosing a topic for a message. 
786830class  TopicAutocompleteView  extends  AutocompleteView <TopicAutocompleteQuery , TopicAutocompleteResult > {
0 commit comments