Skip to content

Commit e77e29b

Browse files
committed
1 parent ade7032 commit e77e29b

13 files changed

+317
-44
lines changed

assets/l10n/app_en.arb

+12
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@
128128
"@actionSheetOptionMarkAsUnread": {
129129
"description": "Label for mark as unread button on action sheet."
130130
},
131+
"actionSheetOptionHideMutedMessage": "Hide muted message again",
132+
"@actionSheetOptionHideMutedMessage": {
133+
"description": "Label for hide muted message again button on action sheet."
134+
},
131135
"actionSheetOptionShare": "Share",
132136
"@actionSheetOptionShare": {
133137
"description": "Label for share button on action sheet."
@@ -851,6 +855,14 @@
851855
"@noEarlierMessages": {
852856
"description": "Text to show at the start of a message list if there are no earlier messages."
853857
},
858+
"mutedSender": "Muted sender",
859+
"@mutedSender": {
860+
"description": "Name for a muted user to display in message list."
861+
},
862+
"revealButtonLabel": "Reveal message for muted sender",
863+
"@revealButtonLabel": {
864+
"description": "Label for the button revealing hidden message from a muted sender in message list."
865+
},
854866
"scrollToBottomTooltip": "Scroll to bottom",
855867
"@scrollToBottomTooltip": {
856868
"description": "Tooltip for button to scroll to bottom."

lib/generated/l10n/zulip_localizations.dart

+18
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,12 @@ abstract class ZulipLocalizations {
297297
/// **'Mark as unread from here'**
298298
String get actionSheetOptionMarkAsUnread;
299299

300+
/// Label for hide muted message again button on action sheet.
301+
///
302+
/// In en, this message translates to:
303+
/// **'Hide muted message again'**
304+
String get actionSheetOptionHideMutedMessage;
305+
300306
/// Label for share button on action sheet.
301307
///
302308
/// In en, this message translates to:
@@ -1245,6 +1251,18 @@ abstract class ZulipLocalizations {
12451251
/// **'No earlier messages'**
12461252
String get noEarlierMessages;
12471253

1254+
/// Name for a muted user to display in message list.
1255+
///
1256+
/// In en, this message translates to:
1257+
/// **'Muted sender'**
1258+
String get mutedSender;
1259+
1260+
/// Label for the button revealing hidden message from a muted sender in message list.
1261+
///
1262+
/// In en, this message translates to:
1263+
/// **'Reveal message for muted sender'**
1264+
String get revealButtonLabel;
1265+
12481266
/// Tooltip for button to scroll to bottom.
12491267
///
12501268
/// In en, this message translates to:

lib/generated/l10n/zulip_localizations_ar.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Mark as unread from here';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Share';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsAr extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/generated/l10n/zulip_localizations_en.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Mark as unread from here';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Share';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsEn extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/generated/l10n/zulip_localizations_ja.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Mark as unread from here';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Share';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsJa extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/generated/l10n/zulip_localizations_nb.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Mark as unread from here';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Share';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsNb extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/generated/l10n/zulip_localizations_pl.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Odtąd oznacz jako nieprzeczytane';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Udostępnij';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsPl extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'Brak historii';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Przewiń do dołu';
669678

lib/generated/l10n/zulip_localizations_ru.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Отметить как непрочитанные начиная отсюда';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Поделиться';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsRu extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/generated/l10n/zulip_localizations_sk.dart

+9
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
106106
@override
107107
String get actionSheetOptionMarkAsUnread => 'Označiť ako neprečítané od tejto správy';
108108

109+
@override
110+
String get actionSheetOptionHideMutedMessage => 'Hide muted message again';
111+
109112
@override
110113
String get actionSheetOptionShare => 'Zdielať';
111114

@@ -664,6 +667,12 @@ class ZulipLocalizationsSk extends ZulipLocalizations {
664667
@override
665668
String get noEarlierMessages => 'No earlier messages';
666669

670+
@override
671+
String get mutedSender => 'Muted sender';
672+
673+
@override
674+
String get revealButtonLabel => 'Reveal message for muted sender';
675+
667676
@override
668677
String get scrollToBottomTooltip => 'Scroll to bottom';
669678

lib/widgets/action_sheet.dart

+30
Original file line numberDiff line numberDiff line change
@@ -562,13 +562,18 @@ void showMessageActionSheet({required BuildContext context, required Message mes
562562
final markAsUnreadSupported = store.zulipFeatureLevel >= 155; // TODO(server-6)
563563
final showMarkAsUnreadButton = markAsUnreadSupported && isMessageRead;
564564

565+
final isSenderMuted = store.isUserMuted(message.senderId);
566+
565567
final optionButtons = [
566568
ReactionButtons(message: message, pageContext: pageContext),
567569
StarButton(message: message, pageContext: pageContext),
568570
if (isComposeBoxOffered)
569571
QuoteAndReplyButton(message: message, pageContext: pageContext),
570572
if (showMarkAsUnreadButton)
571573
MarkAsUnreadButton(message: message, pageContext: pageContext),
574+
if (isSenderMuted)
575+
HideMutedMessageButton(message: message, pageContext: pageContext,
576+
messageContext: context),
572577
CopyMessageTextButton(message: message, pageContext: pageContext),
573578
CopyMessageLinkButton(message: message, pageContext: pageContext),
574579
ShareButton(message: message, pageContext: pageContext),
@@ -883,6 +888,31 @@ class MarkAsUnreadButton extends MessageActionSheetMenuItemButton {
883888
}
884889
}
885890

891+
class HideMutedMessageButton extends MessageActionSheetMenuItemButton {
892+
HideMutedMessageButton({
893+
super.key,
894+
required super.message,
895+
required super.pageContext,
896+
required this.messageContext,
897+
});
898+
899+
final BuildContext messageContext;
900+
901+
@override
902+
IconData get icon => ZulipIcons.eye_off;
903+
904+
@override
905+
String label(ZulipLocalizations zulipLocalizations) {
906+
return zulipLocalizations.actionSheetOptionHideMutedMessage;
907+
}
908+
909+
@override
910+
void onPressed() {
911+
if (!messageContext.mounted) return;
912+
PossibleMutedMessage.of(messageContext).changeMuteStatus(true);
913+
}
914+
}
915+
886916
class CopyMessageTextButton extends MessageActionSheetMenuItemButton {
887917
CopyMessageTextButton({super.key, required super.message, required super.pageContext});
888918

lib/widgets/content.dart

+29-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import '../model/binding.dart';
1616
import '../model/content.dart';
1717
import '../model/internal_link.dart';
1818
import 'code_block.dart';
19+
import 'color.dart';
1920
import 'dialog.dart';
2021
import 'icons.dart';
2122
import 'inset_shadow.dart';
@@ -24,6 +25,7 @@ import 'message_list.dart';
2425
import 'poll.dart';
2526
import 'store.dart';
2627
import 'text.dart';
28+
import 'theme.dart';
2729

2830
/// A central place for styles for Zulip content (rendered Zulip Markdown).
2931
///
@@ -1565,18 +1567,44 @@ class Avatar extends StatelessWidget {
15651567
required this.userId,
15661568
required this.size,
15671569
required this.borderRadius,
1570+
this.showAsMuted = false,
15681571
});
15691572

15701573
final int userId;
15711574
final double size;
15721575
final double borderRadius;
1576+
final bool showAsMuted;
15731577

15741578
@override
15751579
Widget build(BuildContext context) {
15761580
return AvatarShape(
15771581
size: size,
15781582
borderRadius: borderRadius,
1579-
child: AvatarImage(userId: userId, size: size));
1583+
child: showAsMuted
1584+
? AvatarPlaceholder(
1585+
// Scale the icon proportionally to match the Figma design.
1586+
iconSize: size * 20 / 32
1587+
)
1588+
: AvatarImage(userId: userId, size: size));
1589+
}
1590+
}
1591+
1592+
/// A placeholder avatar for muted users.
1593+
///
1594+
/// Wrap this with [AvatarShape].
1595+
class AvatarPlaceholder extends StatelessWidget {
1596+
const AvatarPlaceholder({super.key, this.iconSize});
1597+
1598+
final double? iconSize;
1599+
1600+
@override
1601+
Widget build(BuildContext context) {
1602+
final designVariables = DesignVariables.of(context);
1603+
return DecoratedBox(
1604+
decoration: BoxDecoration(
1605+
color: designVariables.grey250.withFadedAlpha(0.5)),
1606+
child: Icon(ZulipIcons.person, size: iconSize,
1607+
color: designVariables.grey550.withFadedAlpha(0.5)));
15801608
}
15811609
}
15821610

0 commit comments

Comments
 (0)