Skip to content

Commit b39060e

Browse files
reactions: Support adding arbitary reactions
1 parent e217cc7 commit b39060e

10 files changed

+507
-23
lines changed

assets/l10n/app_en.arb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,10 @@
330330
"@dialogContinue": {
331331
"description": "Button label in dialogs to proceed."
332332
},
333+
"dialogClose": "Close",
334+
"@dialogClose": {
335+
"description": "Button label in dialogs to close."
336+
},
333337
"errorDialogContinue": "OK",
334338
"@errorDialogContinue": {
335339
"description": "Button label in error dialogs to acknowledge the error and close the dialog."
@@ -611,5 +615,13 @@
611615
"errorReactionRemovingFailedTitle": "Removing reaction failed",
612616
"@errorReactionRemovingFailedTitle": {
613617
"description": "Error title when removing a message reaction fails"
618+
},
619+
"emojiReactionsMore": "more",
620+
"@emojiReactionsMore": {
621+
"description": "Label for a button opening the emoji picker."
622+
},
623+
"emojiPickerSearchEmoji": "Search emoji",
624+
"@emojiPickerSearchEmoji": {
625+
"description": "Hint text for the emoji picker search text field."
614626
}
615627
}

lib/generated/l10n/zulip_localizations.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,12 @@ abstract class ZulipLocalizations {
529529
/// **'Continue'**
530530
String get dialogContinue;
531531

532+
/// Button label in dialogs to close.
533+
///
534+
/// In en, this message translates to:
535+
/// **'Close'**
536+
String get dialogClose;
537+
532538
/// Button label in error dialogs to acknowledge the error and close the dialog.
533539
///
534540
/// In en, this message translates to:
@@ -906,6 +912,18 @@ abstract class ZulipLocalizations {
906912
/// In en, this message translates to:
907913
/// **'Removing reaction failed'**
908914
String get errorReactionRemovingFailedTitle;
915+
916+
/// Label for a button opening the emoji picker.
917+
///
918+
/// In en, this message translates to:
919+
/// **'more'**
920+
String get emojiReactionsMore;
921+
922+
/// Hint text for the emoji picker search text field.
923+
///
924+
/// In en, this message translates to:
925+
/// **'Search emoji'**
926+
String get emojiPickerSearchEmoji;
909927
}
910928

911929
class _ZulipLocalizationsDelegate extends LocalizationsDelegate<ZulipLocalizations> {

lib/generated/l10n/zulip_localizations_ar.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
260260
@override
261261
String get dialogContinue => 'Continue';
262262

263+
@override
264+
String get dialogClose => 'Close';
265+
263266
@override
264267
String get errorDialogContinue => 'OK';
265268

@@ -484,4 +487,10 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
484487

485488
@override
486489
String get errorReactionRemovingFailedTitle => 'Removing reaction failed';
490+
491+
@override
492+
String get emojiReactionsMore => 'more';
493+
494+
@override
495+
String get emojiPickerSearchEmoji => 'Search emoji';
487496
}

lib/generated/l10n/zulip_localizations_en.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
260260
@override
261261
String get dialogContinue => 'Continue';
262262

263+
@override
264+
String get dialogClose => 'Close';
265+
263266
@override
264267
String get errorDialogContinue => 'OK';
265268

@@ -484,4 +487,10 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
484487

485488
@override
486489
String get errorReactionRemovingFailedTitle => 'Removing reaction failed';
490+
491+
@override
492+
String get emojiReactionsMore => 'more';
493+
494+
@override
495+
String get emojiPickerSearchEmoji => 'Search emoji';
487496
}

lib/generated/l10n/zulip_localizations_ja.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
260260
@override
261261
String get dialogContinue => 'Continue';
262262

263+
@override
264+
String get dialogClose => 'Close';
265+
263266
@override
264267
String get errorDialogContinue => 'OK';
265268

@@ -484,4 +487,10 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
484487

485488
@override
486489
String get errorReactionRemovingFailedTitle => 'Removing reaction failed';
490+
491+
@override
492+
String get emojiReactionsMore => 'more';
493+
494+
@override
495+
String get emojiPickerSearchEmoji => 'Search emoji';
487496
}

