Move saveScrollState into RoomView

It fits much more naturally here than in LoggedInView.
pull/21833/head
Richard van der Hoff 2016-11-04 09:28:35 +00:00
parent f85a37c667
commit cb5b311e44
3 changed files with 37 additions and 52 deletions

View File

@ -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 = <RightPanel roomId={this.props.currentRoomId} opacity={this.props.sideOpacity} />
break;

View File

@ -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) {

View File

@ -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
*/