@@ -147,6 +147,10 @@ class PerAccountStore extends ChangeNotifier {
147147 required this .connection,
148148 required InitialSnapshot initialSnapshot,
149149 }) : zulipVersion = initialSnapshot.zulipVersion,
150+ users = Map .fromEntries (initialSnapshot.realmUsers
151+ .followedBy (initialSnapshot.realmNonActiveUsers)
152+ .followedBy (initialSnapshot.crossRealmBots)
153+ .map ((user) => MapEntry (user.userId, user))),
150154 subscriptions = Map .fromEntries (initialSnapshot.subscriptions.map (
151155 (subscription) => MapEntry (subscription.streamId, subscription))),
152156 maxFileUploadSizeMib = initialSnapshot.maxFileUploadSizeMib;
@@ -155,6 +159,7 @@ class PerAccountStore extends ChangeNotifier {
155159 final ApiConnection connection;
156160
157161 final String zulipVersion;
162+ final Map <int , User > users;
158163 final Map <int , Subscription > subscriptions;
159164 final int maxFileUploadSizeMib; // No event for this.
160165
@@ -188,6 +193,39 @@ class PerAccountStore extends ChangeNotifier {
188193 } else if (event is AlertWordsEvent ) {
189194 debugPrint ("server event: alert_words" );
190195 // 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 ();
191229 } else if (event is MessageEvent ) {
192230 debugPrint ("server event: message ${jsonEncode (event .message .toJson ())}" );
193231 for (final view in _messageListViews) {
0 commit comments