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({
+
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({ 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',