From cb5b311e447aff87a6fce180d40ff3eac55c4992 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Fri, 4 Nov 2016 09:28:35 +0000 Subject: [PATCH] Move saveScrollState into RoomView It fits much more naturally here than in LoggedInView. --- src/components/structures/LoggedInView.js | 27 +--------- src/components/structures/MatrixChat.js | 2 + src/components/structures/RoomView.js | 60 +++++++++++++---------- 3 files changed, 37 insertions(+), 52 deletions(-) diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 739b74c6bf..ea3f46d3d1 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -54,36 +54,10 @@ export default React.createClass({ document.removeEventListener('keydown', this._onKeyDown); }, - componentWillReceiveProps: function(nextProps) { - if (nextProps.page_type !== this.props.page_type || - nextProps.currentRoomAlias !== this.props.currentRoomAlias || - nextProps.currentRoomId !== this.props.currentRoomId - ) { - - // stash the scroll state before we change view - this._updateScrollMap(); - } - }, - getScrollStateForRoom: function(roomId) { return this._scrollStateMap[roomId]; }, - // update scrollStateMap according to the current scroll state of the - // room view. - _updateScrollMap: function() { - if (!this.refs.roomView) { - return; - } - var roomview = this.refs.roomView; - var roomId = this.refs.roomView.getRoomId(); - if (!roomId) { - return; - } - var state = roomview.getScrollState(); - this._scrollStateMap[roomId] = state; - }, - _onKeyDown: function(ev) { /* // Remove this for now as ctrl+alt = alt-gr so this breaks keyboards which rely on alt-gr for numbers @@ -170,6 +144,7 @@ export default React.createClass({ opacity={this.props.middleOpacity} collapsedRhs={this.props.collapse_rhs} ConferenceHandler={this.props.ConferenceHandler} + scrollStateMap={this._scrollStateMap} /> if (!this.props.collapse_rhs) right_panel = break; diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index e31bb201de..945088106b 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -508,6 +508,8 @@ module.exports = React.createClass({ // if we aren't given an explicit event id, look for one in the // scrollStateMap. + // + // TODO: do this in RoomView rather than here if (!room_info.event_id && this.refs.loggedInView) { var scrollState = this.refs.loggedInView.getScrollStateForRoom(room_info.room_id); if (scrollState) { diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 9040e280f2..4e578d8d28 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -100,6 +100,21 @@ module.exports = React.createClass({ // is the RightPanel collapsed? collapsedRhs: React.PropTypes.bool, + + // a map from room id to scroll state, which will be updated on unmount. + // + // If there is no special scroll state (ie, we are following the live + // timeline), the scroll state is null. Otherwise, it is 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 an explicit scroll to an explicit event, it will be + // that event. + // + // pixelOffset: the number of pixels the window is scrolled down + // from the focussedEvent. + scrollStateMap: React.PropTypes.object, }, getInitialState: function() { @@ -307,6 +322,9 @@ module.exports = React.createClass({ // (We could use isMounted, but facebook have deprecated that.) this.unmounted = true; + // update the scroll map before we get unmounted + this._updateScrollMap(); + if (this.refs.roomView) { // disconnect the D&D event listeners from the room view. This // is really just for hygiene - we're going to be @@ -1203,22 +1221,25 @@ module.exports = React.createClass({ } }, + // update scrollStateMap on unmount + _updateScrollMap: function() { + if (!this.state.room) { + // we were instantiated on a room alias and haven't yet joined the room. + return; + } + if (!this.props.scrollStateMap) return; + + var roomId = this.state.room.roomId; + + var state = this._getScrollState(); + this.props.scrollStateMap[roomId] = state; + }, + + // get the current scroll position of the room, so that it can be // restored when we switch back to it. // - // 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 - // an explicit scroll to an explicit event, it will be that event. - // - // pixelOffset: the number of pixels the window is scrolled down from - // the focussedEvent. - // - // - getScrollState: function() { + _getScrollState: function() { var messagePanel = this.refs.messagePanel; if (!messagePanel) return null; @@ -1333,19 +1354,6 @@ module.exports = React.createClass({ } }, - /** - * Get the ID of the displayed room - * - * Returns null if the RoomView was instantiated on a room alias and - * we haven't yet joined the room. - */ - getRoomId: function() { - if (!this.state.room) { - return null; - } - return this.state.room.roomId; - }, - /** * get any current call for this room */