Skip to content

Commit 40c06f2

Browse files
committed
user [nfc]: Factor out a getUser method
1 parent f62379a commit 40c06f2

File tree

8 files changed

+20
-13
lines changed

8 files changed

+20
-13
lines changed

lib/model/compose.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ String quoteAndReplyPlaceholder(
190190
PerAccountStore store, {
191191
required Message message,
192192
}) {
193-
final sender = store.users[message.senderId];
193+
final sender = store.getUser(message.senderId);
194194
assert(sender != null); // TODO(#716): should use `store.senderDisplayName`
195195
final url = narrowLink(store,
196196
SendableNarrow.ofMessage(message, selfUserId: store.selfUserId),
@@ -212,7 +212,7 @@ String quoteAndReply(PerAccountStore store, {
212212
required Message message,
213213
required String rawContent,
214214
}) {
215-
final sender = store.users[message.senderId];
215+
final sender = store.getUser(message.senderId);
216216
assert(sender != null); // TODO(#716): should use `store.senderDisplayName`
217217
final url = narrowLink(store,
218218
SendableNarrow.ofMessage(message, selfUserId: store.selfUserId),

lib/model/user.dart

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,14 @@ mixin UserStore {
3737
/// i.e. the account the person using this app is logged into.
3838
///
3939
/// When only the user ID is needed, see [selfUserId].
40-
User get selfUser => users[selfUserId]!;
40+
User get selfUser => getUser(selfUserId)!;
41+
42+
/// The user with the given ID, if that user is known.
43+
///
44+
/// There may be perfectly real users that are not known,
45+
/// so callers must handle that possibility.
46+
/// For details, see [users].
47+
User? getUser(int userId) => users[userId];
4148

4249
/// The name to show the given user as in the UI, even for unknown users.
4350
///
@@ -47,7 +54,7 @@ mixin UserStore {
4754
/// When a [Message] is available which the user sent,
4855
/// use [senderDisplayName] instead for a better-informed fallback.
4956
String userDisplayName(int userId) {
50-
return users[userId]?.fullName
57+
return getUser(userId)?.fullName
5158
?? GlobalLocalizations.zulipLocalizations.unknownUserName;
5259
}
5360

@@ -60,7 +67,7 @@ mixin UserStore {
6067
/// For a user who isn't the sender of some known message,
6168
/// see [userDisplayName].
6269
String senderDisplayName(Message message) {
63-
return users[message.senderId]?.fullName
70+
return getUser(message.senderId)?.fullName
6471
?? message.senderFullName;
6572
}
6673
}

lib/widgets/autocomplete.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class ComposeAutocomplete extends AutocompleteField<ComposeAutocompleteQuery, Co
200200
if (query is! MentionAutocompleteQuery) {
201201
return; // Shrug; similar to `intent == null` case above.
202202
}
203-
final user = store.users[userId]!; // must exist because UserMentionAutocompleteResult
203+
final user = store.getUser(userId)!; // must exist because UserMentionAutocompleteResult
204204
// TODO(i18n) language-appropriate space character; check active keyboard?
205205
// (maybe handle centrally in `controller`)
206206
replacementString = '${userMention(user, silent: query.silent, users: store)} ';
@@ -268,7 +268,7 @@ class _MentionAutocompleteItem extends StatelessWidget {
268268
Widget label;
269269
switch (option) {
270270
case UserMentionAutocompleteResult(:var userId):
271-
final user = store.users[userId]!; // must exist because UserMentionAutocompleteResult
271+
final user = store.getUser(userId)!; // must exist because UserMentionAutocompleteResult
272272
avatar = Avatar(userId: userId, size: 32, borderRadius: 3); // web uses 21px
273273
label = Text(user.fullName);
274274
case WildcardMentionAutocompleteResult(:var wildcardOption):

lib/widgets/compose_box.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ class _FixedDestinationContentInput extends StatelessWidget {
650650

651651
case DmNarrow(otherRecipientIds: [final otherUserId]):
652652
final store = PerAccountStoreWidget.of(context);
653-
final fullName = store.users[otherUserId]?.fullName;
653+
final fullName = store.getUser(otherUserId)?.fullName;
654654
if (fullName == null) return zulipLocalizations.composeBoxGenericContentHint;
655655
return zulipLocalizations.composeBoxDmContentHint(fullName);
656656

@@ -1416,7 +1416,7 @@ class _ComposeBoxState extends State<ComposeBox> with PerAccountStoreAwareStateM
14161416

14171417
case DmNarrow(:final otherRecipientIds):
14181418
final hasDeactivatedUser = otherRecipientIds.any((id) =>
1419-
!(store.users[id]?.isActive ?? true));
1419+
!(store.getUser(id)?.isActive ?? true));
14201420
if (hasDeactivatedUser) {
14211421
return _ErrorBanner(label:
14221422
ZulipLocalizations.of(context).errorBannerDeactivatedDmLabel);

lib/widgets/content.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1509,7 +1509,7 @@ class AvatarImage extends StatelessWidget {
15091509
@override
15101510
Widget build(BuildContext context) {
15111511
final store = PerAccountStoreWidget.of(context);
1512-
final user = store.users[userId];
1512+
final user = store.getUser(userId);
15131513

15141514
if (user == null) { // TODO(log)
15151515
return const SizedBox.shrink();

lib/widgets/message_list.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1311,7 +1311,7 @@ class MessageWithPossibleSender extends StatelessWidget {
13111311
final designVariables = DesignVariables.of(context);
13121312

13131313
final message = item.message;
1314-
final sender = store.users[message.senderId];
1314+
final sender = store.getUser(message.senderId);
13151315

13161316
Widget? senderRow;
13171317
if (item.showSender) {

lib/widgets/profile.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class ProfilePage extends StatelessWidget {
6767
Widget build(BuildContext context) {
6868
final zulipLocalizations = ZulipLocalizations.of(context);
6969
final store = PerAccountStoreWidget.of(context);
70-
final user = store.users[userId];
70+
final user = store.getUser(userId);
7171
if (user == null) {
7272
return const _ProfileErrorPage();
7373
}

test/model/user_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void main() {
5959
final store = eg.store(initialSnapshot: eg.initialSnapshot(
6060
realmUsers: [eg.selfUser, user]));
6161

62-
User getUser() => store.users[user.userId]!;
62+
User getUser() => store.getUser(user.userId)!;
6363

6464
store.handleEvent(RealmUserUpdateEvent(id: 1, userId: user.userId,
6565
deliveryEmail: null));

0 commit comments

Comments
 (0)