Skip to content

Commit 268a462

Browse files
committed
user [nfc]: Factor out a getUser method
1 parent 6bbe209 commit 268a462

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
@@ -664,7 +664,7 @@ class _FixedDestinationContentInput extends StatelessWidget {
664664

665665
case DmNarrow(otherRecipientIds: [final otherUserId]):
666666
final store = PerAccountStoreWidget.of(context);
667-
final fullName = store.users[otherUserId]?.fullName;
667+
final fullName = store.getUser(otherUserId)?.fullName;
668668
if (fullName == null) return zulipLocalizations.composeBoxGenericContentHint;
669669
return zulipLocalizations.composeBoxDmContentHint(fullName);
670670

@@ -1431,7 +1431,7 @@ class _ComposeBoxState extends State<ComposeBox> with PerAccountStoreAwareStateM
14311431

14321432
case DmNarrow(:final otherRecipientIds):
14331433
final hasDeactivatedUser = otherRecipientIds.any((id) =>
1434-
!(store.users[id]?.isActive ?? true));
1434+
!(store.getUser(id)?.isActive ?? true));
14351435
if (hasDeactivatedUser) {
14361436
return _ErrorBanner(label:
14371437
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
@@ -1330,7 +1330,7 @@ class MessageWithPossibleSender extends StatelessWidget {
13301330
final designVariables = DesignVariables.of(context);
13311331

13321332
final message = item.message;
1333-
final sender = store.users[message.senderId];
1333+
final sender = store.getUser(message.senderId);
13341334

13351335
Widget? senderRow;
13361336
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
@@ -60,7 +60,7 @@ void main() {
6060
final store = eg.store(initialSnapshot: eg.initialSnapshot(
6161
realmUsers: [eg.selfUser, user]));
6262

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

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

0 commit comments

Comments
 (0)