* Only send read receipts when we are at the bottom of a room; this is a simple
and effective way of stopping the green bar of doom from jumping down the
room slightly behind the scroll.
* Jump to read-up-to mark when switching back to a room if we were following
the live timeline before.
- Don't manipulate settings in RoomView. Make it RoomSettings' job.
- Return Promise[] from AliasSettings.save() rather than an allSettled promise
so callers can have more granularity over what to do with it (.all vs .allSettled)
- General refactoring of RoomSettings. Most things are broken now and are not
submitted. Add util methods to grab values out of events.
If the animation of an RR removal is active when we change room, we end up
getting a callback after the RoomView has been unmounted. Guard against this to
avoid getting React warnings.
This adds support for links to particular event ids: add /<eventId> to the URL
for a room.
This commit also ensures that we scroll to the 'read marker' when switching to
a room which has no previous scroll state, as well as preventing that marker
from going past the middle of the screen.
This also reinstates the preservation of scroll state when switching rooms,
which was disabled previously.
Instead of using the Room's active timeline directly, use a
TimelineWindow. This shouldn't (yet) have much effect, beyond maybe making
scrollback after a gappy sync slightly more efficient.
For now, I have disabled the 'restoreScrollState' functionality. This will be
reinstated once I land the link-to-event code.
Problem: Hitting join on a room invite would show spinner, then join room screen
then the messages.
Cause: The UI to show a spinner is set via the "joining" flag. This flag was
only set for the duration of the /join HTTP request. This is insufficient
because it races with actual room info arriving from /sync. If this info does
not arrive before the /join HTTP request returns, "joining" is false but the
current membership state of the user is still invite.
Fix: The "joining" flag is still set when the /join HTTP request is made, but
it is only turned off when the join event arrives from /sync.
Extras: This fix should also work when joining a room not from an invite.