1
1
import 'package:flutter/material.dart' ;
2
2
3
+ import '../generated/l10n/zulip_localizations.dart' ;
3
4
import '../model/emoji.dart' ;
5
+ import '../model/store.dart' ;
4
6
import 'content.dart' ;
5
7
import 'emoji.dart' ;
8
+ import 'icons.dart' ;
6
9
import 'store.dart' ;
7
10
import '../model/autocomplete.dart' ;
8
11
import '../model/compose.dart' ;
@@ -197,7 +200,9 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
197
200
}
198
201
// TODO(i18n) language-appropriate space character; check active keyboard?
199
202
// (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 , isChannelWildcardAvailable : store .account .zulipFeatureLevel >= 247 )} ' ;
201
206
}
202
207
203
208
controller.value = intent.textEditingValue.replaced (
@@ -211,7 +216,8 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
211
216
@override
212
217
Widget buildItem (BuildContext context, int index, ComposeAutocompleteResult option) {
213
218
final child = switch (option) {
214
- MentionAutocompleteResult () => _MentionAutocompleteItem (option: option),
219
+ MentionAutocompleteResult () => _MentionAutocompleteItem (
220
+ option: option, narrow: narrow),
215
221
EmojiAutocompleteResult () => _EmojiAutocompleteItem (option: option),
216
222
};
217
223
return InkWell (
@@ -223,28 +229,57 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
223
229
}
224
230
225
231
class _MentionAutocompleteItem extends StatelessWidget {
226
- const _MentionAutocompleteItem ({required this .option});
232
+ const _MentionAutocompleteItem ({required this .option, required this .narrow });
227
233
228
234
final MentionAutocompleteResult option;
235
+ final Narrow narrow;
229
236
230
237
@override
231
238
Widget build (BuildContext context) {
239
+ final store = PerAccountStoreWidget .of (context);
232
240
Widget avatar;
233
- String label;
241
+ Widget label;
234
242
switch (option) {
235
243
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);
238
249
}
239
250
240
251
return Padding (
241
252
padding: const EdgeInsets .symmetric (horizontal: 16.0 , vertical: 8.0 ),
242
253
child: Row (children: [
243
254
avatar,
244
255
const SizedBox (width: 8 ),
245
- Text ( label) ,
256
+ label,
246
257
]));
247
258
}
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
+ : localizations.notifyChannel (isChannelWildcardAvailable ? "channel" : "stream" ),
271
+ Wildcard .everyone => isDmNarrow
272
+ ? localizations.notifyRecipients
273
+ : localizations.notifyChannel (isChannelWildcardAvailable ? "channel" : "stream" ),
274
+ Wildcard .channel => localizations.notifyChannel ('channel' ),
275
+ Wildcard .stream => localizations.notifyChannel (
276
+ isChannelWildcardAvailable ? 'channel' : 'stream' ),
277
+ Wildcard .topic => localizations.notifyTopic,
278
+ };
279
+ return Text .rich (TextSpan (text: '${wildcard .name } ' , children: [
280
+ TextSpan (text: description, style: TextStyle (fontSize: 12 ,
281
+ color: Colors .black.withValues (alpha: 0.8 )))]));
282
+ }
248
283
}
249
284
250
285
class _EmojiAutocompleteItem extends StatelessWidget {
0 commit comments