@@ -141,6 +141,10 @@ class PerAccountStore extends ChangeNotifier {
141141 required this .connection,
142142 required InitialSnapshot initialSnapshot,
143143 }) : zulipVersion = initialSnapshot.zulipVersion,
144+ users = Map .fromEntries (initialSnapshot.realmUsers
145+ .followedBy (initialSnapshot.realmNonActiveUsers)
146+ .followedBy (initialSnapshot.crossRealmBots)
147+ .map ((user) => MapEntry (user.userId, user))),
144148 subscriptions = Map .fromEntries (initialSnapshot.subscriptions.map (
145149 (subscription) => MapEntry (subscription.streamId, subscription))),
146150 maxFileUploadSizeMib = initialSnapshot.maxFileUploadSizeMib;
@@ -149,6 +153,7 @@ class PerAccountStore extends ChangeNotifier {
149153 final ApiConnection connection;
150154
151155 final String zulipVersion;
156+ final Map <int , User > users;
152157 final Map <int , Subscription > subscriptions;
153158 final int maxFileUploadSizeMib; // No event for this.
154159
@@ -182,6 +187,41 @@ class PerAccountStore extends ChangeNotifier {
182187 } else if (event is AlertWordsEvent ) {
183188 debugPrint ("server event: alert_words" );
184189 // We don't yet store this data, so there's nothing to update.
190+ } else if (event is RealmUserAddEvent ) {
191+ debugPrint ("server event: realm_user/add" );
192+ users[event.person.userId] = event.person;
193+ notifyListeners ();
194+ } else if (event is RealmUserRemoveEvent ) {
195+ debugPrint ("server event: realm_user/remove" );
196+ users.remove (event.userId);
197+ notifyListeners ();
198+ } else if (event is RealmUserUpdateEvent ) {
199+ debugPrint ("server event: realm_user/update" );
200+ final user = users[event.userId];
201+ if (user == null ) {
202+ return ; // TODO log
203+ }
204+ if (event.fullName != null ) user.fullName = event.fullName! ;
205+ if (event.avatarUrl != null ) user.avatarUrl = event.avatarUrl! ;
206+ if (event.avatarVersion != null ) user.avatarVersion = event.avatarVersion! ;
207+ if (event.timezone != null ) user.timezone = event.timezone! ;
208+ if (event.botOwnerId != null ) user.botOwnerId = event.botOwnerId! ;
209+ if (event.role != null ) user.role = event.role! ;
210+ if (event.isBillingAdmin != null ) user.isBillingAdmin = event.isBillingAdmin! ;
211+ if (event.deliveryEmail != null ) user.deliveryEmailStaleDoNotUse = event.deliveryEmail! ;
212+ if (event.newEmail != null ) user.email = event.newEmail! ;
213+ if (event.customProfileField != null ) {
214+ if (user.profileData == null ) {
215+ return ;
216+ }
217+ final update = event.customProfileField! ;
218+ if (update.value != null ) {
219+ user.profileData! [update.id] = ProfileFieldUserData (value: update.value! , renderedValue: update.renderedValue);
220+ } else {
221+ user.profileData! .remove (update.id);
222+ }
223+ }
224+ notifyListeners ();
185225 } else if (event is MessageEvent ) {
186226 debugPrint ("server event: message ${jsonEncode (event .message .toJson ())}" );
187227 for (final view in _messageListViews) {
0 commit comments