@@ -288,42 +288,29 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
288
288
MentionAutocompleteView ._({
289
289
required super .store,
290
290
required this .narrow,
291
+ required this .wildcards,
291
292
required this .sortedUsers,
292
293
});
293
294
294
295
factory MentionAutocompleteView .init ({
295
296
required PerAccountStore store,
296
297
required Narrow narrow,
298
+ required List <Wildcard > wildcards,
297
299
}) {
298
300
final view = MentionAutocompleteView ._(
299
301
store: store,
300
302
narrow: narrow,
303
+ wildcards: wildcards,
301
304
sortedUsers: _usersByRelevance (store: store, narrow: narrow),
302
305
);
303
306
store.autocompleteViewManager.registerMentionAutocomplete (view);
304
307
return view;
305
308
}
306
309
307
310
final Narrow narrow;
311
+ final List <Wildcard > wildcards;
308
312
final List <User > sortedUsers;
309
313
310
- @override
311
- Future <List <MentionAutocompleteResult >?> computeResults () async {
312
- final results = < MentionAutocompleteResult > [];
313
- if (await filterCandidates (filter: _testUser,
314
- candidates: sortedUsers, results: results)) {
315
- return null ;
316
- }
317
- return results;
318
- }
319
-
320
- MentionAutocompleteResult ? _testUser (MentionAutocompleteQuery query, User user) {
321
- if (query.testUser (user, store.autocompleteViewManager.autocompleteDataCache)) {
322
- return UserMentionAutocompleteResult (userId: user.userId);
323
- }
324
- return null ;
325
- }
326
-
327
314
static List <User > _usersByRelevance ({
328
315
required PerAccountStore store,
329
316
required Narrow narrow,
@@ -377,8 +364,6 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
377
364
required String ? topic,
378
365
required PerAccountStore store,
379
366
}) {
380
- // TODO(#234): give preference to "all", "everyone" or "stream"
381
-
382
367
// TODO(#618): give preference to subscribed users first
383
368
384
369
if (streamId != null ) {
@@ -483,6 +468,42 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
483
468
return userAName.compareTo (userBName); // TODO(i18n): add locale-aware sorting
484
469
}
485
470
471
+ bool _isChannelWildcardIncluded = false ;
472
+
473
+ @override
474
+ Future <List <MentionAutocompleteResult >?> computeResults () async {
475
+ _isChannelWildcardIncluded = false ;
476
+ final results = < MentionAutocompleteResult > [];
477
+ // give priority to wildcard mentions
478
+ if (await filterCandidates (filter: _testWildcard,
479
+ candidates: wildcards, results: results)) {
480
+ return null ;
481
+ }
482
+ if (await filterCandidates (filter: _testUser,
483
+ candidates: sortedUsers, results: results)) {
484
+ return null ;
485
+ }
486
+ return results;
487
+ }
488
+
489
+ MentionAutocompleteResult ? _testWildcard (MentionAutocompleteQuery query, Wildcard wildcard) {
490
+ if (query.testWildcard (wildcard)) {
491
+ if (wildcard.type == WildcardType .channel) {
492
+ if (_isChannelWildcardIncluded) return null ;
493
+ _isChannelWildcardIncluded = true ;
494
+ }
495
+ return WildcardMentionAutocompleteResult (wildcardName: wildcard.name);
496
+ }
497
+ return null ;
498
+ }
499
+
500
+ MentionAutocompleteResult ? _testUser (MentionAutocompleteQuery query, User user) {
501
+ if (query.testUser (user, store.autocompleteViewManager.autocompleteDataCache)) {
502
+ return UserMentionAutocompleteResult (userId: user.userId);
503
+ }
504
+ return null ;
505
+ }
506
+
486
507
@override
487
508
void dispose () {
488
509
store.autocompleteViewManager.unregisterMentionAutocomplete (this );
@@ -493,6 +514,37 @@ class MentionAutocompleteView extends AutocompleteView<MentionAutocompleteQuery,
493
514
}
494
515
}
495
516
517
+ class Wildcard {
518
+ Wildcard ({
519
+ required this .name,
520
+ required this .value,
521
+ required this .fullDisplayName,
522
+ required this .type,
523
+ });
524
+
525
+ /// The name of the wildcard to be shown as part of [fullDisplayName] in autocomplete suggestions.
526
+ ///
527
+ /// Ex: "channel", "stream", "topic", ...
528
+ final String name;
529
+
530
+ /// The value to be put at the compose box after choosing an option from autocomplete.
531
+ ///
532
+ /// Same as the [name] , except for "stream" it is "channel" in FL >= 247 (server-9).
533
+ final String value; // TODO(sever-9): remove, instead use [name]
534
+
535
+ /// The full name of the wildcard to be shown in autocomplete suggestions.
536
+ ///
537
+ /// Ex: "all (Notify channel)" or "everyone (Notify recipients)".
538
+ final String fullDisplayName;
539
+
540
+ final WildcardType type;
541
+ }
542
+
543
+ enum WildcardType {
544
+ channel,
545
+ topic, // TODO(sever-8)
546
+ }
547
+
496
548
abstract class AutocompleteQuery {
497
549
AutocompleteQuery (this .raw)
498
550
: _lowercaseWords = raw.toLowerCase ().split (' ' );
@@ -529,15 +581,14 @@ class MentionAutocompleteQuery extends AutocompleteQuery {
529
581
/// Whether the user wants a silent mention (@_query, vs. @query).
530
582
final bool silent;
531
583
532
- bool testUser (User user, AutocompleteDataCache cache) {
533
- // TODO(#236) test email too, not just name
584
+ bool testWildcard (Wildcard wildcard) {
585
+ return wildcard.name.contains (raw.toLowerCase ());
586
+ }
534
587
588
+ bool testUser (User user, AutocompleteDataCache cache) {
535
589
if (! user.isActive) return false ;
536
590
537
- return _testName (user, cache);
538
- }
539
-
540
- bool _testName (User user, AutocompleteDataCache cache) {
591
+ // TODO(#236) test email too, not just name
541
592
return _testContainsQueryWords (cache.nameWordsForUser (user));
542
593
}
543
594
@@ -585,9 +636,13 @@ class UserMentionAutocompleteResult extends MentionAutocompleteResult {
585
636
final int userId;
586
637
}
587
638
588
- // TODO(#233): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
639
+ class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
640
+ WildcardMentionAutocompleteResult ({required this .wildcardName});
641
+
642
+ final String wildcardName;
643
+ }
589
644
590
- // TODO(#234 ): // class WildcardMentionAutocompleteResult extends MentionAutocompleteResult {
645
+ // TODO(#233 ): // class UserGroupMentionAutocompleteResult extends MentionAutocompleteResult {
591
646
592
647
class TopicAutocompleteView extends AutocompleteView <TopicAutocompleteQuery , TopicAutocompleteResult > {
593
648
TopicAutocompleteView ._({required super .store, required this .streamId});
0 commit comments