@@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
33
44import '../api/model/model.dart' ;
55import '../api/route/messages.dart' ;
6+ import '../model/emoji.dart' ;
67import 'content.dart' ;
78import 'store.dart' ;
89import 'text.dart' ;
@@ -148,8 +149,6 @@ class ReactionChip extends StatelessWidget {
148149 final emojiName = reactionWithVotes.emojiName;
149150 final userIds = reactionWithVotes.userIds;
150151
151- final emojiset = store.userSettings? .emojiset ?? Emojiset .google;
152-
153152 final selfVoted = userIds.contains (store.selfUserId);
154153 final label = showName
155154 // TODO(i18n): List formatting, like you can do in JavaScript:
@@ -175,26 +174,20 @@ class ReactionChip extends StatelessWidget {
175174 );
176175 final shape = StadiumBorder (side: borderSide);
177176
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+ };
198191
199192 return Tooltip (
200193 // TODO(#434): Semantics with eg "Reaction: <emoji name>; you and N others: <names>"
@@ -301,22 +294,15 @@ TextScaler _labelTextScalerClamped(BuildContext context) =>
301294
302295class _UnicodeEmoji extends StatelessWidget {
303296 const _UnicodeEmoji ({
304- required this .emojiCode,
305- required this .emojiName,
297+ required this .emojiDisplay,
306298 required this .selected,
307299 });
308300
309- final String emojiCode;
310- final String emojiName;
301+ final UnicodeEmojiDisplay emojiDisplay;
311302 final bool selected;
312303
313304 @override
314305 Widget build (BuildContext context) {
315- final parsed = tryParseEmojiCodeToUnicode (emojiCode);
316- if (parsed == null ) { // TODO(log)
317- return _TextEmoji (emojiName: emojiName, selected: selected);
318- }
319-
320306 switch (defaultTargetPlatform) {
321307 case TargetPlatform .android:
322308 case TargetPlatform .fuchsia:
@@ -329,7 +315,7 @@ class _UnicodeEmoji extends StatelessWidget {
329315 fontSize: _notoColorEmojiTextSize,
330316 ),
331317 strutStyle: const StrutStyle (fontSize: _notoColorEmojiTextSize, forceStrutHeight: true ),
332- parsed );
318+ emojiDisplay.emojiUnicode );
333319 case TargetPlatform .iOS:
334320 case TargetPlatform .macOS:
335321 // We expect the font "Apple Color Emoji" to be used. There are some
@@ -355,29 +341,25 @@ class _UnicodeEmoji extends StatelessWidget {
355341 textScaler: _squareEmojiScalerClamped (context),
356342 style: const TextStyle (fontSize: _squareEmojiSize),
357343 strutStyle: const StrutStyle (fontSize: _squareEmojiSize, forceStrutHeight: true ),
358- parsed )),
344+ emojiDisplay.emojiUnicode )),
359345 ]);
360346 }
361347 }
362348}
363349
364350class _ImageEmoji extends StatelessWidget {
365351 const _ImageEmoji ({
366- required this .emojiCode ,
352+ required this .emojiDisplay ,
367353 required this .emojiName,
368354 required this .selected,
369355 });
370356
371- final String emojiCode ;
357+ final ImageEmojiDisplay emojiDisplay ;
372358 final String emojiName;
373359 final bool selected;
374360
375- Widget get _textFallback => _TextEmoji (emojiName: emojiName, selected: selected);
376-
377361 @override
378362 Widget build (BuildContext context) {
379- final store = PerAccountStoreWidget .of (context);
380-
381363 // Some people really dislike animated emoji.
382364 final doNotAnimate =
383365 // From reading code, this doesn't actually get set on iOS:
@@ -390,43 +372,33 @@ class _ImageEmoji extends StatelessWidget {
390372 // See GitHub comment linked above.
391373 && WidgetsBinding .instance.platformDispatcher.accessibilityFeatures.reduceMotion);
392374
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;
409378
410379 // Unicode and text emoji get scaled; it would look weird if image emoji didn't.
411380 final size = _squareEmojiScalerClamped (context).scale (_squareEmojiSize);
412381
413382 return RealmContentNetworkImage (
414- resolved ,
383+ resolvedUrl ,
415384 width: size,
416385 height: size,
417- errorBuilder: (context, _, __) => _textFallback,
386+ errorBuilder: (context, _, __) => _TextEmoji (
387+ emojiDisplay: TextEmojiDisplay (emojiName: emojiName), selected: selected),
418388 );
419389 }
420390}
421391
422392class _TextEmoji extends StatelessWidget {
423- const _TextEmoji ({required this .emojiName , required this .selected});
393+ const _TextEmoji ({required this .emojiDisplay , required this .selected});
424394
425- final String emojiName ;
395+ final TextEmojiDisplay emojiDisplay ;
426396 final bool selected;
427397
428398 @override
429399 Widget build (BuildContext context) {
400+ final emojiName = emojiDisplay.emojiName;
401+
430402 // Encourage line breaks before "_" (common in these), but try not
431403 // to leave a colon alone on a line. See:
432404 // <https://github.com/flutter/flutter/issues/61081#issuecomment-1103330522>
0 commit comments