From 7ade40fba666e45674123e677d750e6cacd84697 Mon Sep 17 00:00:00 2001 From: lakshya1goel Date: Fri, 24 Jan 2025 14:17:27 +0530 Subject: [PATCH] msglist: In single-conversation view, make recipient headers not tappable. Fixes: #1171 --- lib/widgets/message_list.dart | 16 ++++++++-- test/widgets/message_list_test.dart | 47 +++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lib/widgets/message_list.dart b/lib/widgets/message_list.dart index 7c3d1dfb57c..0b6216e8f7b 100644 --- a/lib/widgets/message_list.dart +++ b/lib/widgets/message_list.dart @@ -1108,7 +1108,13 @@ class StreamMessageRecipientHeader extends StatelessWidget { ])); return GestureDetector( - onTap: () => Navigator.push(context, + // When already in a topic narrow, disable tap interaction that would just + // push a MessageListPage for the same topic narrow. + // TODO(#1039) simplify by removing topic-narrow condition if we remove + // recipient headers in topic narrows + onTap: (narrow is TopicNarrow) + ? null + : () => Navigator.push(context, MessageListPage.buildRoute(context: context, narrow: TopicNarrow.ofMessage(message))), onLongPress: () => showTopicActionSheet(context, @@ -1157,7 +1163,13 @@ class DmRecipientHeader extends StatelessWidget { final messageListTheme = MessageListTheme.of(context); return GestureDetector( - onTap: () => Navigator.push(context, + // When already in a DM narrow, disable tap interaction that would just + // push a MessageListPage for the same DM narrow. + // TODO(#1244) simplify by removing DM-narrow condition if we remove + // recipient headers in DM narrows + onTap: (narrow is DmNarrow) + ? null + : () => Navigator.push(context, MessageListPage.buildRoute(context: context, narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))), child: ColoredBox( diff --git a/test/widgets/message_list_test.dart b/test/widgets/message_list_test.dart index aadb2ffc770..72b6de3603f 100644 --- a/test/widgets/message_list_test.dart +++ b/test/widgets/message_list_test.dart @@ -923,6 +923,53 @@ void main() { await tester.pump(); tester.widget(find.text('new stream name')); }); + + testWidgets('navigates to TopicNarrow on tapping topic in ChannelNarrow', (tester) async { + final pushedRoutes = >[]; + final navObserver = TestNavigatorObserver() + ..onPushed = (route, prevRoute) => pushedRoutes.add(route); + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: ChannelNarrow(channel.streamId), + messages: [eg.streamMessage(stream: channel, topic: 'topic name')], + streams: [channel], + navObservers: [navObserver]); + + assert(pushedRoutes.length == 1); + pushedRoutes.clear(); + + connection.prepare(json: eg.newestGetMessagesResult( + foundOldest: true, messages: [message]).toJson()); + await tester.tap(find.descendant( + of: find.byType(StreamMessageRecipientHeader), + matching: find.text('topic name'))); + await tester.pumpAndSettle(); + check(pushedRoutes).single + .isA() + .page.isA() + .initNarrow.equals(TopicNarrow(channel.streamId, TopicName('topic name'))); + }); + + testWidgets('does not navigate on tapping topic in TopicNarrow', (tester) async { + final pushedRoutes = >[]; + final navObserver = TestNavigatorObserver() + ..onPushed = (route, prevRoute) => pushedRoutes.add(route); + final channel = eg.stream(); + await setupMessageListPage(tester, + narrow: TopicNarrow(channel.streamId, TopicName('topic name')), + navObservers: [navObserver], + streams: [channel], + messages: [eg.streamMessage(stream: channel, topic: 'topic name')]); + + assert(pushedRoutes.length == 1); + pushedRoutes.clear(); + + await tester.tap(find.descendant( + of: find.byType(StreamMessageRecipientHeader), + matching: find.text('topic name'))); + await tester.pump(); + check(pushedRoutes).isEmpty(); + }); }); group('DmRecipientHeader', () {