Skip to content

Commit 14697c4

Browse files
committed
msglist: Distinguish isBot: true users with a bot marker
Fixes: #156
1 parent 13f2427 commit 14697c4

File tree

3 files changed

+59
-3
lines changed

3 files changed

+59
-3
lines changed

lib/widgets/message_list.dart

Lines changed: 11 additions & 0 deletions
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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ User user({
6060
String? email,
6161
String? fullName,
6262
bool? isActive,
63+
bool? isBot,
6364
String? avatarUrl,
6465
Map<int, ProfileFieldUserData>? profileData,
6566
}) {
@@ -74,7 +75,7 @@ User user({
7475
isAdmin: false,
7576
isGuest: false,
7677
isBillingAdmin: false,
77-
isBot: false,
78+
isBot: isBot ?? false,
7879
botType: null,
7980
botOwnerId: null,
8081
role: UserRole.member,

test/widgets/message_list_test.dart

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'dart:convert';
2-
import 'dart:io';
32

43
import 'package:checks/checks.dart';
54
import 'package:flutter/material.dart';
@@ -28,8 +27,8 @@ import '../model/test_store.dart';
2827
import '../flutter_checks.dart';
2928
import '../model/unreads_checks.dart';
3029
import '../stdlib_checks.dart';
31-
import '../test_images.dart';
3230
import 'content_checks.dart';
31+
import 'content_test.dart';
3332
import 'dialog_checks.dart';
3433

3534
void main() {
@@ -44,6 +43,7 @@ void main() {
4443
int? messageCount,
4544
List<Message>? messages,
4645
List<ZulipStream>? streams,
46+
List<User>? users,
4747
List<Subscription>? subscriptions,
4848
UnreadMessagesSnapshot? unreadMsgs,
4949
}) async {
@@ -56,6 +56,7 @@ void main() {
5656

5757
// prepare message list data
5858
store.addUser(eg.selfUser);
59+
store.addUsers(users ?? []);
5960
assert((messageCount == null) != (messages == null));
6061
messages ??= List.generate(messageCount!, (index) {
6162
return eg.streamMessage(sender: eg.selfUser);
@@ -480,6 +481,49 @@ void main() {
480481

481482
debugNetworkImageHttpClientProvider = null;
482483
});
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({required 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(user: users[0], isBot: true);
522+
checkUser(user: users[1], isBot: false);
523+
checkUser(user: users[2], isBot: false);
524+
525+
debugNetworkImageHttpClientProvider = null;
526+
});
483527
});
484528

485529
group('Starred messages', () {

0 commit comments

Comments
 (0)