Skip to content

Commit eb6a565

Browse files
committed
msglist: In single-conversation view, make recipient headers not tappable.
Updated onTap for recipient headers in single-conversation view. Adjusted GestureDetector logic to conditionally enable navigation. Simplified ColoredBox structure for non-tappable recipient headers. Improves user experience by removing unnecessary tap interactions. Fixes: zulip#1171
1 parent d9f88f3 commit eb6a565

File tree

2 files changed

+72
-7
lines changed

2 files changed

+72
-7
lines changed

lib/widgets/message_list.dart

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -896,11 +896,14 @@ class RecipientHeader extends StatelessWidget {
896896

897897
@override
898898
Widget build(BuildContext context) {
899+
final isTopicNarrow = narrow is TopicNarrow;
900+
final isDmNarrow = narrow is DmNarrow;
899901
final message = this.message;
900902
return switch (message) {
901903
StreamMessage() => StreamMessageRecipientHeader(message: message,
902-
showStream: _containsDifferentChannels(narrow)),
903-
DmMessage() => DmRecipientHeader(message: message),
904+
showStream: _containsDifferentChannels(narrow),
905+
isTopicNarrow: isTopicNarrow),
906+
DmMessage() => DmRecipientHeader(message: message, isDmNarrow: isDmNarrow),
904907
};
905908
}
906909
}
@@ -1015,10 +1018,12 @@ class StreamMessageRecipientHeader extends StatelessWidget {
10151018
super.key,
10161019
required this.message,
10171020
required this.showStream,
1021+
required this.isTopicNarrow,
10181022
});
10191023

10201024
final StreamMessage message;
10211025
final bool showStream;
1026+
final bool isTopicNarrow;
10221027

10231028
@override
10241029
Widget build(BuildContext context) {
@@ -1105,9 +1110,9 @@ class StreamMessageRecipientHeader extends StatelessWidget {
11051110
]));
11061111

11071112
return GestureDetector(
1108-
onTap: () => Navigator.push(context,
1113+
onTap: () => !isTopicNarrow? Navigator.push(context,
11091114
MessageListPage.buildRoute(context: context,
1110-
narrow: TopicNarrow.ofMessage(message))),
1115+
narrow: TopicNarrow.ofMessage(message))): null,
11111116
onLongPress: () => showTopicActionSheet(context,
11121117
channelId: message.streamId, topic: topic),
11131118
child: ColoredBox(
@@ -1126,9 +1131,10 @@ class StreamMessageRecipientHeader extends StatelessWidget {
11261131
}
11271132

11281133
class DmRecipientHeader extends StatelessWidget {
1129-
const DmRecipientHeader({super.key, required this.message});
1134+
const DmRecipientHeader({super.key, required this.message, required this.isDmNarrow});
11301135

11311136
final DmMessage message;
1137+
final bool isDmNarrow;
11321138

11331139
@override
11341140
Widget build(BuildContext context) {
@@ -1149,9 +1155,9 @@ class DmRecipientHeader extends StatelessWidget {
11491155
final messageListTheme = MessageListTheme.of(context);
11501156

11511157
return GestureDetector(
1152-
onTap: () => Navigator.push(context,
1158+
onTap: () => !isDmNarrow? Navigator.push(context,
11531159
MessageListPage.buildRoute(context: context,
1154-
narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))),
1160+
narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))): null,
11551161
child: ColoredBox(
11561162
color: messageListTheme.dmRecipientHeaderBg,
11571163
child: Padding(

test/widgets/message_list_test.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,37 @@ void main() {
922922
await tester.pump();
923923
tester.widget(find.text('new stream name'));
924924
});
925+
926+
testWidgets('does not navigate on tapping topic in TopicNarrow', (tester) async {
927+
final pushedRoutes = <Route<void>>[];
928+
final navObserver = TestNavigatorObserver()
929+
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
930+
931+
final channel = eg.stream(name: 'stream name');
932+
final msg = eg.streamMessage(stream: channel, topic: 'topic name');
933+
934+
await setupMessageListPage(
935+
tester,
936+
narrow: TopicNarrow(channel.streamId, 'topic name'),
937+
navObservers: [navObserver],
938+
streams: [channel],
939+
messages: [msg],
940+
);
941+
942+
assert(pushedRoutes.length == 1);
943+
pushedRoutes.clear();
944+
945+
final topicFinder = find.descendant(
946+
of: find.byType(StreamMessageRecipientHeader),
947+
matching: find.text('topic name'),
948+
);
949+
950+
expect(topicFinder.evaluate().length, equals(1));
951+
await tester.tap(topicFinder);
952+
await tester.pumpAndSettle();
953+
954+
expect(pushedRoutes.length, equals(0));
955+
});
925956
});
926957

927958
group('DmRecipientHeader', () {
@@ -987,6 +1018,34 @@ void main() {
9871018
tester.widget(find.textContaining(RegExp("Dec 1[89], 2022")));
9881019
tester.widget(find.textContaining(RegExp("Aug 2[23], 2022")));
9891020
});
1021+
1022+
testWidgets('does not navigate on tapping recipient header in DmNarrow', (tester) async {
1023+
final pushedRoutes = <Route<void>>[];
1024+
final navObserver = TestNavigatorObserver()
1025+
..onPushed = (route, prevRoute) => pushedRoutes.add(route);
1026+
1027+
final dmMessage = eg.dmMessage(from: eg.selfUser, to: [eg.otherUser]);
1028+
1029+
await setupMessageListPage(
1030+
tester,
1031+
narrow: DmNarrow.withUser(eg.otherUser.userId, selfUserId: eg.selfUser.userId),
1032+
navObservers: [navObserver],
1033+
messages: [dmMessage],
1034+
);
1035+
1036+
assert(pushedRoutes.length == 1);
1037+
1038+
pushedRoutes.clear();
1039+
1040+
final recipientHeaderFinder = find.byType(DmRecipientHeader);
1041+
1042+
expect(recipientHeaderFinder.evaluate().length, equals(1));
1043+
1044+
await tester.tap(recipientHeaderFinder);
1045+
await tester.pumpAndSettle();
1046+
1047+
expect(pushedRoutes.length, equals(0));
1048+
});
9901049
});
9911050

9921051
group('formatHeaderDate', () {

0 commit comments

Comments
 (0)