11import  'package:flutter/material.dart' ;
22
3+ import  '../generated/l10n/zulip_localizations.dart' ;
34import  '../model/emoji.dart' ;
5+ import  '../model/store.dart' ;
46import  'content.dart' ;
57import  'emoji.dart' ;
8+ import  'icons.dart' ;
69import  'store.dart' ;
710import  '../model/autocomplete.dart' ;
811import  '../model/compose.dart' ;
@@ -197,7 +200,9 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
197200        }
198201        // TODO(i18n) language-appropriate space character; check active keyboard? 
199202        //   (maybe handle centrally in `controller`) 
200-         replacementString =  '${mention (store .users [userId ]!, silent : query .silent , users : store .users )} ' ;
203+         replacementString =  '${userMention (store .users [userId ]!, silent : query .silent , users : store .users )} ' ;
204+       case  WildcardMentionAutocompleteResult (: var  wildcard): 
205+         replacementString =  '${wildcardMention (wildcard , store : store )} ' ;
201206    }
202207
203208    controller.value =  intent.textEditingValue.replaced (
@@ -211,7 +216,8 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
211216  @override 
212217  Widget  buildItem (BuildContext  context, int  index, ComposeAutocompleteResult  option) {
213218    final  child =  switch  (option) {
214-       MentionAutocompleteResult () =>  _MentionAutocompleteItem (option:  option),
219+       MentionAutocompleteResult () =>  _MentionAutocompleteItem (
220+         option:  option, narrow:  narrow),
215221      EmojiAutocompleteResult () =>  _EmojiAutocompleteItem (option:  option),
216222    };
217223    return  InkWell (
@@ -223,28 +229,62 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
223229}
224230
225231class  _MentionAutocompleteItem  extends  StatelessWidget  {
226-   const  _MentionAutocompleteItem ({required  this .option});
232+   const  _MentionAutocompleteItem ({required  this .option,  required   this .narrow });
227233
228234  final  MentionAutocompleteResult  option;
235+   final  Narrow  narrow;
229236
230237  @override 
231238  Widget  build (BuildContext  context) {
239+     final  store =  PerAccountStoreWidget .of (context);
232240    Widget  avatar;
233-     String  label;
241+     Widget  label;
234242    switch  (option) {
235243      case  UserMentionAutocompleteResult (: var  userId): 
236-         avatar =  Avatar (userId:  userId, size:  32 , borderRadius:  3 );
237-         label =  PerAccountStoreWidget .of (context).users[userId]! .fullName;
244+         avatar =  Avatar (userId:  userId, size:  32 , borderRadius:  3 ); // web uses 21px 
245+         label =  Text (store.users[userId]! .fullName);
246+       case  WildcardMentionAutocompleteResult (: var  wildcard): 
247+         avatar =  const  Icon (ZulipIcons .three_person, size:  29 ); // web uses 19px 
248+         label =  wildcardLabel (wildcard, context:  context, store:  store);
238249    }
239250
240251    return  Padding (
241252      padding:  const  EdgeInsets .symmetric (horizontal:  16.0 , vertical:  8.0 ),
242253      child:  Row (children:  [
243254        avatar,
244255        const  SizedBox (width:  8 ),
245-         Text ( label) ,
256+         label,
246257      ]));
247258  }
259+ 
260+   Widget  wildcardLabel (Wildcard  wildcard, {
261+     required  BuildContext  context,
262+     required  PerAccountStore  store,
263+   }) {
264+     final  isDmNarrow =  narrow is  DmNarrow ;
265+     final  isChannelWildcardAvailable =  store.account.zulipFeatureLevel >=  247 ; // TODO(server-9) 
266+     final  localizations =  ZulipLocalizations .of (context);
267+     final  description =  switch  (wildcard) {
268+       Wildcard .all =>  isDmNarrow
269+         ?  localizations.notifyRecipients
270+         :  isChannelWildcardAvailable
271+             ?  localizations.notifyChannel
272+             :  localizations.notifyStream,
273+       Wildcard .everyone =>  isDmNarrow
274+         ?  localizations.notifyRecipients
275+         :  isChannelWildcardAvailable
276+             ?  localizations.notifyChannel
277+             :  localizations.notifyStream,
278+       Wildcard .channel =>  localizations.notifyChannel,
279+       Wildcard .stream =>  isChannelWildcardAvailable
280+         ?  localizations.notifyChannel
281+         :  localizations.notifyStream,
282+       Wildcard .topic =>  localizations.notifyTopic,
283+     };
284+     return  Text .rich (TextSpan (text:  '${wildcard .name } ' , children:  [
285+       TextSpan (text:  description, style:  TextStyle (fontSize:  12 ,
286+         color:  Colors .black.withValues (alpha:  0.8 )))]));
287+   }
248288}
249289
250290class  _EmojiAutocompleteItem  extends  StatelessWidget  {
0 commit comments