mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-17 05:55:00 +08:00
Merge remote-tracking branch 'origin/develop' into rav/timeline_window
This commit is contained in:
commit
2479c81cf6
@ -23,7 +23,9 @@ module.exports = {
|
|||||||
* count of unread messages
|
* count of unread messages
|
||||||
*/
|
*/
|
||||||
eventTriggersUnreadCount: function(ev) {
|
eventTriggersUnreadCount: function(ev) {
|
||||||
if (ev.getType() == "m.room.member") {
|
if (ev.sender && ev.sender.userId == MatrixClientPeg.get().credentials.userId) {
|
||||||
|
return false;
|
||||||
|
} else if (ev.getType() == "m.room.member") {
|
||||||
return false;
|
return false;
|
||||||
} else if (ev.getType == 'm.room.message' && ev.getContent().msgtype == 'm.notify') {
|
} else if (ev.getType == 'm.room.message' && ev.getContent().msgtype == 'm.notify') {
|
||||||
return false;
|
return false;
|
||||||
|
@ -96,6 +96,14 @@ module.exports = React.createClass({
|
|||||||
if (!this.props.config || !this.props.config.default_hs_url) {
|
if (!this.props.config || !this.props.config.default_hs_url) {
|
||||||
console.error("Cannot enable guest access: No supplied config prop for HS/IS URLs");
|
console.error("Cannot enable guest access: No supplied config prop for HS/IS URLs");
|
||||||
}
|
}
|
||||||
|
else if (this.props.startingQueryParams.email) {
|
||||||
|
console.log("Not registering as guest; email invite.");
|
||||||
|
this._autoRegisterAsGuest = false;
|
||||||
|
}
|
||||||
|
else if (this.props.startingQueryParams.client_secret && this.props.startingQueryParams.sid) {
|
||||||
|
console.log("Not registering as guest; registration.");
|
||||||
|
this._autoRegisterAsGuest = false;
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
this._autoRegisterAsGuest = true;
|
this._autoRegisterAsGuest = true;
|
||||||
}
|
}
|
||||||
@ -200,7 +208,6 @@ module.exports = React.createClass({
|
|||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case 'start_registration':
|
case 'start_registration':
|
||||||
if (this.state.logged_in) return;
|
|
||||||
var newState = payload.params || {};
|
var newState = payload.params || {};
|
||||||
newState.screen = 'register';
|
newState.screen = 'register';
|
||||||
if (
|
if (
|
||||||
@ -635,6 +642,14 @@ module.exports = React.createClass({
|
|||||||
action: 'start_post_registration',
|
action: 'start_post_registration',
|
||||||
});
|
});
|
||||||
} else if (screen.indexOf('room/') == 0) {
|
} else if (screen.indexOf('room/') == 0) {
|
||||||
|
|
||||||
|
if (!this.state.logged_in && this.props.startingQueryParams.email) {
|
||||||
|
console.log("Redirecting to email registration");
|
||||||
|
this.showScreen("register");
|
||||||
|
this.notifyNewScreen('register'); // this doesn't call showScreen, just updates the hash
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var roomString = screen.split('/')[1];
|
var roomString = screen.split('/')[1];
|
||||||
if (roomString[0] == '#') {
|
if (roomString[0] == '#') {
|
||||||
if (this.state.logged_in) {
|
if (this.state.logged_in) {
|
||||||
@ -656,7 +671,7 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (screen) console.error("Unknown screen : %s", screen);
|
console.error("Unknown screen : %s", screen);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -809,6 +824,7 @@ module.exports = React.createClass({
|
|||||||
var CreateRoom = sdk.getComponent('structures.CreateRoom');
|
var CreateRoom = sdk.getComponent('structures.CreateRoom');
|
||||||
var RoomDirectory = sdk.getComponent('structures.RoomDirectory');
|
var RoomDirectory = sdk.getComponent('structures.RoomDirectory');
|
||||||
var MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
|
var MatrixToolbar = sdk.getComponent('globals.MatrixToolbar');
|
||||||
|
var GuestWarningBar = sdk.getComponent('globals.GuestWarningBar');
|
||||||
var ForgotPassword = sdk.getComponent('structures.login.ForgotPassword');
|
var ForgotPassword = sdk.getComponent('structures.login.ForgotPassword');
|
||||||
|
|
||||||
// needs to be before normal PageTypes as you are logged in technically
|
// needs to be before normal PageTypes as you are logged in technically
|
||||||
@ -849,7 +865,20 @@ module.exports = React.createClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Fix duplication here and do conditionals like we do above
|
// TODO: Fix duplication here and do conditionals like we do above
|
||||||
if (Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) {
|
if (MatrixClientPeg.get().isGuest()) {
|
||||||
|
return (
|
||||||
|
<div className="mx_MatrixChat_wrapper">
|
||||||
|
<GuestWarningBar />
|
||||||
|
<div className="mx_MatrixChat mx_MatrixChat_toolbarShowing">
|
||||||
|
<LeftPanel selectedRoom={this.state.currentRoom} collapsed={this.state.collapse_lhs} />
|
||||||
|
<main className="mx_MatrixChat_middlePanel">
|
||||||
|
{page_element}
|
||||||
|
</main>
|
||||||
|
{right_panel}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
} else if (Notifier.supportsDesktopNotifications() && !Notifier.isEnabled() && !Notifier.isToolbarHidden()) {
|
||||||
return (
|
return (
|
||||||
<div className="mx_MatrixChat_wrapper">
|
<div className="mx_MatrixChat_wrapper">
|
||||||
<MatrixToolbar />
|
<MatrixToolbar />
|
||||||
|
@ -933,7 +933,7 @@ module.exports = React.createClass({
|
|||||||
var hr;
|
var hr;
|
||||||
hr = (<hr className="mx_RoomView_myReadMarker" style={{opacity: 1, width: '99%'}} ref={function(n) {
|
hr = (<hr className="mx_RoomView_myReadMarker" style={{opacity: 1, width: '99%'}} ref={function(n) {
|
||||||
Velocity(n, {opacity: '0', width: '10%'}, {duration: 400, easing: 'easeInSine', delay: 1000, complete: function() {
|
Velocity(n, {opacity: '0', width: '10%'}, {duration: 400, easing: 'easeInSine', delay: 1000, complete: function() {
|
||||||
self.setState({readMarkerGhostEventId: undefined});
|
if (!self.unmounted) self.setState({readMarkerGhostEventId: undefined});
|
||||||
}});
|
}});
|
||||||
}} />);
|
}} />);
|
||||||
ret.splice(ghostIndex, 0, (
|
ret.splice(ghostIndex, 0, (
|
||||||
|
@ -160,8 +160,8 @@ module.exports = React.createClass({
|
|||||||
// content. So don't call it in render() cycles.
|
// content. So don't call it in render() cycles.
|
||||||
isAtBottom: function() {
|
isAtBottom: function() {
|
||||||
var sn = this._getScrollNode();
|
var sn = this._getScrollNode();
|
||||||
// + 1 here to avoid fractional pixel rounding errors
|
// + 2 here to avoid fractional pixel rounding errors
|
||||||
return sn.scrollHeight - sn.scrollTop <= sn.clientHeight + 1;
|
return sn.scrollHeight - sn.scrollTop <= sn.clientHeight + 2;
|
||||||
},
|
},
|
||||||
|
|
||||||
// check the scroll state and send out backfill requests if necessary.
|
// check the scroll state and send out backfill requests if necessary.
|
||||||
|
@ -148,7 +148,8 @@ module.exports = React.createClass({
|
|||||||
|
|
||||||
onUpgradeClicked: function() {
|
onUpgradeClicked: function() {
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: "start_upgrade_registration"
|
//action: "start_upgrade_registration"
|
||||||
|
action: "start_registration" // temporary (https://github.com/vector-im/vector-web/issues/818)
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ module.exports = React.createClass({
|
|||||||
onHomeserverChanged: function(ev) {
|
onHomeserverChanged: function(ev) {
|
||||||
this.setState({hs_url: ev.target.value}, function() {
|
this.setState({hs_url: ev.target.value}, function() {
|
||||||
this._hsTimeoutId = this._waitThenInvoke(this._hsTimeoutId, function() {
|
this._hsTimeoutId = this._waitThenInvoke(this._hsTimeoutId, function() {
|
||||||
this.props.onHsUrlChanged(this.state.hs_url);
|
this.props.onHsUrlChanged(this.state.hs_url.replace(/\/$/, ""));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -66,7 +66,7 @@ module.exports = React.createClass({
|
|||||||
onIdentityServerChanged: function(ev) {
|
onIdentityServerChanged: function(ev) {
|
||||||
this.setState({is_url: ev.target.value}, function() {
|
this.setState({is_url: ev.target.value}, function() {
|
||||||
this._isTimeoutId = this._waitThenInvoke(this._isTimeoutId, function() {
|
this._isTimeoutId = this._waitThenInvoke(this._isTimeoutId, function() {
|
||||||
this.props.onIsUrlChanged(this.state.is_url);
|
this.props.onIsUrlChanged(this.state.is_url.replace(/\/$/, ""));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -29,6 +29,8 @@ var SHARE_HISTORY_WARNING = "Newly invited users will see the history of this ro
|
|||||||
"turn off, 'Share message history with new users' in the settings for this room.";
|
"turn off, 'Share message history with new users' in the settings for this room.";
|
||||||
|
|
||||||
var shown_invite_warning_this_session = false;
|
var shown_invite_warning_this_session = false;
|
||||||
|
// global promise so people can bulk invite and they all get resolved
|
||||||
|
var invite_defer = q.defer();
|
||||||
|
|
||||||
module.exports = React.createClass({
|
module.exports = React.createClass({
|
||||||
displayName: 'MemberList',
|
displayName: 'MemberList',
|
||||||
@ -158,6 +160,20 @@ module.exports = React.createClass({
|
|||||||
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog");
|
||||||
var self = this;
|
var self = this;
|
||||||
inputText = inputText.trim(); // react requires es5-shim so we know trim() exists
|
inputText = inputText.trim(); // react requires es5-shim so we know trim() exists
|
||||||
|
|
||||||
|
// email addresses and user IDs do not allow space, comma, semicolon so split
|
||||||
|
// on them for bulk inviting.
|
||||||
|
var separators =[ ";", " ", "," ];
|
||||||
|
for (var i = 0; i < separators.length; i++) {
|
||||||
|
if (inputText.indexOf(separators[i]) >= 0) {
|
||||||
|
var inputs = inputText.split(separators[i]);
|
||||||
|
inputs.forEach(function(input) {
|
||||||
|
self.onInvite(input);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var isEmailAddress = /^\S+@\S+\.\S+$/.test(inputText);
|
var isEmailAddress = /^\S+@\S+\.\S+$/.test(inputText);
|
||||||
|
|
||||||
// sanity check the input for user IDs
|
// sanity check the input for user IDs
|
||||||
@ -170,13 +186,14 @@ module.exports = React.createClass({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var invite_defer = q.defer();
|
var inviteWarningDefer = q.defer();
|
||||||
|
|
||||||
var room = MatrixClientPeg.get().getRoom(this.props.roomId);
|
var room = MatrixClientPeg.get().getRoom(this.props.roomId);
|
||||||
var history_visibility = room.currentState.getStateEvents('m.room.history_visibility', '');
|
var history_visibility = room.currentState.getStateEvents('m.room.history_visibility', '');
|
||||||
if (history_visibility) history_visibility = history_visibility.getContent().history_visibility;
|
if (history_visibility) history_visibility = history_visibility.getContent().history_visibility;
|
||||||
|
|
||||||
if (history_visibility == 'shared' && !shown_invite_warning_this_session) {
|
if (history_visibility == 'shared' && !shown_invite_warning_this_session) {
|
||||||
|
inviteWarningDefer = invite_defer; // whether we continue depends on this defer
|
||||||
var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
var QuestionDialog = sdk.getComponent("dialogs.QuestionDialog");
|
||||||
Modal.createDialog(QuestionDialog, {
|
Modal.createDialog(QuestionDialog, {
|
||||||
title: "Warning",
|
title: "Warning",
|
||||||
@ -188,14 +205,17 @@ module.exports = React.createClass({
|
|||||||
invite_defer.resolve();
|
invite_defer.resolve();
|
||||||
} else {
|
} else {
|
||||||
invite_defer.reject(null);
|
invite_defer.reject(null);
|
||||||
|
// reset the promise so we don't auto-reject all invites from
|
||||||
|
// now on.
|
||||||
|
invite_defer = q.defer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
invite_defer.resolve();
|
inviteWarningDefer.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
var promise = invite_defer.promise;;
|
var promise = inviteWarningDefer.promise;
|
||||||
if (isEmailAddress) {
|
if (isEmailAddress) {
|
||||||
promise = promise.then(function() {
|
promise = promise.then(function() {
|
||||||
MatrixClientPeg.get().inviteByEmail(self.props.roomId, inputText);
|
MatrixClientPeg.get().inviteByEmail(self.props.roomId, inputText);
|
||||||
@ -214,7 +234,7 @@ module.exports = React.createClass({
|
|||||||
"Invite %s to %s - isEmail=%s", inputText, this.props.roomId, isEmailAddress
|
"Invite %s to %s - isEmail=%s", inputText, this.props.roomId, isEmailAddress
|
||||||
);
|
);
|
||||||
promise.done(function(res) {
|
promise.done(function(res) {
|
||||||
console.log("Invited");
|
console.log("Invited %s", inputText);
|
||||||
self.setState({
|
self.setState({
|
||||||
inviting: false
|
inviting: false
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user