diff --git a/lib/widgets/message_list.dart b/lib/widgets/message_list.dart index 39ab1b4f04..4921237e08 100644 --- a/lib/widgets/message_list.dart +++ b/lib/widgets/message_list.dart @@ -1437,7 +1437,8 @@ class StreamMessageRecipientHeader extends StatelessWidget { streamWidget = GestureDetector( onTap: () => Navigator.push(context, MessageListPage.buildRoute(context: context, - narrow: ChannelNarrow(streamId))), + narrow: ChannelNarrow(streamId), + initAnchorMessageId: message.id)), onLongPress: () => showChannelActionSheet(context, channelId: streamId), child: Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -1495,7 +1496,8 @@ class StreamMessageRecipientHeader extends StatelessWidget { onTap: narrow is TopicNarrow ? null : () => Navigator.push(context, MessageListPage.buildRoute(context: context, - narrow: TopicNarrow.ofMessage(message))), + narrow: TopicNarrow.ofMessage(message), + initAnchorMessageId: message.id)), onLongPress: () => showTopicActionSheet(context, channelId: streamId, topic: topic, @@ -1552,7 +1554,8 @@ class DmRecipientHeader extends StatelessWidget { onTap: narrow is DmNarrow ? null : () => Navigator.push(context, MessageListPage.buildRoute(context: context, - narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))), + narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId), + initAnchorMessageId: message.id)), child: ColoredBox( color: messageListTheme.dmRecipientHeaderBg, child: Padding( diff --git a/test/widgets/message_list_checks.dart b/test/widgets/message_list_checks.dart index 6ce43a2d43..0f736466f1 100644 --- a/test/widgets/message_list_checks.dart +++ b/test/widgets/message_list_checks.dart @@ -4,4 +4,5 @@ import 'package:zulip/widgets/message_list.dart'; extension MessageListPageChecks on Subject { Subject get initNarrow => has((x) => x.initNarrow, 'initNarrow'); + Subject get initAnchorMessageId => has((x) => x.initAnchorMessageId, 'initAnchorMessageId'); } diff --git a/test/widgets/message_list_test.dart b/test/widgets/message_list_test.dart index fd8dd6f10b..b0d7d5fe81 100644 --- a/test/widgets/message_list_test.dart +++ b/test/widgets/message_list_test.dart @@ -1342,6 +1342,34 @@ void main() { tester.widget(find.text('new stream name')); }); + testWidgets('navigates to ChannelNarrow on tapping channel in CombinedFeedNarrow', (tester) async { + final pushedRoutes = >[]; + final navObserver = TestNavigatorObserver() + ..onPushed = (route, prevRoute) => pushedRoutes.add(route); + final channel = eg.stream(); + final subscription = eg.subscription(channel); + final message = eg.streamMessage(stream: channel, topic: 'topic name'); + await setupMessageListPage(tester, + narrow: CombinedFeedNarrow(), + subscriptions: [subscription], + messages: [message], + 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(channel.name))); + await tester.pump(); + check(pushedRoutes).single.isA().page.isA() + ..initNarrow.equals(ChannelNarrow(channel.streamId)) + ..initAnchorMessageId.isNotNull().equals(message.id); + await tester.pumpAndSettle(); + }); + testWidgets('navigates to TopicNarrow on tapping topic in ChannelNarrow', (tester) async { final pushedRoutes = >[]; final navObserver = TestNavigatorObserver() @@ -1364,7 +1392,8 @@ void main() { matching: find.text('topic name'))); await tester.pump(); check(pushedRoutes).single.isA().page.isA() - .initNarrow.equals(TopicNarrow.ofMessage(message)); + ..initNarrow.equals(TopicNarrow.ofMessage(message)) + ..initAnchorMessageId.isNotNull().equals(message.id); await tester.pumpAndSettle(); }); @@ -1473,7 +1502,8 @@ void main() { await tester.tap(find.byType(DmRecipientHeader)); await tester.pump(); check(pushedRoutes).single.isA().page.isA() - .initNarrow.equals(DmNarrow.withUser(eg.otherUser.userId, selfUserId: eg.selfUser.userId)); + ..initNarrow.equals(DmNarrow.withUser(eg.otherUser.userId, selfUserId: eg.selfUser.userId)) + ..initAnchorMessageId.isNotNull().equals(dmMessage.id); await tester.pumpAndSettle(); });