diff --git a/src/app/organisms/invite-user/InviteUser.jsx b/src/app/organisms/invite-user/InviteUser.jsx index a6ff2421..e7d7f510 100644 --- a/src/app/organisms/invite-user/InviteUser.jsx +++ b/src/app/organisms/invite-user/InviteUser.jsx @@ -6,6 +6,7 @@ import initMatrix from '../../../client/initMatrix'; import cons from '../../../client/state/cons'; import * as roomActions from '../../../client/action/room'; import { selectRoom } from '../../../client/action/navigation'; +import { hasDMWith } from '../../../util/matrixUtil'; import Text from '../../atoms/text/Text'; import Button from '../../atoms/button/Button'; @@ -104,6 +105,13 @@ function InviteUser({ async function createDM(userId) { if (mx.getUserId() === userId) return; + const dmRoomId = hasDMWith(userId); + if (dmRoomId) { + selectRoom(dmRoomId); + onRequestClose(); + return; + } + try { addUserToProc(userId); procUserError.delete(userId); diff --git a/src/app/organisms/profile-viewer/ProfileViewer.jsx b/src/app/organisms/profile-viewer/ProfileViewer.jsx index 34530122..ca4a4ea9 100644 --- a/src/app/organisms/profile-viewer/ProfileViewer.jsx +++ b/src/app/organisms/profile-viewer/ProfileViewer.jsx @@ -10,7 +10,9 @@ import navigation from '../../../client/state/navigation'; import { selectRoom, openReusableContextMenu } from '../../../client/action/navigation'; import * as roomActions from '../../../client/action/room'; -import { getUsername, getUsernameOfRoomMember, getPowerLabel } from '../../../util/matrixUtil'; +import { + getUsername, getUsernameOfRoomMember, getPowerLabel, hasDMWith +} from '../../../util/matrixUtil'; import { getEventCords } from '../../../util/common'; import colorMXID from '../../../util/colorMXID'; @@ -187,17 +189,12 @@ function ProfileFooter({ roomId, userId, onRequestClose }) { }, [userId]); const openDM = async () => { - const directIds = [...initMatrix.roomList.directs]; - // Check and open if user already have a DM with userId. - for (let i = 0; i < directIds.length; i += 1) { - const dRoom = mx.getRoom(directIds[i]); - const roomMembers = dRoom.getMembers(); - if (roomMembers.length <= 2 && dRoom.getMember(userId)) { - selectRoom(directIds[i]); - onRequestClose(); - return; - } + const dmRoomId = hasDMWith(userId); + if (dmRoomId) { + selectRoom(dmRoomId); + onRequestClose(); + return; } // Create new DM diff --git a/src/util/matrixUtil.js b/src/util/matrixUtil.js index e86194e4..5c40fa91 100644 --- a/src/util/matrixUtil.js +++ b/src/util/matrixUtil.js @@ -72,7 +72,22 @@ function parseReply(rawBody) { }; } +function hasDMWith(userId) { + const mx = initMatrix.matrixClient; + const directIds = [...initMatrix.roomList.directs]; + + return directIds.find((roomId) => { + const dRoom = mx.getRoom(roomId); + const roomMembers = dRoom.getMembers(); + if (roomMembers.length <= 2 && dRoom.getMember(userId)) { + return true; + } + return false; + }); +} + export { getBaseUrl, getUsername, getUsernameOfRoomMember, isRoomAliasAvailable, getPowerLabel, parseReply, + hasDMWith, };