Fix leaking of GroupStore listeners in RoomList

This commit is contained in:
Luke Barnard 2017-12-15 14:12:21 +00:00
parent df1134f092
commit 34e455c6fc
2 changed files with 18 additions and 4 deletions

View file

@ -86,6 +86,7 @@ module.exports = React.createClass({
const dmRoomMap = DMRoomMap.shared();
this._groupStores = {};
this._groupStoreTokens = [];
// A map between tags which are group IDs and the room IDs of rooms that should be kept
// in the room list when filtering by that tag.
this._selectedTagsRoomIdsForGroup = {
@ -100,10 +101,12 @@ module.exports = React.createClass({
return;
}
this._groupStores[tag] = GroupStoreCache.getGroupStore(tag);
this._groupStoreTokens.push(
this._groupStores[tag].registerListener(() => {
// This group's rooms or members may have updated, update rooms for its tag
this.updateSelectedTagsRooms(dmRoomMap, [tag]);
});
}),
);
});
// Filters themselves have changed, refresh the selected tags
this.updateSelectedTagsRooms(dmRoomMap, FilterStore.getSelectedTags());
@ -182,6 +185,11 @@ module.exports = React.createClass({
this._filterStoreToken.remove();
}
if (this._groupStoreTokens.length > 0) {
// NB: GroupStore is not a Flux.Store
this._groupStoreTokens.forEach((token) => token.unregister());
}
// cancel any pending calls to the rate_limited_funcs
this._delayedRefreshRoomList.cancelPendingCall();
},

View file

@ -110,6 +110,12 @@ export default class GroupStore extends EventEmitter {
this._fetchSummary();
this._fetchRooms();
this._fetchMembers();
return {
unregister: () => {
this.unregisterListener(fn);
},
};
}
unregisterListener(fn) {