diff --git a/Vector/ViewController/RoomParticipantsViewController.m b/Vector/ViewController/RoomParticipantsViewController.m index 024ea39c12..15351389be 100644 --- a/Vector/ViewController/RoomParticipantsViewController.m +++ b/Vector/ViewController/RoomParticipantsViewController.m @@ -58,6 +58,9 @@ @interface RoomParticipantsViewController () // Observe kMXSessionWillLeaveRoomNotification to be notified if the user leaves the current room. id leaveRoomNotificationObserver; + + // Observe kMXRoomDidFlushMessagesNotification to take into account the updated room members when the room history is flushed. + id roomDidFlushMessagesNotificationObserver; RoomMemberDetailsViewController *memberDetailsViewController; @@ -151,6 +154,12 @@ - (void)destroy leaveRoomNotificationObserver = nil; } + if (roomDidFlushMessagesNotificationObserver) + { + [[NSNotificationCenter defaultCenter] removeObserver:roomDidFlushMessagesNotificationObserver]; + roomDidFlushMessagesNotificationObserver = nil; + } + if (membersListener) { [self.mxRoom.liveTimeline removeListener:membersListener]; @@ -257,6 +266,11 @@ - (void)setMxRoom:(MXRoom *)mxRoom [[NSNotificationCenter defaultCenter] removeObserver:leaveRoomNotificationObserver]; leaveRoomNotificationObserver = nil; } + if (roomDidFlushMessagesNotificationObserver) + { + [[NSNotificationCenter defaultCenter] removeObserver:roomDidFlushMessagesNotificationObserver]; + roomDidFlushMessagesNotificationObserver = nil; + } if (membersListener) { [_mxRoom.liveTimeline removeListener:membersListener]; @@ -285,6 +299,20 @@ - (void)setMxRoom:(MXRoom *)mxRoom } }]; + // Observe room history flush (sync with limited timeline, or state event redaction) + roomDidFlushMessagesNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:kMXRoomDidFlushMessagesNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notif) { + + MXRoom *room = notif.object; + if (_mxRoom.mxSession == room.mxSession && [_mxRoom.state.roomId isEqualToString:room.state.roomId]) + { + // The existing room history has been flushed during server sync. Take into account the updated room members list. + [self refreshParticipantsFromRoomMembers]; + + [self.tableView reloadData]; + } + + }]; + // Register a listener for events that concern room members NSArray *mxMembersEvents = @[kMXEventTypeStringRoomMember, kMXEventTypeStringRoomThirdPartyInvite, kMXEventTypeStringRoomPowerLevels]; membersListener = [_mxRoom.liveTimeline listenToEventsOfTypes:mxMembersEvents onEvent:^(MXEvent *event, MXTimelineDirection direction, id customObject) {