In summary this makes RoomTiles (and RoomAvatars) do more for
themselves in terms of reacting individually to state changes in
the js-sdk.
Instead of force updating the entire room list for avatar changes
and room name changes, do this in the RoomTile and RoomAvatar
instead. This increases the number of listeners listening to the
matrix client, but allows us to properly implement a
shouldComponentUpdate for RoomTile (because the avatar, name and
notification count are now in component state)
- GroupView can now render with rooms in the summary that do not have an avatar
- RoomAvatar no longer has a redundant fallback avatar (this is handled by BaseAvatar)
- RoomAvatar was delinted
The correct 1-1 avatar is used with rooms in which there are only two users with either "join" or "invite" as their membership (importantly, not "leave" or otherwise).
(This is important when a user moves accounts and re-joins previously left 1-1 chats)
React apparently now checks the properties which are set on DOM elements, and
grumbles noisily about unexpected ones. Update BaseAvatar and RoomAvatar so
that they don't set unrelated properties on the DOM elements.
Object.keys() is O(n) and is wasted because we only care if the keys are 1 or 2.
Use `for .. in` instead and return early if there are >2 keys.
Profiling indicates this cuts wasted time from ~74ms to ~32ms for me (who has
a large number of rooms with large numbers of people in them).