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) diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 64bb492672..602cf52e06 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -69,36 +69,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 @@ -185,6 +159,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 */