@@ -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 ) {
@@ -601,13 +599,47 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
601599 @override
602600 Future <List <MentionAutocompleteResult >?> computeResults () async {
603601 final results = < MentionAutocompleteResult > [];
602+ // Give priority to wildcard mentions.
603+ results.addAll (wildcardMentionResults);
604+
604605 if (await filterCandidates (filter: _testUser,
605606 candidates: sortedUsers, results: results)) {
606607 return null ;
607608 }
608609 return results;
609610 }
610611
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+
611643 MentionAutocompleteResult ? _testUser (MentionAutocompleteQuery query, User user) {
612644 if (query.testUser (user, store.autocompleteViewManager.autocompleteDataCache)) {
613645 return UserMentionAutocompleteResult (userId: user.userId);
@@ -625,6 +657,8 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
625657 }
626658}
627659
660+ enum Wildcard { all, everyone, channel, stream, topic }
661+
628662/// A query the user has entered into some form of autocomplete.
629663///
630664/// Subclasses correspond to different types of autocomplete interaction
@@ -694,9 +728,12 @@ class MentionAutocompleteQuery extends ComposeAutocompleteQuery {
694728 return MentionAutocompleteView .init (store: store, narrow: narrow, query: this );
695729 }
696730
731+ bool testWildcard (Wildcard wildcard) {
732+ return wildcard.name.contains (raw.toLowerCase ());
733+ }
734+
697735 bool testUser (User user, AutocompleteDataCache cache) {
698736 // TODO(#236) test email too, not just name
699-
700737 if (! user.isActive) return false ;
701738
702739 return _testName (user, cache);
@@ -778,6 +815,12 @@ class UserMentionAutocompleteResult extends MentionAutocompleteResult {
778815 final int userId;
779816}
780817
818+ class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
819+ WildcardMentionAutocompleteResult ({required this .wildcard});
820+
821+ final Wildcard wildcard;
822+ }
823+
781824// TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
782825
783826// TODO(#234): // class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
0 commit comments