From d14c1a82b206181246022e2e0de875bc2f479d32 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Thu, 4 Feb 2016 16:17:03 +0000 Subject: [PATCH] Tweaks to the semantics for sending RRs and handling room switches * 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. --- src/components/structures/RoomView.js | 29 ++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index b21e97c6c5..6145c0e560 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -252,6 +252,8 @@ module.exports = React.createClass({ } else { this.refs.messagePanel.scrollToBottom(); } + + this.sendReadReceipt(); }); }); }, @@ -631,9 +633,6 @@ module.exports = React.createClass({ _initialiseMessagePanel: function() { var messagePanel = ReactDOM.findDOMNode(this.refs.messagePanel); this.refs.messagePanel.initialised = true; - - this.sendReadReceipt(); - this.updateTint(); }, @@ -1323,6 +1322,13 @@ module.exports = React.createClass({ if (!this.state.room) return; if (!this.refs.messagePanel) return; + // we don't want to see our RR marker dropping down as we scroll + // through old history. For now, do this just by leaving the RR where + // it is until we hit the bottom of the room, though ultimately we + // probably want to keep sending RR, but hide the RR until we reach + // the bottom of the room again, or something. + if (!this.state.atEndOfLiveTimeline) return; + var currentReadUpToEventId = this.state.room.getEventReadUpTo(MatrixClientPeg.get().credentials.userId); var currentReadUpToEventIndex = this._indexForEventId(currentReadUpToEventId); @@ -1510,7 +1516,9 @@ module.exports = React.createClass({ // get the current scroll position of the room, so that it can be // restored when we switch back to it. // - // This returns an object with the following properties: + // If there is no special scroll state (ie, we are following the live + // timeline), returns null. Otherwise, returns an object with the following + // properties: // // focussedEvent: the ID of the 'focussed' event. Typically this is the // last event fully visible in the viewport, though if we have done @@ -1519,12 +1527,23 @@ module.exports = React.createClass({ // pixelOffset: the number of pixels the window is scrolled down from // the focussedEvent. // - // If there are no visible events, returns null. // getScrollState: function() { var messagePanel = this.refs.messagePanel; if (!messagePanel) return null; + // if we're following the live timeline, we want to return null; that + // means that, if we switch back, we will jump to the read-up-to mark. + // + // That should be more intuitive than slavishly preserving the current + // scroll state, in the case where the room advances in the meantime + // (particularly in the case that the user reads some stuff on another + // device). + // + if (this.state.atEndOfLiveTimeline) { + return null; + } + var scrollState = messagePanel.getScrollState(); if (scrollState.stuckAtBottom) {