@@ -147,6 +147,10 @@ class PerAccountStore extends ChangeNotifier {
147
147
required this.connection,
148
148
required InitialSnapshot initialSnapshot,
149
149
}) : zulipVersion = initialSnapshot.zulipVersion,
150
+ users = Map.fromEntries(initialSnapshot.realmUsers
151
+ .followedBy(initialSnapshot.realmNonActiveUsers)
152
+ .followedBy(initialSnapshot.crossRealmBots)
153
+ .map((user) => MapEntry(user.userId, user))),
150
154
subscriptions = Map.fromEntries(initialSnapshot.subscriptions.map(
151
155
(subscription) => MapEntry(subscription.streamId, subscription))),
152
156
maxFileUploadSizeMib = initialSnapshot.maxFileUploadSizeMib;
@@ -155,6 +159,7 @@ class PerAccountStore extends ChangeNotifier {
155
159
final ApiConnection connection;
156
160
157
161
final String zulipVersion;
162
+ final Map<int, User> users;
158
163
final Map<int, Subscription> subscriptions;
159
164
final int maxFileUploadSizeMib; // No event for this.
160
165
@@ -188,6 +193,39 @@ class PerAccountStore extends ChangeNotifier {
188
193
} else if (event is AlertWordsEvent) {
189
194
debugPrint("server event: alert_words");
190
195
// We don't yet store this data, so there's nothing to update.
196
+ } else if (event is RealmUserAddEvent) {
197
+ debugPrint("server event: realm_user/add");
198
+ users[event.person.userId] = event.person;
199
+ notifyListeners();
200
+ } else if (event is RealmUserRemoveEvent) {
201
+ debugPrint("server event: realm_user/remove");
202
+ users.remove(event.userId);
203
+ notifyListeners();
204
+ } else if (event is RealmUserUpdateEvent) {
205
+ debugPrint("server event: realm_user/update");
206
+ final user = users[event.userId];
207
+ if (user == null) {
208
+ return; // TODO log
209
+ }
210
+ if (event.fullName != null) user.fullName = event.fullName!;
211
+ if (event.avatarUrl != null) user.avatarUrl = event.avatarUrl!;
212
+ if (event.avatarVersion != null) user.avatarVersion = event.avatarVersion!;
213
+ if (event.timezone != null) user.timezone = event.timezone!;
214
+ if (event.botOwnerId != null) user.botOwnerId = event.botOwnerId!;
215
+ if (event.role != null) user.role = event.role!;
216
+ if (event.isBillingAdmin != null) user.isBillingAdmin = event.isBillingAdmin!;
217
+ if (event.deliveryEmail != null) user.deliveryEmailStaleDoNotUse = event.deliveryEmail!;
218
+ if (event.newEmail != null) user.email = event.newEmail!;
219
+ if (event.customProfileField != null) {
220
+ final profileData = (user.profileData ??= {});
221
+ final update = event.customProfileField!;
222
+ if (update.value != null) {
223
+ profileData[update.id] = ProfileFieldUserData(value: update.value!, renderedValue: update.renderedValue);
224
+ } else {
225
+ profileData.remove(update.id);
226
+ }
227
+ }
228
+ notifyListeners();
191
229
} else if (event is MessageEvent) {
192
230
debugPrint("server event: message ${jsonEncode(event.message.toJson())}");
193
231
for (final view in _messageListViews) {
0 commit comments