Skip to content

Commit a671aee

Browse files
committed
msglist: In single-conversation view, make recipient headers not tappable.
Fixes: #1171
1 parent d9f88f3 commit a671aee

File tree

2 files changed

+69
-7
lines changed

2 files changed

+69
-7
lines changed

lib/widgets/message_list.dart

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -899,8 +899,9 @@ class RecipientHeader extends StatelessWidget {
899899
final message = this.message;
900900
return switch (message) {
901901
StreamMessage() => StreamMessageRecipientHeader(message: message,
902-
showStream: _containsDifferentChannels(narrow)),
903-
DmMessage() => DmRecipientHeader(message: message),
902+
showStream: _containsDifferentChannels(narrow),
903+
inTopicNarrow: narrow is TopicNarrow),
904+
DmMessage() => DmRecipientHeader(message: message, inDmNarrow: narrow is DmNarrow),
904905
};
905906
}
906907
}
@@ -1015,10 +1016,12 @@ class StreamMessageRecipientHeader extends StatelessWidget {
10151016
super.key,
10161017
required this.message,
10171018
required this.showStream,
1019+
required this.inTopicNarrow,
10181020
});
10191021

10201022
final StreamMessage message;
10211023
final bool showStream;
1024+
final bool inTopicNarrow;
10221025

10231026
@override
10241027
Widget build(BuildContext context) {
@@ -1105,9 +1108,9 @@ class StreamMessageRecipientHeader extends StatelessWidget {
11051108
]));
11061109

11071110
return GestureDetector(
1108-
onTap: () => Navigator.push(context,
1111+
onTap: !inTopicNarrow ? () => Navigator.push(context,
11091112
MessageListPage.buildRoute(context: context,
1110-
narrow: TopicNarrow.ofMessage(message))),
1113+
narrow: TopicNarrow.ofMessage(message))) : null,
11111114
onLongPress: () => showTopicActionSheet(context,
11121115
channelId: message.streamId, topic: topic),
11131116
child: ColoredBox(
@@ -1126,9 +1129,10 @@ class StreamMessageRecipientHeader extends StatelessWidget {
11261129
}
11271130

11281131
class DmRecipientHeader extends StatelessWidget {
1129-
const DmRecipientHeader({super.key, required this.message});
1132+
const DmRecipientHeader({super.key, required this.message, required this.inDmNarrow});
11301133

11311134
final DmMessage message;
1135+
final bool inDmNarrow;
11321136

11331137
@override
11341138
Widget build(BuildContext context) {
@@ -1149,9 +1153,9 @@ class DmRecipientHeader extends StatelessWidget {
11491153
final messageListTheme = MessageListTheme.of(context);
11501154

11511155
return GestureDetector(
1152-
onTap: () => Navigator.push(context,
1156+
onTap: !inDmNarrow ? () => Navigator.push(context,
11531157
MessageListPage.buildRoute(context: context,
1154-
narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))),
1158+
narrow: DmNarrow.ofMessage(message, selfUserId: store.selfUserId))) : null,
11551159
child: ColoredBox(
11561160
color: messageListTheme.dmRecipientHeaderBg,
11571161
child: Padding(

test/widgets/message_list_test.dart

Lines changed: 58 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,33 @@ 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+
pushedRoutes.clear();
1038+
1039+
final recipientHeaderFinder = find.byType(DmRecipientHeader);
1040+
1041+
expect(recipientHeaderFinder.evaluate().length, equals(1));
1042+
1043+
await tester.tap(recipientHeaderFinder);
1044+
await tester.pumpAndSettle();
1045+
1046+
expect(pushedRoutes.length, equals(0));
1047+
});
9901048
});
9911049

9921050
group('formatHeaderDate', () {

0 commit comments

Comments
 (0)