Merge pull request #1099 from matrix-org/luke/fix-spinner-until-room-available

Display a spinner until new room object after join success
This commit is contained in:
David Baker 2017-06-15 14:34:16 +01:00 committed by GitHub
commit c32b717723

View file

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