@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
3
3
4
4
import '../api/model/model.dart' ;
5
5
import '../api/route/messages.dart' ;
6
+ import '../model/emoji.dart' ;
6
7
import 'content.dart' ;
7
8
import 'store.dart' ;
8
9
import 'text.dart' ;
@@ -148,8 +149,6 @@ class ReactionChip extends StatelessWidget {
148
149
final emojiName = reactionWithVotes.emojiName;
149
150
final userIds = reactionWithVotes.userIds;
150
151
151
- final emojiset = store.userSettings? .emojiset ?? Emojiset .google;
152
-
153
152
final selfVoted = userIds.contains (store.selfUserId);
154
153
final label = showName
155
154
// TODO(i18n): List formatting, like you can do in JavaScript:
@@ -175,26 +174,20 @@ class ReactionChip extends StatelessWidget {
175
174
);
176
175
final shape = StadiumBorder (side: borderSide);
177
176
178
- final Widget emoji;
179
- if (emojiset == Emojiset .text) {
180
- emoji = _TextEmoji (emojiName: emojiName, selected: selfVoted);
181
- } else {
182
- switch (reactionType) {
183
- case ReactionType .unicodeEmoji:
184
- emoji = _UnicodeEmoji (
185
- emojiCode: emojiCode,
186
- emojiName: emojiName,
187
- selected: selfVoted,
188
- );
189
- case ReactionType .realmEmoji:
190
- case ReactionType .zulipExtraEmoji:
191
- emoji = _ImageEmoji (
192
- emojiCode: emojiCode,
193
- emojiName: emojiName,
194
- selected: selfVoted,
195
- );
196
- }
197
- }
177
+ final emojiDisplay = store.emojiDisplayFor (
178
+ emojiType: reactionType,
179
+ emojiCode: emojiCode,
180
+ emojiName: emojiName,
181
+ ).resolve (store.userSettings);
182
+
183
+ final emoji = switch (emojiDisplay) {
184
+ UnicodeEmojiDisplay () => _UnicodeEmoji (
185
+ emojiDisplay: emojiDisplay, selected: selfVoted),
186
+ ImageEmojiDisplay () => _ImageEmoji (
187
+ emojiDisplay: emojiDisplay, emojiName: emojiName, selected: selfVoted),
188
+ TextEmojiDisplay () => _TextEmoji (
189
+ emojiDisplay: emojiDisplay, selected: selfVoted),
190
+ };
198
191
199
192
return Tooltip (
200
193
// TODO(#434): Semantics with eg "Reaction: <emoji name>; you and N others: <names>"
@@ -301,22 +294,15 @@ TextScaler _labelTextScalerClamped(BuildContext context) =>
301
294
302
295
class _UnicodeEmoji extends StatelessWidget {
303
296
const _UnicodeEmoji ({
304
- required this .emojiCode,
305
- required this .emojiName,
297
+ required this .emojiDisplay,
306
298
required this .selected,
307
299
});
308
300
309
- final String emojiCode;
310
- final String emojiName;
301
+ final UnicodeEmojiDisplay emojiDisplay;
311
302
final bool selected;
312
303
313
304
@override
314
305
Widget build (BuildContext context) {
315
- final parsed = tryParseEmojiCodeToUnicode (emojiCode);
316
- if (parsed == null ) { // TODO(log)
317
- return _TextEmoji (emojiName: emojiName, selected: selected);
318
- }
319
-
320
306
switch (defaultTargetPlatform) {
321
307
case TargetPlatform .android:
322
308
case TargetPlatform .fuchsia:
@@ -329,7 +315,7 @@ class _UnicodeEmoji extends StatelessWidget {
329
315
fontSize: _notoColorEmojiTextSize,
330
316
),
331
317
strutStyle: const StrutStyle (fontSize: _notoColorEmojiTextSize, forceStrutHeight: true ),
332
- parsed );
318
+ emojiDisplay.emojiUnicode );
333
319
case TargetPlatform .iOS:
334
320
case TargetPlatform .macOS:
335
321
// We expect the font "Apple Color Emoji" to be used. There are some
@@ -355,29 +341,25 @@ class _UnicodeEmoji extends StatelessWidget {
355
341
textScaler: _squareEmojiScalerClamped (context),
356
342
style: const TextStyle (fontSize: _squareEmojiSize),
357
343
strutStyle: const StrutStyle (fontSize: _squareEmojiSize, forceStrutHeight: true ),
358
- parsed )),
344
+ emojiDisplay.emojiUnicode )),
359
345
]);
360
346
}
361
347
}
362
348
}
363
349
364
350
class _ImageEmoji extends StatelessWidget {
365
351
const _ImageEmoji ({
366
- required this .emojiCode ,
352
+ required this .emojiDisplay ,
367
353
required this .emojiName,
368
354
required this .selected,
369
355
});
370
356
371
- final String emojiCode ;
357
+ final ImageEmojiDisplay emojiDisplay ;
372
358
final String emojiName;
373
359
final bool selected;
374
360
375
- Widget get _textFallback => _TextEmoji (emojiName: emojiName, selected: selected);
376
-
377
361
@override
378
362
Widget build (BuildContext context) {
379
- final store = PerAccountStoreWidget .of (context);
380
-
381
363
// Some people really dislike animated emoji.
382
364
final doNotAnimate =
383
365
// From reading code, this doesn't actually get set on iOS:
@@ -390,43 +372,33 @@ class _ImageEmoji extends StatelessWidget {
390
372
// See GitHub comment linked above.
391
373
&& WidgetsBinding .instance.platformDispatcher.accessibilityFeatures.reduceMotion);
392
374
393
- final String src;
394
- switch (emojiCode) {
395
- case 'zulip' : // the single "zulip extra emoji"
396
- src = '/static/generated/emoji/images/emoji/unicode/zulip.png' ;
397
- default :
398
- final item = store.realmEmoji[emojiCode];
399
- if (item == null ) {
400
- return _textFallback;
401
- }
402
- src = doNotAnimate && item.stillUrl != null ? item.stillUrl! : item.sourceUrl;
403
- }
404
- final parsedSrc = Uri .tryParse (src);
405
- if (parsedSrc == null ) { // TODO(log)
406
- return _textFallback;
407
- }
408
- final resolved = store.realmUrl.resolveUri (parsedSrc);
375
+ final resolvedUrl = doNotAnimate
376
+ ? (emojiDisplay.resolvedStillUrl ?? emojiDisplay.resolvedUrl)
377
+ : emojiDisplay.resolvedUrl;
409
378
410
379
// Unicode and text emoji get scaled; it would look weird if image emoji didn't.
411
380
final size = _squareEmojiScalerClamped (context).scale (_squareEmojiSize);
412
381
413
382
return RealmContentNetworkImage (
414
- resolved ,
383
+ resolvedUrl ,
415
384
width: size,
416
385
height: size,
417
- errorBuilder: (context, _, __) => _textFallback,
386
+ errorBuilder: (context, _, __) => _TextEmoji (
387
+ emojiDisplay: TextEmojiDisplay (emojiName: emojiName), selected: selected),
418
388
);
419
389
}
420
390
}
421
391
422
392
class _TextEmoji extends StatelessWidget {
423
- const _TextEmoji ({required this .emojiName , required this .selected});
393
+ const _TextEmoji ({required this .emojiDisplay , required this .selected});
424
394
425
- final String emojiName ;
395
+ final TextEmojiDisplay emojiDisplay ;
426
396
final bool selected;
427
397
428
398
@override
429
399
Widget build (BuildContext context) {
400
+ final emojiName = emojiDisplay.emojiName;
401
+
430
402
// Encourage line breaks before "_" (common in these), but try not
431
403
// to leave a colon alone on a line. See:
432
404
// <https://github.com/flutter/flutter/issues/61081#issuecomment-1103330522>
0 commit comments