Skip to content

Commit 46dbe1e

Browse files
committed
lightbox: Use senderDisplayName for sender's name
Related: #716
1 parent e4db89d commit 46dbe1e

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

lib/widgets/lightbox.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ class _LightboxPageLayoutState extends State<_LightboxPageLayout> {
166166

167167
@override
168168
Widget build(BuildContext context) {
169+
final store = PerAccountStoreWidget.of(context);
169170
final themeData = Theme.of(context);
170171

171172
final appBarBackgroundColor = Colors.grey.shade900.withValues(alpha: 0.87);
@@ -200,7 +201,7 @@ class _LightboxPageLayoutState extends State<_LightboxPageLayout> {
200201
child: RichText(
201202
text: TextSpan(children: [
202203
TextSpan(
203-
text: '${widget.message.senderFullName}\n', // TODO(#716): use `store.senderDisplayName`
204+
text: '${store.senderDisplayName(widget.message)}\n',
204205

205206
// Restate default
206207
style: themeData.textTheme.titleLarge!.copyWith(color: appBarForegroundColor)),

test/widgets/lightbox_test.dart

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
99
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
1010
import 'package:video_player_platform_interface/video_player_platform_interface.dart';
1111
import 'package:video_player/video_player.dart';
12+
import 'package:zulip/api/model/events.dart';
1213
import 'package:zulip/api/model/model.dart';
1314
import 'package:zulip/model/localizations.dart';
1415
import 'package:zulip/model/narrow.dart';
@@ -204,6 +205,8 @@ class FakeVideoPlayerPlatform extends Fake
204205
void main() {
205206
TestZulipBinding.ensureInitialized();
206207

208+
late PerAccountStore store;
209+
207210
group('LightboxHero', () {
208211
late PerAccountStore store;
209212
late FakeApiConnection connection;
@@ -316,10 +319,16 @@ void main() {
316319

317320
Future<void> setupPage(WidgetTester tester, {
318321
Message? message,
322+
List<User>? users,
319323
required Uri? thumbnailUrl,
320324
}) async {
321325
addTearDown(testBinding.reset);
322326
await testBinding.globalStore.add(eg.selfAccount, eg.initialSnapshot());
327+
store = await testBinding.globalStore.perAccount(eg.selfAccount.id);
328+
329+
if (users != null) {
330+
await store.addUsers(users);
331+
}
323332

324333
// ZulipApp instead of TestZulipApp because we need the navigator to push
325334
// the lightbox route. The lightbox page works together with the route;
@@ -351,20 +360,41 @@ void main() {
351360
debugNetworkImageHttpClientProvider = null;
352361
});
353362

354-
testWidgets('app bar shows sender name and date', (tester) async {
355-
prepareBoringImageHttpClient();
356-
final timestamp = DateTime.parse("2024-07-23 23:12:24").millisecondsSinceEpoch ~/ 1000;
357-
final message = eg.streamMessage(sender: eg.otherUser, timestamp: timestamp);
358-
await setupPage(tester, message: message, thumbnailUrl: null);
359-
360-
// We're looking for a RichText, in the app bar, with both the
361-
// sender's name and the timestamp.
363+
void checkAppBarNameAndDate(WidgetTester tester, String expectedName, String expectedDate) {
362364
final labelTextWidget = tester.widget<RichText>(
363365
find.descendant(of: find.byType(AppBar).last,
364-
matching: find.textContaining(findRichText: true,
365-
eg.otherUser.fullName)));
366+
matching: find.textContaining(findRichText: true, expectedName)));
366367
check(labelTextWidget.text.toPlainText())
367-
.contains('Jul 23, 2024 23:12:24');
368+
.contains(expectedDate);
369+
}
370+
371+
testWidgets('app bar shows sender name and date; updates when name changes', (tester) async {
372+
prepareBoringImageHttpClient();
373+
final timestamp = DateTime.parse("2024-07-23 23:12:24").millisecondsSinceEpoch ~/ 1000;
374+
final sender = eg.user(fullName: 'Old name');
375+
final message = eg.streamMessage(sender: sender, timestamp: timestamp);
376+
await setupPage(tester, message: message, thumbnailUrl: null, users: [sender]);
377+
check(store.getUser(sender.userId)).isNotNull();
378+
379+
checkAppBarNameAndDate(tester, 'Old name', 'Jul 23, 2024 23:12:24');
380+
381+
await store.handleEvent(RealmUserUpdateEvent(id: 1,
382+
userId: sender.userId, fullName: 'New name'));
383+
await tester.pump();
384+
checkAppBarNameAndDate(tester, 'New name', 'Jul 23, 2024 23:12:24');
385+
386+
debugNetworkImageHttpClientProvider = null;
387+
});
388+
389+
testWidgets('app bar shows sender name and date; unknown sender', (tester) async {
390+
prepareBoringImageHttpClient();
391+
final timestamp = DateTime.parse("2024-07-23 23:12:24").millisecondsSinceEpoch ~/ 1000;
392+
final sender = eg.user(fullName: 'Sender name');
393+
final message = eg.streamMessage(sender: sender, timestamp: timestamp);
394+
await setupPage(tester, message: message, thumbnailUrl: null, users: []);
395+
check(store.getUser(sender.userId)).isNull();
396+
397+
checkAppBarNameAndDate(tester, 'Sender name', 'Jul 23, 2024 23:12:24');
368398

369399
debugNetworkImageHttpClientProvider = null;
370400
});

0 commit comments

Comments
 (0)