Skip to content

Commit

Permalink
msglist: In single-conversation view, make recipient headers not tapp…
Browse files Browse the repository at this point in the history
…able.

Fixes: zulip#1171
  • Loading branch information
lakshya1goel committed Jan 29, 2025
1 parent ee7b42a commit f66dcd8
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 6 deletions.
22 changes: 16 additions & 6 deletions lib/widgets/message_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1108,9 +1108,14 @@ class StreamMessageRecipientHeader extends StatelessWidget {
]));

return GestureDetector(
onTap: () => Navigator.push(context,
MessageListPage.buildRoute(context: context,
narrow: TopicNarrow.ofMessage(message))),
// 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,
channelId: message.streamId, topic: topic),
child: ColoredBox(
Expand Down Expand Up @@ -1157,9 +1162,14 @@ class DmRecipientHeader extends StatelessWidget {
final messageListTheme = MessageListTheme.of(context);

return GestureDetector(
onTap: () => Navigator.push(context,
MessageListPage.buildRoute(context: context,
narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))),
// 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(
color: messageListTheme.dmRecipientHeaderBg,
child: Padding(
Expand Down
88 changes: 88 additions & 0 deletions test/widgets/message_list_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,54 @@ 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 = <Route<void>>[];
final navObserver = TestNavigatorObserver()
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
final channel = eg.stream();
final message = eg.streamMessage(stream: channel, topic: 'topic name');
await setupMessageListPage(tester,
narrow: ChannelNarrow(channel.streamId),
streams: [channel],
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('topic name')));
await tester.pump();
check(pushedRoutes).single.isA<WidgetRoute>().page.isA<MessageListPage>()
.initNarrow.equals(TopicNarrow.ofMessage(message));
await tester.pumpAndSettle();
});

testWidgets('does not navigate on tapping topic in TopicNarrow', (tester) async {
final pushedRoutes = <Route<void>>[];
final navObserver = TestNavigatorObserver()
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
final channel = eg.stream();
final message = eg.streamMessage(stream: channel, topic: 'topic name');
await setupMessageListPage(tester,
narrow: TopicNarrow.ofMessage(message),
streams: [channel],
messages: [message],
navObservers: [navObserver]);

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', () {
Expand Down Expand Up @@ -988,6 +1036,46 @@ void main() {
tester.widget(find.textContaining(RegExp("Dec 1[89], 2022")));
tester.widget(find.textContaining(RegExp("Aug 2[23], 2022")));
});

testWidgets('navigates to DmNarrow on tapping recipient header in CombinedFeedNarrow', (tester) async {
final pushedRoutes = <Route<void>>[];
final navObserver = TestNavigatorObserver()
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
final dmMessage = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser]);
await setupMessageListPage(tester,
narrow: const CombinedFeedNarrow(),
messages: [dmMessage],
navObservers: [navObserver]);

assert(pushedRoutes.length == 1);
pushedRoutes.clear();

connection.prepare(json: eg.newestGetMessagesResult(
foundOldest: true, messages: [dmMessage]).toJson());
await tester.tap(find.byType(DmRecipientHeader));
await tester.pump();
check(pushedRoutes).single.isA<WidgetRoute>().page.isA<MessageListPage>()
.initNarrow.equals(DmNarrow.withUser(eg.otherUser.userId, selfUserId: eg.selfUser.userId));
await tester.pumpAndSettle();
});

testWidgets('does not navigate on tapping recipient header in DmNarrow', (tester) async {
final pushedRoutes = <Route<void>>[];
final navObserver = TestNavigatorObserver()
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
final dmMessage = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser]);
await setupMessageListPage(tester,
narrow: DmNarrow.withUser(eg.otherUser.userId, selfUserId: eg.selfUser.userId),
messages: [dmMessage],
navObservers: [navObserver]);

assert(pushedRoutes.length == 1);
pushedRoutes.clear();

await tester.tap(find.byType(DmRecipientHeader));
await tester.pump();
check(pushedRoutes).isEmpty();
});
});

group('formatHeaderDate', () {
Expand Down

0 comments on commit f66dcd8

Please sign in to comment.