Suggest to invite people when speaking in an empty room
Adds vector-im/riot-web#1053 Signed-off-by: Travis Ralston <travpc@gmail.com>
This commit is contained in:
parent
757e42ddca
commit
f3b1baa3c0
3 changed files with 66 additions and 1 deletions
|
@ -43,6 +43,10 @@ module.exports = React.createClass({
|
||||||
// the end of the live timeline.
|
// the end of the live timeline.
|
||||||
atEndOfLiveTimeline: React.PropTypes.bool,
|
atEndOfLiveTimeline: React.PropTypes.bool,
|
||||||
|
|
||||||
|
// This is true when the user is alone in the room, but has also sent a message.
|
||||||
|
// Used to suggest to the user to invite someone
|
||||||
|
sentMessageAndIsAlone: React.PropTypes.bool,
|
||||||
|
|
||||||
// true if there is an active call in this room (means we show
|
// true if there is an active call in this room (means we show
|
||||||
// the 'Active Call' text in the status bar if there is nothing
|
// the 'Active Call' text in the status bar if there is nothing
|
||||||
// more interesting)
|
// more interesting)
|
||||||
|
@ -60,6 +64,14 @@ module.exports = React.createClass({
|
||||||
// 'unsent messages' bar
|
// 'unsent messages' bar
|
||||||
onCancelAllClick: React.PropTypes.func,
|
onCancelAllClick: React.PropTypes.func,
|
||||||
|
|
||||||
|
// callback for when the user clicks on the 'invite others' button in the
|
||||||
|
// 'you are alone' bar
|
||||||
|
onInviteClick: React.PropTypes.func,
|
||||||
|
|
||||||
|
// callback for when the user clicks on the 'stop warning me' button in the
|
||||||
|
// 'you are alone' bar
|
||||||
|
onStopWarningClick: React.PropTypes.func,
|
||||||
|
|
||||||
// callback for when the user clicks on the 'scroll to bottom' button
|
// callback for when the user clicks on the 'scroll to bottom' button
|
||||||
onScrollToBottomClick: React.PropTypes.func,
|
onScrollToBottomClick: React.PropTypes.func,
|
||||||
|
|
||||||
|
@ -140,7 +152,8 @@ module.exports = React.createClass({
|
||||||
(this.state.usersTyping.length > 0) ||
|
(this.state.usersTyping.length > 0) ||
|
||||||
this.props.numUnreadMessages ||
|
this.props.numUnreadMessages ||
|
||||||
!this.props.atEndOfLiveTimeline ||
|
!this.props.atEndOfLiveTimeline ||
|
||||||
this.props.hasActiveCall
|
this.props.hasActiveCall ||
|
||||||
|
this.props.sentMessageAndIsAlone
|
||||||
) {
|
) {
|
||||||
return STATUS_BAR_EXPANDED;
|
return STATUS_BAR_EXPANDED;
|
||||||
} else if (this.props.unsentMessageError) {
|
} else if (this.props.unsentMessageError) {
|
||||||
|
@ -305,6 +318,21 @@ module.exports = React.createClass({
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If you're alone in the room, and have sent a message, suggest to invite someone
|
||||||
|
if (this.props.sentMessageAndIsAlone) {
|
||||||
|
return (
|
||||||
|
<div className="mx_RoomStatusBar_isAlone">
|
||||||
|
{ _tJsx("There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?",
|
||||||
|
[/<a>(.*?)<\/a>/, /<a>(.*?)<\/a>/],
|
||||||
|
[
|
||||||
|
(sub) => <a className="mx_RoomStatusBar_resend_link" key="invite" onClick={this.props.onInviteClick}>{ sub }</a>,
|
||||||
|
(sub) => <a className="mx_RoomStatusBar_resend_link" key="nowarn" onClick={this.props.onStopWarningClick}>{ sub }</a>,
|
||||||
|
],
|
||||||
|
) }
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,7 @@ module.exports = React.createClass({
|
||||||
guestsCanJoin: false,
|
guestsCanJoin: false,
|
||||||
canPeek: false,
|
canPeek: false,
|
||||||
showApps: false,
|
showApps: false,
|
||||||
|
isAlone: false,
|
||||||
|
|
||||||
// error object, as from the matrix client/server API
|
// error object, as from the matrix client/server API
|
||||||
// If we failed to load information about the room,
|
// If we failed to load information about the room,
|
||||||
|
@ -453,6 +454,8 @@ module.exports = React.createClass({
|
||||||
switch (payload.action) {
|
switch (payload.action) {
|
||||||
case 'message_send_failed':
|
case 'message_send_failed':
|
||||||
case 'message_sent':
|
case 'message_sent':
|
||||||
|
this._checkIfAlone(this.state.room);
|
||||||
|
// no break; to intentionally fall through
|
||||||
case 'message_send_cancelled':
|
case 'message_send_cancelled':
|
||||||
this.setState({
|
this.setState({
|
||||||
unsentMessageError: this._getUnsentMessageError(this.state.room),
|
unsentMessageError: this._getUnsentMessageError(this.state.room),
|
||||||
|
@ -732,6 +735,20 @@ module.exports = React.createClass({
|
||||||
}
|
}
|
||||||
}, 500),
|
}, 500),
|
||||||
|
|
||||||
|
_checkIfAlone: function(room) {
|
||||||
|
let warnedAboutLonelyRoom = false;
|
||||||
|
if (localStorage) {
|
||||||
|
warnedAboutLonelyRoom = localStorage.getItem('mx_user_alone_warned_' + this.state.room.roomId);
|
||||||
|
}
|
||||||
|
if (warnedAboutLonelyRoom) {
|
||||||
|
if (this.state.isAlone) this.setState({isAlone: false});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const joinedMembers = room.currentState.getMembers().filter(m => m.membership === "join" || m.membership === "invite");
|
||||||
|
this.setState({isAlone: joinedMembers.length === 1});
|
||||||
|
},
|
||||||
|
|
||||||
_getUnsentMessageError: function(room) {
|
_getUnsentMessageError: function(room) {
|
||||||
const unsentMessages = this._getUnsentMessages(room);
|
const unsentMessages = this._getUnsentMessages(room);
|
||||||
if (!unsentMessages.length) return "";
|
if (!unsentMessages.length) return "";
|
||||||
|
@ -813,6 +830,22 @@ module.exports = React.createClass({
|
||||||
Resend.cancelUnsentEvents(this.state.room);
|
Resend.cancelUnsentEvents(this.state.room);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
onInviteButtonClick: function() {
|
||||||
|
// call AddressPickerDialog
|
||||||
|
dis.dispatch({
|
||||||
|
action: 'view_invite',
|
||||||
|
roomId: this.state.room.roomId,
|
||||||
|
});
|
||||||
|
this.setState({isAlone: false}); // there's a good chance they'll invite someone
|
||||||
|
},
|
||||||
|
|
||||||
|
onStopAloneWarningClick: function() {
|
||||||
|
if (localStorage) {
|
||||||
|
localStorage.setItem('mx_user_alone_warned_' + this.state.room.roomId, true);
|
||||||
|
}
|
||||||
|
this.setState({isAlone: false});
|
||||||
|
},
|
||||||
|
|
||||||
onJoinButtonClicked: function(ev) {
|
onJoinButtonClicked: function(ev) {
|
||||||
const cli = MatrixClientPeg.get();
|
const cli = MatrixClientPeg.get();
|
||||||
|
|
||||||
|
@ -1573,9 +1606,12 @@ module.exports = React.createClass({
|
||||||
numUnreadMessages={this.state.numUnreadMessages}
|
numUnreadMessages={this.state.numUnreadMessages}
|
||||||
unsentMessageError={this.state.unsentMessageError}
|
unsentMessageError={this.state.unsentMessageError}
|
||||||
atEndOfLiveTimeline={this.state.atEndOfLiveTimeline}
|
atEndOfLiveTimeline={this.state.atEndOfLiveTimeline}
|
||||||
|
sentMessageAndIsAlone={this.state.isAlone}
|
||||||
hasActiveCall={inCall}
|
hasActiveCall={inCall}
|
||||||
onResendAllClick={this.onResendAllClick}
|
onResendAllClick={this.onResendAllClick}
|
||||||
onCancelAllClick={this.onCancelAllClick}
|
onCancelAllClick={this.onCancelAllClick}
|
||||||
|
onInviteClick={this.onInviteButtonClick}
|
||||||
|
onStopWarningClick={this.onStopAloneWarningClick}
|
||||||
onScrollToBottomClick={this.jumpToLiveTimeline}
|
onScrollToBottomClick={this.jumpToLiveTimeline}
|
||||||
onResize={this.onChildResize}
|
onResize={this.onChildResize}
|
||||||
onVisible={this.onStatusBarVisible}
|
onVisible={this.onStatusBarVisible}
|
||||||
|
|
|
@ -609,6 +609,7 @@
|
||||||
"Room": "Room",
|
"Room": "Room",
|
||||||
"Copied!": "Copied!",
|
"Copied!": "Copied!",
|
||||||
"Failed to copy": "Failed to copy",
|
"Failed to copy": "Failed to copy",
|
||||||
|
"There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?": "There's no one else here! Would you like to <a>invite others</a> or <a>stop warning about the empty room</a>?",
|
||||||
"Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
|
"Connectivity to the server has been lost.": "Connectivity to the server has been lost.",
|
||||||
"Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
|
"Sent messages will be stored until your connection has returned.": "Sent messages will be stored until your connection has returned.",
|
||||||
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.",
|
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.",
|
||||||
|
|
Loading…
Reference in a new issue