From 878e31eba2a33ab12a7bf2e119008c1e9c9cdf3b Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Tue, 21 Feb 2017 17:22:22 +0000
Subject: [PATCH 1/8] Show UDDialog on m.call.invite failure
Requires https://github.com/matrix-org/matrix-js-sdk/pull/378
Also, refactored UDDialog creation into its own dispatch event, because there will be other parts of the code that will want to spawn one.
---
src/CallHandler.js | 12 ++++++++++--
src/Resend.js | 18 +++++++-----------
src/components/structures/MatrixChat.js | 12 ++++++++++++
.../views/dialogs/UnknownDeviceDialog.js | 2 +-
.../views/rooms/MessageComposerInputOld.js | 13 ++++---------
5 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/src/CallHandler.js b/src/CallHandler.js
index 268a599d8e..4d25212c0c 100644
--- a/src/CallHandler.js
+++ b/src/CallHandler.js
@@ -100,8 +100,16 @@ function pause(audioId) {
function _setCallListeners(call) {
call.on("error", function(err) {
- console.error("Call error: %s", err);
- console.error(err.stack);
+ if (err.name === "UnknownDeviceError") {
+ dis.dispatch({
+ action: 'unknown_device_error',
+ err: err,
+ room: MatrixClientPeg.get().getRoom(call.roomId),
+ });
+ } else {
+ console.error("Call error: %s", err);
+ console.error(err.stack);
+ }
call.hangup();
_setCallState(undefined, call.roomId, "ended");
});
diff --git a/src/Resend.js b/src/Resend.js
index e2f0c5a1ee..c9a0bf8aa8 100644
--- a/src/Resend.js
+++ b/src/Resend.js
@@ -21,8 +21,9 @@ var Modal = require('./Modal');
module.exports = {
resend: function(event) {
+ const room = MatrixClientPeg.get().getRoom(event.getRoomId());
MatrixClientPeg.get().resendEvent(
- event, MatrixClientPeg.get().getRoom(event.getRoomId())
+ event, room
).done(function(res) {
dis.dispatch({
action: 'message_sent',
@@ -33,16 +34,11 @@ module.exports = {
// https://github.com/vector-im/riot-web/issues/3148
console.log('Resend got send failure: ' + err.name + '('+err+')');
if (err.name === "UnknownDeviceError") {
- var UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog");
- Modal.createDialog(UnknownDeviceDialog, {
- devices: err.devices,
- room: MatrixClientPeg.get().getRoom(event.getRoomId()),
- onFinished: (r) => {
- // XXX: temporary logging to try to diagnose
- // https://github.com/vector-im/riot-web/issues/3148
- console.log('UnknownDeviceDialog closed with '+r);
- },
- }, "mx_Dialog_unknownDevice");
+ dis.dispatch({
+ action: 'unknown_device_error',
+ err: err,
+ room: room,
+ });
}
dis.dispatch({
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index e885614ffe..6b191305f2 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -518,6 +518,18 @@ module.exports = React.createClass({
case 'set_theme':
this._onSetTheme(payload.value);
break;
+ case 'unknown_device_error':
+ var UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog");
+ Modal.createDialog(UnknownDeviceDialog, {
+ devices: payload.err.devices,
+ room: payload.room,
+ onFinished: (r) => {
+ // XXX: temporary logging to try to diagnose
+ // https://github.com/vector-im/riot-web/issues/3148
+ console.log('UnknownDeviceDialog closed with '+r);
+ },
+ }, "mx_Dialog_unknownDevice");
+ break;
case 'on_logged_in':
this._onLoggedIn();
break;
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 3bebb8fdda..9b043814bc 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -85,7 +85,7 @@ UnknownDeviceList.propTypes = {
export default React.createClass({
- displayName: 'UnknownEventDialog',
+ displayName: 'UnknownDeviceDialog',
propTypes: {
room: React.PropTypes.object.isRequired,
diff --git a/src/components/views/rooms/MessageComposerInputOld.js b/src/components/views/rooms/MessageComposerInputOld.js
index 020c2238cb..e47bc3f566 100644
--- a/src/components/views/rooms/MessageComposerInputOld.js
+++ b/src/components/views/rooms/MessageComposerInputOld.js
@@ -34,16 +34,11 @@ export function onSendMessageFailed(err, room) {
// https://github.com/vector-im/riot-web/issues/3148
console.log('MessageComposer got send failure: ' + err.name + '('+err+')');
if (err.name === "UnknownDeviceError") {
- const UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog");
- Modal.createDialog(UnknownDeviceDialog, {
- devices: err.devices,
+ dis.dispatch({
+ action: 'unknown_device_error',
+ err: err,
room: room,
- onFinished: (r) => {
- // XXX: temporary logging to try to diagnose
- // https://github.com/vector-im/riot-web/issues/3148
- console.log('UnknownDeviceDialog closed with '+r);
- },
- }, "mx_Dialog_unknownDevice");
+ });
}
dis.dispatch({
action: 'message_send_failed',
From c13ff254b1c530601e6996039b14bfe429aadb9f Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 22 Feb 2017 10:21:43 +0000
Subject: [PATCH 2/8] Add "Retry" button to UDE
---
src/components/structures/MatrixChat.js | 15 +++++++++++++++
src/components/structures/RoomView.js | 12 ++++++------
.../views/dialogs/UnknownDeviceDialog.js | 15 +++++++++++++--
3 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 6b191305f2..a816769891 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -26,6 +26,7 @@ var ContextualMenu = require("./ContextualMenu");
var RoomListSorter = require("../../RoomListSorter");
var UserActivity = require("../../UserActivity");
var Presence = require("../../Presence");
+var Resend = require("../../Resend");
var dis = require("../../dispatcher");
var Login = require("./login/Login");
@@ -530,6 +531,20 @@ module.exports = React.createClass({
},
}, "mx_Dialog_unknownDevice");
break;
+ case 'resend_all_events':
+ payload.room.getPendingEvents().filter(function(ev) {
+ return ev.status === Matrix.EventStatus.NOT_SENT;
+ }).forEach(function(event) {
+ Resend.resend(event);
+ });
+ break;
+ case 'cancel_all_events':
+ payload.room.getPendingEvents().filter(function(ev) {
+ return ev.status === Matrix.EventStatus.NOT_SENT;
+ }).forEach(function(event) {
+ Resend.removeFromQueue(event);
+ });
+ break;
case 'on_logged_in':
this._onLoggedIn();
break;
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index acdea38c69..f3d62699d9 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -716,16 +716,16 @@ module.exports = React.createClass({
},
onResendAllClick: function() {
- var eventsToResend = this._getUnsentMessages(this.state.room);
- eventsToResend.forEach(function(event) {
- Resend.resend(event);
+ dis.dispatch({
+ action: 'resend_all_events',
+ room: this.state.room,
});
},
onCancelAllClick: function() {
- var eventsToResend = this._getUnsentMessages(this.state.room);
- eventsToResend.forEach(function(event) {
- Resend.removeFromQueue(event);
+ dis.dispatch({
+ action: 'cancel_all_events',
+ room: this.state.room,
});
},
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 9b043814bc..880ea0e2b4 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -16,6 +16,7 @@ limitations under the License.
import React from 'react';
import sdk from '../../../index';
+import dis from '../../../dispatcher';
import MatrixClientPeg from '../../../MatrixClientPeg';
import GeminiScrollbar from 'react-gemini-scrollbar';
@@ -131,8 +132,8 @@ export default React.createClass({
We recommend you go through the verification process
- for each device before continuing, but you can resend
- the message without verifying if you prefer.
+ for each device before continuing, but you can retry
+ without verifying if you prefer.
);
@@ -160,6 +161,16 @@ export default React.createClass({
+
{
+ this.props.onFinished();
+ dis.dispatch({
+ action: 'resend_all_events',
+ room: this.props.room,
+ });
+ }}>
+ Retry
+
{
// XXX: temporary logging to try to diagnose
From 9515cf2cf2edf248b71cdb1a9fbcf0f747e0f252 Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 22 Feb 2017 16:12:37 +0000
Subject: [PATCH 3/8] Only hangup on call errors, not errors on sendEvent
---
src/CallHandler.js | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/CallHandler.js b/src/CallHandler.js
index 4d25212c0c..bb46056d19 100644
--- a/src/CallHandler.js
+++ b/src/CallHandler.js
@@ -100,18 +100,19 @@ function pause(audioId) {
function _setCallListeners(call) {
call.on("error", function(err) {
+ console.error("Call error: %s", err);
+ console.error(err.stack);
+ call.hangup();
+ _setCallState(undefined, call.roomId, "ended");
+ });
+ call.on('send_event_error', function(err) {
if (err.name === "UnknownDeviceError") {
dis.dispatch({
action: 'unknown_device_error',
err: err,
room: MatrixClientPeg.get().getRoom(call.roomId),
});
- } else {
- console.error("Call error: %s", err);
- console.error(err.stack);
}
- call.hangup();
- _setCallState(undefined, call.roomId, "ended");
});
call.on("hangup", function() {
_setCallState(undefined, call.roomId, "ended");
From 816e0be3a089fd8040ad759832131d4f26ad2466 Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 22 Feb 2017 16:17:49 +0000
Subject: [PATCH 4/8] Retry->Send anyway
---
src/components/views/dialogs/UnknownDeviceDialog.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 880ea0e2b4..4dc6f9048d 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -169,7 +169,7 @@ export default React.createClass({
room: this.props.room,
});
}}>
- Retry
+ Send anyway
{
From 436e6b36f1814d13398cd990ed410b6fbaa394b8 Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 22 Feb 2017 16:42:14 +0000
Subject: [PATCH 5/8] Move UDE handling to a its own file, adjust wording
---
src/UnknownDeviceErrorHandler.js | 32 +++++++++++++++++++
src/components/structures/MatrixChat.js | 15 ++-------
.../views/dialogs/UnknownDeviceDialog.js | 2 +-
3 files changed, 36 insertions(+), 13 deletions(-)
create mode 100644 src/UnknownDeviceErrorHandler.js
diff --git a/src/UnknownDeviceErrorHandler.js b/src/UnknownDeviceErrorHandler.js
new file mode 100644
index 0000000000..c5a3870f40
--- /dev/null
+++ b/src/UnknownDeviceErrorHandler.js
@@ -0,0 +1,32 @@
+import dis from './dispatcher';
+import sdk from './index';
+import Modal from './Modal';
+
+const onAction = function(payload) {
+ if (payload.action === 'unknown_device_error') {
+ var UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog");
+ Modal.createDialog(UnknownDeviceDialog, {
+ devices: payload.err.devices,
+ room: payload.room,
+ onFinished: (r) => {
+ // XXX: temporary logging to try to diagnose
+ // https://github.com/vector-im/riot-web/issues/3148
+ console.log('UnknownDeviceDialog closed with '+r);
+ },
+ }, "mx_Dialog_unknownDevice");
+ }
+}
+
+let ref = null;
+
+module.exports = {
+ startListening: function () {
+ ref = dis.register(onAction);
+ },
+ stopListening: function () {
+ if (ref){
+ dis.unregister(ref);
+ ref = null;
+ }
+ },
+};
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index a816769891..695e1084fe 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -42,6 +42,7 @@ var Lifecycle = require('../../Lifecycle');
var PageTypes = require('../../PageTypes');
var createRoom = require("../../createRoom");
+var UDEHandler = require("../../UnknownDeviceErrorHandler");
module.exports = React.createClass({
displayName: 'MatrixChat',
@@ -240,6 +241,7 @@ module.exports = React.createClass({
componentDidMount: function() {
this.dispatcherRef = dis.register(this.onAction);
+ UDEHandler.startListening();
this.focusComposer = false;
window.addEventListener("focus", this.onFocus);
@@ -286,6 +288,7 @@ module.exports = React.createClass({
componentWillUnmount: function() {
Lifecycle.stopMatrixClient();
dis.unregister(this.dispatcherRef);
+ UDEHandler.stopListening();
window.removeEventListener("focus", this.onFocus);
window.removeEventListener('resize', this.handleResize);
},
@@ -519,18 +522,6 @@ module.exports = React.createClass({
case 'set_theme':
this._onSetTheme(payload.value);
break;
- case 'unknown_device_error':
- var UnknownDeviceDialog = sdk.getComponent("dialogs.UnknownDeviceDialog");
- Modal.createDialog(UnknownDeviceDialog, {
- devices: payload.err.devices,
- room: payload.room,
- onFinished: (r) => {
- // XXX: temporary logging to try to diagnose
- // https://github.com/vector-im/riot-web/issues/3148
- console.log('UnknownDeviceDialog closed with '+r);
- },
- }, "mx_Dialog_unknownDevice");
- break;
case 'resend_all_events':
payload.room.getPendingEvents().filter(function(ev) {
return ev.status === Matrix.EventStatus.NOT_SENT;
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 4dc6f9048d..75c27a6f1b 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -132,7 +132,7 @@ export default React.createClass({
We recommend you go through the verification process
- for each device before continuing, but you can retry
+ for each device before continuing, but you can send
without verifying if you prefer.
From b68b0e25c874ac9ec9853c889b7f9f1bbaadd833 Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 22 Feb 2017 16:59:45 +0000
Subject: [PATCH 6/8] Merge Matthew's wording patch
---
src/components/views/dialogs/UnknownDeviceDialog.js | 11 +++--------
1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 75c27a6f1b..97e6c8391c 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -126,14 +126,10 @@ export default React.createClass({
} else {
warning = (
-
- This means there is no guarantee that the devices
- belong to the users they claim to.
-
We recommend you go through the verification process
- for each device before continuing, but you can send
- without verifying if you prefer.
+ for each device to confirm they belong to their legitimate owner,
+ but you can resend the message without verifying if you prefer.
);
@@ -152,8 +148,7 @@ export default React.createClass({
>
- This room contains unknown devices which have not been
- verified.
+ This room contains devices that you haven't seen before.
{ warning }
Unknown devices:
From 7221900497d48b4d059dbfd300fdac596dec972a Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Mon, 27 Feb 2017 13:39:12 +0000
Subject: [PATCH 7/8] Refactor remove resend_all_events and cancel_all_events
dispatches
---
src/Resend.js | 15 ++++++++++++++-
src/components/structures/MatrixChat.js | 15 ---------------
src/components/structures/RoomView.js | 10 ++--------
.../views/dialogs/UnknownDeviceDialog.js | 5 +----
4 files changed, 17 insertions(+), 28 deletions(-)
diff --git a/src/Resend.js b/src/Resend.js
index c9a0bf8aa8..d06562780c 100644
--- a/src/Resend.js
+++ b/src/Resend.js
@@ -20,6 +20,20 @@ var sdk = require('./index');
var Modal = require('./Modal');
module.exports = {
+ resendUnsentEvents: function(room) {
+ room.getPendingEvents().filter(function(ev) {
+ return ev.status === Matrix.EventStatus.NOT_SENT;
+ }).forEach(function(event) {
+ module.exports.resend(event);
+ });
+ },
+ cancelUnsentEvents: function(room) {
+ room.getPendingEvents().filter(function(ev) {
+ return ev.status === Matrix.EventStatus.NOT_SENT;
+ }).forEach(function(event) {
+ module.exports.removeFromQueue(event);
+ });
+ },
resend: function(event) {
const room = MatrixClientPeg.get().getRoom(event.getRoomId());
MatrixClientPeg.get().resendEvent(
@@ -47,7 +61,6 @@ module.exports = {
});
});
},
-
removeFromQueue: function(event) {
MatrixClientPeg.get().cancelPendingEvent(event);
dis.dispatch({
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 695e1084fe..49b700df01 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -26,7 +26,6 @@ var ContextualMenu = require("./ContextualMenu");
var RoomListSorter = require("../../RoomListSorter");
var UserActivity = require("../../UserActivity");
var Presence = require("../../Presence");
-var Resend = require("../../Resend");
var dis = require("../../dispatcher");
var Login = require("./login/Login");
@@ -522,20 +521,6 @@ module.exports = React.createClass({
case 'set_theme':
this._onSetTheme(payload.value);
break;
- case 'resend_all_events':
- payload.room.getPendingEvents().filter(function(ev) {
- return ev.status === Matrix.EventStatus.NOT_SENT;
- }).forEach(function(event) {
- Resend.resend(event);
- });
- break;
- case 'cancel_all_events':
- payload.room.getPendingEvents().filter(function(ev) {
- return ev.status === Matrix.EventStatus.NOT_SENT;
- }).forEach(function(event) {
- Resend.removeFromQueue(event);
- });
- break;
case 'on_logged_in':
this._onLoggedIn();
break;
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index f3d62699d9..3d676a793d 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -716,17 +716,11 @@ module.exports = React.createClass({
},
onResendAllClick: function() {
- dis.dispatch({
- action: 'resend_all_events',
- room: this.state.room,
- });
+ Resend.resendUnsentEvents(this.state.room);
},
onCancelAllClick: function() {
- dis.dispatch({
- action: 'cancel_all_events',
- room: this.state.room,
- });
+ Resend.cancelUnsentEvents(this.state.room);
},
onJoinButtonClicked: function(ev) {
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index 97e6c8391c..3581b9815e 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -159,10 +159,7 @@ export default React.createClass({
{
this.props.onFinished();
- dis.dispatch({
- action: 'resend_all_events',
- room: this.props.room,
- });
+ Resend.resendUnsentEvents(this.props.room);
}}>
Send anyway
From 39427839b9e253c640307d057f82dd897e44a731 Mon Sep 17 00:00:00 2001
From: Luke Barnard
Date: Wed, 1 Mar 2017 14:33:25 +0000
Subject: [PATCH 8/8] Use ES6 export style
---
src/UnknownDeviceErrorHandler.js | 21 ++++++++++-----------
src/components/structures/MatrixChat.js | 2 +-
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/src/UnknownDeviceErrorHandler.js b/src/UnknownDeviceErrorHandler.js
index c5a3870f40..88f4f57fe4 100644
--- a/src/UnknownDeviceErrorHandler.js
+++ b/src/UnknownDeviceErrorHandler.js
@@ -19,14 +19,13 @@ const onAction = function(payload) {
let ref = null;
-module.exports = {
- startListening: function () {
- ref = dis.register(onAction);
- },
- stopListening: function () {
- if (ref){
- dis.unregister(ref);
- ref = null;
- }
- },
-};
+export function startListening () {
+ ref = dis.register(onAction);
+}
+
+export function stopListening () {
+ if (ref) {
+ dis.unregister(ref);
+ ref = null;
+ }
+}
diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index 49b700df01..eb5447b822 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -41,7 +41,7 @@ var Lifecycle = require('../../Lifecycle');
var PageTypes = require('../../PageTypes');
var createRoom = require("../../createRoom");
-var UDEHandler = require("../../UnknownDeviceErrorHandler");
+import * as UDEHandler from '../../UnknownDeviceErrorHandler';
module.exports = React.createClass({
displayName: 'MatrixChat',