diff --git a/src/components/views/dialogs/DeviceVerifyDialog.js b/src/components/views/dialogs/DeviceVerifyDialog.js index ca05d74964..fcb5089785 100644 --- a/src/components/views/dialogs/DeviceVerifyDialog.js +++ b/src/components/views/dialogs/DeviceVerifyDialog.js @@ -24,8 +24,7 @@ import sdk from '../../../index'; import * as FormattingUtils from '../../../utils/FormattingUtils'; import { _t } from '../../../languageHandler'; import {verificationMethods} from 'matrix-js-sdk/lib/crypto'; -import DMRoomMap from '../../../utils/DMRoomMap'; -import createRoom from "../../../createRoom"; +import {ensureDMExists} from "../../../createRoom"; import dis from "../../../dispatcher"; import SettingsStore from '../../../settings/SettingsStore'; @@ -322,23 +321,7 @@ export default class DeviceVerifyDialog extends React.Component { } async function ensureDMExistsAndOpen(userId) { - const client = MatrixClientPeg.get(); - const roomIds = DMRoomMap.shared().getDMRoomsForUserId(userId); - const rooms = roomIds.map(id => client.getRoom(id)); - const suitableDMRooms = rooms.filter(r => { - if (r && r.getMyMembership() === "join") { - const member = r.getMember(userId); - return member && (member.membership === "invite" || member.membership === "join"); - } - return false; - }); - let roomId; - if (suitableDMRooms.length) { - const room = suitableDMRooms[0]; - roomId = room.roomId; - } else { - roomId = await createRoom({dmUserId: userId, spinner: false, andView: false}); - } + const roomId = ensureDMExists(MatrixClientPeg.get(), userId); // don't use andView and spinner in createRoom, together, they cause this dialog to close and reopen, // we causes us to loose the verifier and restart, and we end up having two verification requests dis.dispatch({ diff --git a/src/components/views/right_panel/EncryptionPanel.js b/src/components/views/right_panel/EncryptionPanel.js index 9b32dba30e..7992933864 100644 --- a/src/components/views/right_panel/EncryptionPanel.js +++ b/src/components/views/right_panel/EncryptionPanel.js @@ -18,6 +18,7 @@ import React from 'react'; import EncryptionInfo from "./EncryptionInfo"; import VerificationPanel from "./VerificationPanel"; import MatrixClientPeg from "../../../MatrixClientPeg"; +import {ensureDMExists} from "../../../createRoom"; export default class EncryptionPanel extends React.PureComponent { constructor(props) { @@ -40,9 +41,8 @@ export default class EncryptionPanel extends React.PureComponent { _onStartVerification = async () => { const client = MatrixClientPeg.get(); const {member} = this.props; - // TODO: get the room id of the DM here? - // will this panel be shown in non-DM rooms? - const verificationRequest = await client.requestVerificationDM(member.userId, member.roomId); + const roomId = await ensureDMExists(client, member.userId); + const verificationRequest = await client.requestVerificationDM(member.userId, roomId); this.setState({verificationRequest}); }; } diff --git a/src/createRoom.js b/src/createRoom.js index 0ee90beba8..766c9b0c8f 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -1,5 +1,6 @@ /* Copyright 2015, 2016 OpenMarket Ltd +Copyright 2019 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -20,7 +21,7 @@ import sdk from './index'; import { _t } from './languageHandler'; import dis from "./dispatcher"; import * as Rooms from "./Rooms"; - +import DMRoomMap from "./utils/DMRoomMap"; import {getAddressType} from "./UserAddress"; /** @@ -35,7 +36,7 @@ import {getAddressType} from "./UserAddress"; * @returns {Promise} which resolves to the room id, or null if the * action was aborted or failed. */ -function createRoom(opts) { +export default function createRoom(opts) { opts = opts || {}; if (opts.spinner === undefined) opts.spinner = true; @@ -140,4 +141,22 @@ function createRoom(opts) { }); } -module.exports = createRoom; +export async function ensureDMExists(client, userId) { + const roomIds = DMRoomMap.shared().getDMRoomsForUserId(userId); + const rooms = roomIds.map(id => client.getRoom(id)); + const suitableDMRooms = rooms.filter(r => { + if (r && r.getMyMembership() === "join") { + const member = r.getMember(userId); + return member && (member.membership === "invite" || member.membership === "join"); + } + return false; + }); + let roomId; + if (suitableDMRooms.length) { + const room = suitableDMRooms[0]; + roomId = room.roomId; + } else { + roomId = await createRoom({dmUserId: userId, spinner: false, andView: false}); + } + return roomId; +}