lib/widgets/action_sheet.dart

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import 'color.dart';
1818
import 'compose_box.dart';
1919
import 'dialog.dart';
2020
import 'emoji.dart';
21+
import 'emoji_reaction.dart';
2122
import 'icons.dart';
2223
import 'inset_shadow.dart';
2324
import 'message_list.dart';
@@ -247,30 +248,56 @@ class ReactionButtons extends StatelessWidget {
247248
}
248249

249250
return Container(
250-
padding: const EdgeInsets.all(8),
251+
padding: const EdgeInsets.only(left: 8),
251252
decoration: BoxDecoration(color: designVariables.contextMenuItemBg.withFadedAlpha(0.12)),
252-
child: Row(
253-
mainAxisAlignment: MainAxisAlignment.spaceAround,
254-
children: List.unmodifiable(popularEmojis.map((emoji) {
255-
final selfVoted = hasSelfVote(emoji);
256-
return IconButton(
257-
onPressed: () => _onPressed(emoji, selfVoted, zulipLocalizations),
258-
isSelected: selfVoted,
259-
style: IconButton.styleFrom(
260-
padding: EdgeInsets.zero,
261-
splashFactory: NoSplash.splashFactory,
262-
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3.5)),
263-
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
264-
visualDensity: VisualDensity.compact,
265-
).copyWith(backgroundColor: WidgetStateColor.resolveWith((states) =>
266-
states.any((e) => e == WidgetState.pressed || e == WidgetState.selected)
267-
? designVariables.contextMenuItemBg.withFadedAlpha(0.20)
268-
: Colors.transparent)),
269-
icon: UnicodeEmojiWidget(
270-
emojiDisplay: emoji.emojiDisplay as UnicodeEmojiDisplay,
271-
notoColorEmojiTextSize: 20.1,
272-
size: 24));
273-
})))
253+
child: Row(children: [
254+
Flexible(child: Padding(
255+
padding: const EdgeInsets.symmetric(vertical: 8),
256+
child: Row(
257+
mainAxisAlignment: MainAxisAlignment.spaceAround,
258+
children: List.unmodifiable(popularEmojis.map((emoji) {
259+
final selfVoted = hasSelfVote(emoji);
260+
return IconButton(
261+
onPressed: () => _onPressed(emoji, selfVoted, zulipLocalizations),
262+
isSelected: selfVoted,
263+
style: IconButton.styleFrom(
264+
padding: EdgeInsets.zero,
265+
splashFactory: NoSplash.splashFactory,
266+
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(3.5)),
267+
tapTargetSize: MaterialTapTargetSize.shrinkWrap,
268+
visualDensity: VisualDensity.compact,
269+
).copyWith(backgroundColor: WidgetStateColor.resolveWith((states) =>
270+
states.any((e) => e == WidgetState.pressed || e == WidgetState.selected)
271+
? designVariables.contextMenuItemBg.withFadedAlpha(0.20)
272+
: Colors.transparent)),
273+
icon: UnicodeEmojiWidget(
274+
emojiDisplay: emoji.emojiDisplay as UnicodeEmojiDisplay,
275+
notoColorEmojiTextSize: 20.1,
276+
size: 24));
277+
}))))),
278+
TextButton(
279+
onPressed: () {
280+
showEmojiPickerSheet(pageContext: pageContext, message: message);
281+
},
282+
style: TextButton.styleFrom(
283+
padding: const EdgeInsets.fromLTRB(12, 12, 4, 12),
284+
splashFactory: NoSplash.splashFactory,
285+
foregroundColor: designVariables.contextMenuItemText,
286+
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.zero)
287+
).copyWith(backgroundColor: WidgetStateColor.resolveWith((states) =>
288+
states.contains(WidgetState.pressed)
289+
? designVariables.contextMenuItemBg.withFadedAlpha(0.20)
290+
: Colors.transparent)),
291+
child: Row(children: [
292+
Text(zulipLocalizations.emojiReactionsMore,
293+
textAlign: TextAlign.right,
294+
style: const TextStyle(fontSize: 14)
295+
.merge(weightVariableTextStyle(context, wght: 600))),
296+
Icon(ZulipIcons.chevron_right,
297+
color: designVariables.contextMenuItemText,
298+
size: 24),
299+
])),
300+
]),
274301
);
275302
}
276303
}

0 commit comments

Comments
 (0)