Skip to content

Commit 8c0f9ae

Browse files
committed
msglist: Distinguish isBot: true message senders with a bot marker
Fixes: #156
1 parent 5c47233 commit 8c0f9ae

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

lib/widgets/message_list.dart

+11
Original file line numberDiff line numberDiff line change
@@ -896,7 +896,10 @@ class MessageWithPossibleSender extends StatelessWidget {
896896

897897
@override
898898
Widget build(BuildContext context) {
899+
final store = PerAccountStoreWidget.of(context);
900+
899901
final message = item.message;
902+
final sender = store.users[message.senderId];
900903

901904
Widget? senderRow;
902905
if (item.showSender) {
@@ -926,6 +929,14 @@ class MessageWithPossibleSender extends StatelessWidget {
926929
).merge(weightVariableTextStyle(context, wght: 600,
927930
wghtIfPlatformRequestsBold: 900)),
928931
overflow: TextOverflow.ellipsis)),
932+
if (sender?.isBot ?? false) ...[
933+
const SizedBox(width: 5),
934+
const Icon(
935+
ZulipIcons.bot,
936+
size: 15,
937+
color: Color.fromARGB(255, 159, 173, 173),
938+
),
939+
],
929940
]))),
930941
const SizedBox(width: 4),
931942
Text(time,

test/example_data.dart

+2-1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ User user({
7575
String? email,
7676
String? fullName,
7777
bool? isActive,
78+
bool? isBot,
7879
String? avatarUrl,
7980
Map<int, ProfileFieldUserData>? profileData,
8081
}) {
@@ -89,7 +90,7 @@ User user({
8990
isAdmin: false,
9091
isGuest: false,
9192
isBillingAdmin: false,
92-
isBot: false,
93+
isBot: isBot ?? false,
9394
botType: null,
9495
botOwnerId: null,
9596
role: UserRole.member,

test/widgets/message_list_test.dart

+45
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void main() {
4343
int? messageCount,
4444
List<Message>? messages,
4545
List<ZulipStream>? streams,
46+
List<User>? users,
4647
List<Subscription>? subscriptions,
4748
UnreadMessagesSnapshot? unreadMsgs,
4849
}) async {
@@ -55,6 +56,7 @@ void main() {
5556

5657
// prepare message list data
5758
store.addUser(eg.selfUser);
59+
store.addUsers(users ?? []);
5860
assert((messageCount == null) != (messages == null));
5961
messages ??= List.generate(messageCount!, (index) {
6062
return eg.streamMessage(sender: eg.selfUser);
@@ -479,6 +481,49 @@ void main() {
479481

480482
debugNetworkImageHttpClientProvider = null;
481483
});
484+
485+
testWidgets('Bot user is distinguished by showing an icon', (tester) async {
486+
// When using this function, provide only one bot user
487+
// to [PerAccountStore] through [setupMessageListPage] function.
488+
void checkUser(User user, {required bool isBot}) {
489+
final nameFinder = find.text(user.fullName);
490+
final botFinder = find.byIcon(ZulipIcons.bot);
491+
492+
check(nameFinder.evaluate().singleOrNull).isNotNull();
493+
check(botFinder.evaluate().singleOrNull).isNotNull();
494+
495+
final userFinder = find.ancestor(
496+
of: nameFinder,
497+
matching: find.ancestor(
498+
of: botFinder,
499+
matching: find.byType(Row),
500+
));
501+
502+
isBot
503+
? check(userFinder.evaluate()).isNotEmpty()
504+
: check(userFinder.evaluate()).isEmpty();
505+
}
506+
507+
prepareBoringImageHttpClient();
508+
509+
final users = [
510+
eg.user(fullName: 'User 1', isBot: true),
511+
eg.user(fullName: 'User 2', isBot: false),
512+
eg.user(fullName: 'User 3', isBot: false),
513+
];
514+
515+
await setupMessageListPage(
516+
tester,
517+
messages: users.map((user) => eg.streamMessage(sender: user)).toList(),
518+
users: users,
519+
);
520+
521+
checkUser(users[0], isBot: true);
522+
checkUser(users[1], isBot: false);
523+
checkUser(users[2], isBot: false);
524+
525+
debugNetworkImageHttpClientProvider = null;
526+
});
482527
});
483528

484529
group('Starred messages', () {

0 commit comments

Comments
 (0)