diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 0cd8a95938..803707daf6 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -179,6 +179,10 @@ module.exports = React.createClass({ 'joining?', newState.joining, ); + // finished joining, start waiting for a room and show a spinner. See onRoom. + newState.waitingForRoom = this.state.joining && !newState.joining && + !RoomViewStore.getJoinError(); + // NB: This does assume that the roomID will not change for the lifetime of // the RoomView instance if (initial) { @@ -218,23 +222,19 @@ module.exports = React.createClass({ // which must be by alias or invite wherever possible (peeking currently does // not work over federation). - // NB. We peek if we are not in the room, although if we try to peek into - // a room in which we have a member event (ie. we've left) synapse will just - // send us the same data as we get in the sync (ie. the last events we saw). + // NB. We peek if we have never seen the room before (i.e. js-sdk does not know + // about it). We don't peek in the historical case where we were joined but are + // now not joined because the js-sdk peeking API will clobber our historical room, + // making it impossible to indicate a newly joined room. const room = this.state.room; - let isUserJoined = null; if (room) { - isUserJoined = room.hasMembershipState( - MatrixClientPeg.get().credentials.userId, 'join', - ); - this._updateAutoComplete(room); this.tabComplete.loadEntries(room); } - if (!isUserJoined && !this.state.joining && this.state.roomId) { + if (!this.state.joining && this.state.roomId) { if (this.props.autoJoin) { this.onJoinButtonClicked(); - } else if (this.state.roomId) { + } else if (!room) { console.log("Attempting to peek into room %s", this.state.roomId); this.setState({ peekLoading: true, @@ -259,7 +259,8 @@ module.exports = React.createClass({ } }).done(); } - } else if (isUserJoined) { + } else if (room) { + // Stop peeking because we have joined this room previously MatrixClientPeg.get().stopPeeking(); this.setState({ unsentMessageError: this._getUnsentMessageError(room), @@ -622,6 +623,7 @@ module.exports = React.createClass({ } this.setState({ room: room, + waitingForRoom: false, }, () => { this._onRoomLoaded(room); }); @@ -677,7 +679,14 @@ module.exports = React.createClass({ onRoomMemberMembership: function(ev, member, oldMembership) { if (member.userId == MatrixClientPeg.get().credentials.userId) { - this.forceUpdate(); + + if (member.membership === 'join') { + this.setState({ + waitingForRoom: false, + }); + } else { + this.forceUpdate(); + } } }, @@ -1464,7 +1473,7 @@ module.exports = React.createClass({ onRejectClick={ this.onRejectThreepidInviteButtonClicked } canPreview={ false } error={ this.state.roomLoadError } roomAlias={room_alias} - spinner={this.state.joining} + spinner={this.state.joining || this.state.waitingForRoom} inviterName={inviterName} invitedEmail={invitedEmail} room={this.state.room} @@ -1583,7 +1592,7 @@ module.exports = React.createClass({