diff --git a/src/UnknownDeviceErrorHandler.js b/src/UnknownDeviceErrorHandler.js
index e7d77b3b66..664fe14eb5 100644
--- a/src/UnknownDeviceErrorHandler.js
+++ b/src/UnknownDeviceErrorHandler.js
@@ -25,7 +25,6 @@ const onAction = function(payload) {
const UnknownDeviceDialog = sdk.getComponent('dialogs.UnknownDeviceDialog');
isDialogOpen = true;
Modal.createTrackedDialog('Unknown Device Error', '', UnknownDeviceDialog, {
- devices: payload.err.devices,
room: payload.room,
onFinished: (r) => {
isDialogOpen = false;
diff --git a/src/components/views/dialogs/UnknownDeviceDialog.js b/src/components/views/dialogs/UnknownDeviceDialog.js
index ee8f307f76..ff2accf0b0 100644
--- a/src/components/views/dialogs/UnknownDeviceDialog.js
+++ b/src/components/views/dialogs/UnknownDeviceDialog.js
@@ -48,8 +48,9 @@ function UserUnknownDeviceList(props) {
const {userId, userDevices} = props;
const deviceListEntries = Object.keys(userDevices).map((deviceId) =>
- ,
+ ,
);
return (
@@ -92,26 +93,60 @@ export default React.createClass({
propTypes: {
room: React.PropTypes.object.isRequired,
- // map from userid -> deviceid -> deviceinfo
- devices: React.PropTypes.object.isRequired,
onFinished: React.PropTypes.func.isRequired,
},
- componentDidMount: function() {
- // Given we've now shown the user the unknown device, it is no longer
- // unknown to them. Therefore mark it as 'known'.
- Object.keys(this.props.devices).forEach((userId) => {
- Object.keys(this.props.devices[userId]).map((deviceId) => {
- MatrixClientPeg.get().setDeviceKnown(userId, deviceId, true);
- });
+ componentWillMount: function() {
+ this._unmounted = false;
+
+ const roomMembers = this.props.room.getJoinedMembers().map((m) => {
+ return m.userId;
});
- // XXX: temporary logging to try to diagnose
- // https://github.com/vector-im/riot-web/issues/3148
- console.log('Opening UnknownDeviceDialog');
+ this.setState({
+ // map from userid -> deviceid -> deviceinfo
+ devices: null,
+ });
+ MatrixClientPeg.get().downloadKeys(roomMembers, false).then((devices) => {
+ if (this._unmounted) return;
+
+ const unknownDevices = {};
+ // This is all devices in this room, so find the unknown ones.
+ Object.keys(devices).forEach((userId) => {
+ Object.keys(devices[userId]).map((deviceId) => {
+ const device = devices[userId][deviceId];
+
+ if (device.isUnverified() && !device.isKnown()) {
+ if (unknownDevices[userId] === undefined) {
+ unknownDevices[userId] = {};
+ }
+ unknownDevices[userId][deviceId] = device;
+ }
+
+ // Given we've now shown the user the unknown device, it is no longer
+ // unknown to them. Therefore mark it as 'known'.
+ if (!device.isKnown()) {
+ MatrixClientPeg.get().setDeviceKnown(userId, deviceId, true);
+ }
+ });
+ });
+
+ this.setState({
+ devices: unknownDevices,
+ });
+ });
+ },
+
+ componentWillUnmount: function() {
+ this._unmounted = true;
},
render: function() {
+ if (this.state.devices === null) {
+ const Spinner = sdk.getComponent("elements.Spinner");
+ return ;
+ }
+
const client = MatrixClientPeg.get();
const blacklistUnverified = client.getGlobalBlacklistUnverifiedDevices() ||
this.props.room.getBlacklistUnverifiedDevices();
@@ -154,7 +189,7 @@ export default React.createClass({
{ warning }
{ _t("Unknown devices") }:
-
+