diff --git a/lib/widgets/inbox.dart b/lib/widgets/inbox.dart index 69421fa50e..00c17841af 100644 --- a/lib/widgets/inbox.dart +++ b/lib/widgets/inbox.dart @@ -134,12 +134,14 @@ class _InboxPageState extends State with PerAccountStoreAwareStateMix for (final MapEntry(key: streamId, value: topics) in sortedUnreadStreams) { final topicItems = <(String, int, bool, int)>[]; int countInStream = 0; + bool mentionedInStream = false; for (final MapEntry(key: topic, value: messageIds) in topics.entries) { if (!store.isTopicVisible(streamId, topic)) continue; final countInTopic = messageIds.length; final isMentioned = messageIds.any((messageId) => unreadsModel!.mentions.contains(messageId)); topicItems.add((topic, countInTopic, isMentioned, messageIds.last)); countInStream += countInTopic; + if (isMentioned) mentionedInStream = true; } if (countInStream == 0) { continue; @@ -149,7 +151,7 @@ class _InboxPageState extends State with PerAccountStoreAwareStateMix final (_, _, _, bLastUnreadId) = b; return bLastUnreadId.compareTo(aLastUnreadId); }); - sections.add(_StreamSectionData(streamId, countInStream, topicItems)); + sections.add(_StreamSectionData(streamId, countInStream, mentionedInStream, topicItems)); } return Scaffold( @@ -190,20 +192,23 @@ class _AllDmsSectionData extends _InboxSectionData { class _StreamSectionData extends _InboxSectionData { final int streamId; final int count; + final bool isMentioned; final List<(String, int, bool, int)> items; - const _StreamSectionData(this.streamId, this.count, this.items); + const _StreamSectionData(this.streamId, this.count, this.isMentioned, this.items); } abstract class _HeaderItem extends StatelessWidget { final bool collapsed; final _InboxPageState pageState; final int count; + final bool isMentioned; const _HeaderItem({ required this.collapsed, required this.pageState, required this.count, + required this.isMentioned, }); String get title; @@ -247,7 +252,7 @@ abstract class _HeaderItem extends StatelessWidget { overflow: TextOverflow.ellipsis, title))), const SizedBox(width: 12), - // TODO(#384) for streams, show @-mention indicator when it applies + if (isMentioned) const _AtMentionMarker(), Padding(padding: const EdgeInsetsDirectional.only(end: 16), child: UnreadCountBadge(backgroundColor: unreadCountBadgeBackgroundColor, bold: true, count: count)), @@ -260,6 +265,7 @@ class _AllDmsHeaderItem extends _HeaderItem { required super.collapsed, required super.pageState, required super.count, + required super.isMentioned, }); @override get title => 'Direct messages'; // TODO(i18n) @@ -290,6 +296,7 @@ class _AllDmsSection extends StatelessWidget { Widget build(BuildContext context) { final header = _AllDmsHeaderItem( count: data.count, + isMentioned: false, collapsed: collapsed, pageState: pageState, ); @@ -341,6 +348,7 @@ class _DmItem extends StatelessWidget { return StickyHeaderItem( header: _AllDmsHeaderItem( count: allDmsCount, + isMentioned: false, collapsed: false, pageState: pageState, ), @@ -382,6 +390,7 @@ class _StreamHeaderItem extends _HeaderItem { required super.collapsed, required super.pageState, required super.count, + required super.isMentioned, }); @override get title => subscription.name; @@ -420,6 +429,7 @@ class _StreamSection extends StatelessWidget { final header = _StreamHeaderItem( subscription: subscription, count: data.count, + isMentioned: data.isMentioned, collapsed: collapsed, pageState: pageState, ); @@ -435,6 +445,7 @@ class _StreamSection extends StatelessWidget { count: count, isMentioned: isMentioned, streamCount: data.count, + streamIsMentioned: data.isMentioned, pageState: pageState, ); }), @@ -449,6 +460,7 @@ class _TopicItem extends StatelessWidget { required this.count, required this.isMentioned, required this.streamCount, + required this.streamIsMentioned, required this.pageState, }); @@ -457,6 +469,7 @@ class _TopicItem extends StatelessWidget { final int count; final bool isMentioned; final int streamCount; + final bool streamIsMentioned; final _InboxPageState pageState; @override @@ -468,6 +481,7 @@ class _TopicItem extends StatelessWidget { header: _StreamHeaderItem( subscription: subscription, count: streamCount, + isMentioned: streamIsMentioned, collapsed: false, pageState: pageState, ), diff --git a/test/widgets/inbox_test.dart b/test/widgets/inbox_test.dart index 03db3b8b96..e908709a71 100644 --- a/test/widgets/inbox_test.dart +++ b/test/widgets/inbox_test.dart @@ -203,6 +203,8 @@ void main() { unreadMessages: [eg.streamMessage(stream: stream, topic: topic, flags: [MessageFlag.mentioned])]); + check(hasAtSign(tester, findStreamHeaderRow(tester, stream.streamId))) + .isTrue(); check(hasAtSign(tester, findRowByLabel(tester, topic))).isTrue(); }); @@ -213,6 +215,8 @@ void main() { unreadMessages: [eg.streamMessage(stream: stream, topic: topic, flags: [])]); + check(hasAtSign(tester, findStreamHeaderRow(tester, stream.streamId))) + .isFalse(); check(hasAtSign(tester, findRowByLabel(tester, topic))).isFalse(); }); });