@@ -30,6 +30,7 @@ import 'recent_senders.dart';
3030import  'channel.dart' ;
3131import  'typing_status.dart' ;
3232import  'unreads.dart' ;
33+ import  'user.dart' ;
3334
3435export  'package:drift/drift.dart'  show  Value;
3536export  'database.dart'  show  Account, AccountsCompanion, AccountAlreadyExistsException;
@@ -237,7 +238,7 @@ class AccountNotFoundException implements Exception {}
237238/// This class does not attempt to poll an event queue 
238239/// to keep the data up to date.  For that behavior, see 
239240/// [UpdateMachine] . 
240- class  PerAccountStore  extends  ChangeNotifier  with  EmojiStore , ChannelStore , MessageStore  {
241+ class  PerAccountStore  extends  ChangeNotifier  with  EmojiStore , UserStore ,  ChannelStore , MessageStore  {
241242  /// Construct a store for the user's data, starting from the given snapshot. 
242243  /// 
243244  /// The global store must already have been updated with 
@@ -287,11 +288,7 @@ class PerAccountStore extends ChangeNotifier with EmojiStore, ChannelStore, Mess
287288        typingStartedWaitPeriod:  Duration (
288289          milliseconds:  initialSnapshot.serverTypingStartedWaitPeriodMilliseconds),
289290      ),
290-       users:  Map .fromEntries (
291-         initialSnapshot.realmUsers
292-         .followedBy (initialSnapshot.realmNonActiveUsers)
293-         .followedBy (initialSnapshot.crossRealmBots)
294-         .map ((user) =>  MapEntry (user.userId, user))),
291+       users:  UserStoreImpl (initialSnapshot:  initialSnapshot),
295292      typingStatus:  TypingStatus (
296293        selfUserId:  account.userId,
297294        typingStartedExpiryPeriod:  Duration (milliseconds:  initialSnapshot.serverTypingStartedExpiryPeriodMilliseconds),
@@ -325,7 +322,7 @@ class PerAccountStore extends ChangeNotifier with EmojiStore, ChannelStore, Mess
325322    required  this .selfUserId,
326323    required  this .userSettings,
327324    required  this .typingNotifier,
328-     required  this . users,
325+     required  UserStoreImpl   users,
329326    required  this .typingStatus,
330327    required  ChannelStoreImpl  channels,
331328    required  MessageStoreImpl  messages,
@@ -338,6 +335,7 @@ class PerAccountStore extends ChangeNotifier with EmojiStore, ChannelStore, Mess
338335       assert (emoji.realmUrl ==  realmUrl),
339336       _globalStore =  globalStore,
340337       _emoji =  emoji,
338+        _users =  users,
341339       _channels =  channels,
342340       _messages =  messages;
343341
@@ -436,7 +434,10 @@ class PerAccountStore extends ChangeNotifier with EmojiStore, ChannelStore, Mess
436434  //////////////////////////////// 
437435// Users and data about them. 
438436
439-   final  Map <int , User > users;
437+   @override 
438+   Map <int , User > get  users =>  _users.users;
439+ 
440+   final  UserStoreImpl  _users;
440441
441442  final  TypingStatus  typingStatus;
442443
@@ -605,44 +606,18 @@ class PerAccountStore extends ChangeNotifier with EmojiStore, ChannelStore, Mess
605606
606607      case  RealmUserAddEvent (): 
607608        assert (debugLog ("server event: realm_user/add" ));
608-         users[event.person.userId]  =   event.person ;
609+         _users. handleRealmUserEvent ( event) ;
609610        notifyListeners ();
610611
611612      case  RealmUserRemoveEvent (): 
612613        assert (debugLog ("server event: realm_user/remove" ));
613-         users. remove (event.userId );
614+         _users. handleRealmUserEvent (event);
614615        autocompleteViewManager.handleRealmUserRemoveEvent (event);
615616        notifyListeners ();
616617
617618      case  RealmUserUpdateEvent (): 
618619        assert (debugLog ("server event: realm_user/update" ));
619-         final  user =  users[event.userId];
620-         if  (user ==  null ) {
621-           return ; // TODO log 
622-         }
623-         if  (event.fullName !=  null )       user.fullName       =  event.fullName! ;
624-         if  (event.avatarUrl !=  null )      user.avatarUrl      =  event.avatarUrl! ;
625-         if  (event.avatarVersion !=  null )  user.avatarVersion  =  event.avatarVersion! ;
626-         if  (event.timezone !=  null )       user.timezone       =  event.timezone! ;
627-         if  (event.botOwnerId !=  null )     user.botOwnerId     =  event.botOwnerId! ;
628-         if  (event.role !=  null )           user.role           =  event.role! ;
629-         if  (event.isBillingAdmin !=  null ) user.isBillingAdmin =  event.isBillingAdmin! ;
630-         if  (event.deliveryEmail !=  null )  user.deliveryEmail  =  event.deliveryEmail! .value;
631-         if  (event.newEmail !=  null )       user.email          =  event.newEmail! ;
632-         if  (event.isActive !=  null )       user.isActive       =  event.isActive! ;
633-         if  (event.customProfileField !=  null ) {
634-           final  profileData =  (user.profileData ?? =  {});
635-           final  update =  event.customProfileField! ;
636-           if  (update.value !=  null ) {
637-             profileData[update.id] =  ProfileFieldUserData (value:  update.value! , renderedValue:  update.renderedValue);
638-           } else  {
639-             profileData.remove (update.id);
640-           }
641-           if  (profileData.isEmpty) {
642-             // null is equivalent to `{}` for efficiency; see [User._readProfileData]. 
643-             user.profileData =  null ;
644-           }
645-         }
620+         _users.handleRealmUserEvent (event);
646621        autocompleteViewManager.handleRealmUserUpdateEvent (event);
647622        notifyListeners ();
648623
0 commit comments