Skip to content

Commit 8cce71c

Browse files
committed
profile: Distinguish muted users in custom profile fields of type User
1 parent b975783 commit 8cce71c

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

lib/widgets/profile.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ class _UserWidget extends StatelessWidget {
263263
@override
264264
Widget build(BuildContext context) {
265265
final store = PerAccountStoreWidget.of(context);
266+
final localizations = ZulipLocalizations.of(context);
267+
final isMuted = store.isUserMuted(userId);
266268
return InkWell(
267269
onTap: () => Navigator.push(context,
268270
ProfilePage.buildRoute(context: context,
@@ -271,10 +273,12 @@ class _UserWidget extends StatelessWidget {
271273
padding: const EdgeInsets.all(8),
272274
child: Row(children: [
273275
// TODO(#196) render active status
274-
Avatar(userId: userId, size: 32, borderRadius: 32 / 8),
276+
Avatar(userId: userId, size: 32, borderRadius: 32 / 8,
277+
showAsMuted: isMuted),
275278
const SizedBox(width: 8),
276279
Expanded(
277-
child: Text(store.userDisplayName(userId),
280+
child: Text(
281+
isMuted ? localizations.mutedUser : store.userDisplayName(userId),
278282
style: _TextStyles.customProfileFieldText)),
279283
])));
280284
}

test/widgets/profile_test.dart

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
import 'package:checks/checks.dart';
22
import 'package:flutter/material.dart';
3+
import 'package:flutter_checks/flutter_checks.dart';
34
import 'package:flutter_test/flutter_test.dart';
45
import 'package:url_launcher/url_launcher.dart';
56
import 'package:zulip/api/model/initial_snapshot.dart';
67
import 'package:zulip/api/model/model.dart';
8+
import 'package:zulip/model/localizations.dart';
79
import 'package:zulip/model/narrow.dart';
10+
import 'package:zulip/model/store.dart';
811
import 'package:zulip/widgets/content.dart';
12+
import 'package:zulip/widgets/icons.dart';
913
import 'package:zulip/widgets/message_list.dart';
1014
import 'package:zulip/widgets/page.dart';
1115
import 'package:zulip/widgets/profile.dart';
1216

1317
import '../example_data.dart' as eg;
1418
import '../model/binding.dart';
1519
import '../model/test_store.dart';
20+
import '../test_images.dart';
1621
import '../test_navigation.dart';
1722
import 'message_list_checks.dart';
1823
import 'page_checks.dart';
1924
import 'profile_page_checks.dart';
2025
import 'test_app.dart';
2126

27+
late PerAccountStore store;
28+
2229
Future<void> setupPage(WidgetTester tester, {
2330
required int pageUserId,
2431
List<User>? users,
32+
List<int>? mutedUserIds,
2533
List<CustomProfileField>? customProfileFields,
2634
Map<String, RealmDefaultExternalAccount>? realmDefaultExternalAccounts,
2735
NavigatorObserver? navigatorObserver,
@@ -32,12 +40,13 @@ Future<void> setupPage(WidgetTester tester, {
3240
customProfileFields: customProfileFields,
3341
realmDefaultExternalAccounts: realmDefaultExternalAccounts);
3442
await testBinding.globalStore.add(eg.selfAccount, initialSnapshot);
35-
final store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
43+
store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
3644

3745
await store.addUser(eg.selfUser);
3846
if (users != null) {
3947
await store.addUsers(users);
4048
}
49+
await store.muteUsers(mutedUserIds ?? []);
4150

4251
await tester.pumpWidget(TestZulipApp(
4352
accountId: eg.selfAccount.id,
@@ -276,6 +285,42 @@ void main() {
276285
.deepEquals([1, 2, 3]);
277286
});
278287

288+
testWidgets('page builds; muted user displayed as muted', (tester) async {
289+
Finder avatarFinder(String url) => find.descendant(
290+
of: find.byType(AvatarShape),
291+
matching: find.byWidgetPredicate((widget) => switch(widget) {
292+
RealmContentNetworkImage(:final src) => src == store.realmUrl.resolve(url),
293+
_ => false,
294+
}));
295+
296+
final users = [
297+
eg.user(userId: 1, profileData: {
298+
0: ProfileFieldUserData(value: '[2,3]'),
299+
}),
300+
eg.user(userId: 2, fullName: 'test user2', avatarUrl: '/foo.png'),
301+
eg.user(userId: 3, fullName: 'test user3', avatarUrl: '/bar.png'),
302+
];
303+
304+
prepareBoringImageHttpClient();
305+
306+
await setupPage(tester,
307+
users: users,
308+
mutedUserIds: [2],
309+
pageUserId: 1,
310+
customProfileFields: [mkCustomProfileField(0, CustomProfileFieldType.user)],
311+
);
312+
313+
final localizations = GlobalLocalizations.zulipLocalizations;
314+
check(find.text(localizations.mutedUser)).findsOne();
315+
check(find.byIcon(ZulipIcons.person)).findsOne();
316+
check(avatarFinder('/foo.png')).findsNothing();
317+
318+
check(find.text('test user3')).findsOne();
319+
check(avatarFinder('/bar.png')).findsOne();
320+
321+
debugNetworkImageHttpClientProvider = null;
322+
});
323+
279324
testWidgets('page builds; ensure long name does not overflow', (tester) async {
280325
final longString = 'X' * 400;
281326
final user = eg.user(userId: 1, fullName: longString);

0 commit comments

Comments
 (0)