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 1/4] 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 */ From fa967da2a9a6efd7536880ea0c055918b64451fe Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 4 Nov 2016 10:07:50 +0000 Subject: [PATCH 2/4] matrix-js-sdk 0.6.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e5cd2eab3b..7dc4664044 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "linkifyjs": "^2.1.3", "lodash": "^4.13.1", "marked": "^0.3.5", - "matrix-js-sdk": "0.6.4-rc.2", + "matrix-js-sdk": "0.6.4", "optimist": "^0.6.1", "q": "^1.4.1", "react": "^15.2.1", From d7bc40807004d934eaede5e865e978c931331bb8 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 4 Nov 2016 10:09:10 +0000 Subject: [PATCH 3/4] Prepare changelog for v0.7.5 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fefc2c73a..57d6c38d01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +Changes in [0.7.5](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.7.5) (2016-11-04) +=================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.7.5-rc.1...v0.7.5) + + * No changes + Changes in [0.7.5-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v0.7.5-rc.1) (2016-11-02) ============================================================================================================= [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v0.7.4...v0.7.5-rc.1) From 1368d90e66be311baa5975fd12fe6cc5a7827a5c Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 4 Nov 2016 10:09:11 +0000 Subject: [PATCH 4/4] v0.7.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7dc4664044..a7f65919a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "0.7.5-rc.1", + "version": "0.7.5", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {