mirror of
https://github.com/element-hq/element-web
synced 2024-11-24 10:15:43 +03:00
improve wording of MemberInfo's start chat button. Fixes https://github.com/vector-im/vector-web/issues/689 and clarifies https://github.com/matrix-org/matrix-react-sdk/issues/328
This commit is contained in:
parent
999c52b650
commit
554a6ff035
1 changed files with 66 additions and 46 deletions
|
@ -61,12 +61,16 @@ module.exports = React.createClass({
|
||||||
updating: 0,
|
updating: 0,
|
||||||
devicesLoading: true,
|
devicesLoading: true,
|
||||||
devices: null,
|
devices: null,
|
||||||
|
existingOneToOneRoomId: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
componentWillMount: function() {
|
componentWillMount: function() {
|
||||||
this._cancelDeviceList = null;
|
this._cancelDeviceList = null;
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
existingOneToOneRoomId: this.getExistingOneToOneRoomId()
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
componentDidMount: function() {
|
componentDidMount: function() {
|
||||||
|
@ -90,6 +94,44 @@ module.exports = React.createClass({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getExistingOneToOneRoomId: function() {
|
||||||
|
var self = this;
|
||||||
|
var rooms = MatrixClientPeg.get().getRooms();
|
||||||
|
var userIds = [
|
||||||
|
this.props.member.userId,
|
||||||
|
MatrixClientPeg.get().credentials.userId
|
||||||
|
];
|
||||||
|
var existingRoomId;
|
||||||
|
|
||||||
|
// roomId can be null here because of a hack in MatrixChat.onUserClick where we
|
||||||
|
// abuse this to view users rather than room members.
|
||||||
|
var currentMembers;
|
||||||
|
if (this.props.member.roomId) {
|
||||||
|
var currentRoom = MatrixClientPeg.get().getRoom(this.props.member.roomId);
|
||||||
|
currentMembers = currentRoom.getJoinedMembers();
|
||||||
|
}
|
||||||
|
|
||||||
|
// reuse the first private 1:1 we find
|
||||||
|
existingRoomId = null;
|
||||||
|
|
||||||
|
for (var i = 0; i < rooms.length; i++) {
|
||||||
|
// don't try to reuse public 1:1 rooms
|
||||||
|
var join_rules = rooms[i].currentState.getStateEvents("m.room.join_rules", '');
|
||||||
|
if (join_rules && join_rules.getContent().join_rule === 'public') continue;
|
||||||
|
|
||||||
|
var members = rooms[i].getJoinedMembers();
|
||||||
|
if (members.length === 2 &&
|
||||||
|
userIds.indexOf(members[0].userId) !== -1 &&
|
||||||
|
userIds.indexOf(members[1].userId) !== -1)
|
||||||
|
{
|
||||||
|
existingRoomId = rooms[i].roomId;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return existingRoomId;
|
||||||
|
},
|
||||||
|
|
||||||
onDeviceVerificationChanged: function(userId, device) {
|
onDeviceVerificationChanged: function(userId, device) {
|
||||||
if (userId == this.props.member.userId) {
|
if (userId == this.props.member.userId) {
|
||||||
// no need to re-download the whole thing; just update our copy of
|
// no need to re-download the whole thing; just update our copy of
|
||||||
|
@ -349,54 +391,17 @@ module.exports = React.createClass({
|
||||||
|
|
||||||
onChatClick: function() {
|
onChatClick: function() {
|
||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
|
|
||||||
|
// TODO: keep existingOneToOneRoomId updated if we see any room member changes anywhere
|
||||||
|
|
||||||
|
var useExistingOneToOneRoom = this.state.existingOneToOneRoomId && (this.state.existingOneToOneRoomId !== this.props.member.roomId);
|
||||||
|
|
||||||
// check if there are any existing rooms with just us and them (1:1)
|
// check if there are any existing rooms with just us and them (1:1)
|
||||||
// If so, just view that room. If not, create a private room with them.
|
// If so, just view that room. If not, create a private room with them.
|
||||||
var self = this;
|
if (this.state.existingOneToOneRoomId) {
|
||||||
var rooms = MatrixClientPeg.get().getRooms();
|
|
||||||
var userIds = [
|
|
||||||
this.props.member.userId,
|
|
||||||
MatrixClientPeg.get().credentials.userId
|
|
||||||
];
|
|
||||||
var existingRoomId;
|
|
||||||
|
|
||||||
// roomId can be null here because of a hack in MatrixChat.onUserClick where we
|
|
||||||
// abuse this to view users rather than room members.
|
|
||||||
var currentMembers;
|
|
||||||
if (this.props.member.roomId) {
|
|
||||||
var currentRoom = MatrixClientPeg.get().getRoom(this.props.member.roomId);
|
|
||||||
currentMembers = currentRoom.getJoinedMembers();
|
|
||||||
}
|
|
||||||
// if our current room is a 1:1 with the target user, start a new chat rather than NOOPing
|
|
||||||
if (currentMembers && currentMembers.length === 2 &&
|
|
||||||
userIds.indexOf(currentMembers[0].userId) !== -1 &&
|
|
||||||
userIds.indexOf(currentMembers[1].userId) !== -1)
|
|
||||||
{
|
|
||||||
existingRoomId = null;
|
|
||||||
}
|
|
||||||
// otherwise reuse the first private 1:1 we find
|
|
||||||
else {
|
|
||||||
existingRoomId = null;
|
|
||||||
|
|
||||||
for (var i = 0; i < rooms.length; i++) {
|
|
||||||
// don't try to reuse public 1:1 rooms
|
|
||||||
var join_rules = rooms[i].currentState.getStateEvents("m.room.join_rules", '');
|
|
||||||
if (join_rules && join_rules.getContent().join_rule === 'public') continue;
|
|
||||||
|
|
||||||
var members = rooms[i].getJoinedMembers();
|
|
||||||
if (members.length === 2 &&
|
|
||||||
userIds.indexOf(members[0].userId) !== -1 &&
|
|
||||||
userIds.indexOf(members[1].userId) !== -1)
|
|
||||||
{
|
|
||||||
existingRoomId = rooms[i].roomId;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (existingRoomId) {
|
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: 'view_room',
|
action: 'view_room',
|
||||||
room_id: existingRoomId
|
room_id: this.state.existingOneToOneRoomId,
|
||||||
});
|
});
|
||||||
this.props.onFinished();
|
this.props.onFinished();
|
||||||
}
|
}
|
||||||
|
@ -553,7 +558,22 @@ module.exports = React.createClass({
|
||||||
if (this.props.member.userId !== MatrixClientPeg.get().credentials.userId) {
|
if (this.props.member.userId !== MatrixClientPeg.get().credentials.userId) {
|
||||||
// FIXME: we're referring to a vector component from react-sdk
|
// FIXME: we're referring to a vector component from react-sdk
|
||||||
var BottomLeftMenuTile = sdk.getComponent('rooms.BottomLeftMenuTile');
|
var BottomLeftMenuTile = sdk.getComponent('rooms.BottomLeftMenuTile');
|
||||||
startChat = <BottomLeftMenuTile collapsed={ false } img="img/create-big.svg" label="Start chat" onClick={ this.onChatClick }/>
|
|
||||||
|
var label;
|
||||||
|
if (this.state.existingOneToOneRoomId) {
|
||||||
|
if (this.state.existingOneToOneRoomId == this.props.member.roomId) {
|
||||||
|
label = "Start new direct chat";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
label = "Go to direct chat";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
label = "Start direct chat";
|
||||||
|
}
|
||||||
|
|
||||||
|
startChat = <BottomLeftMenuTile collapsed={ false } img="img/create-big.svg"
|
||||||
|
label={ label } onClick={ this.onChatClick }/>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.state.updating) {
|
if (this.state.updating) {
|
||||||
|
|
Loading…
Reference in a new issue