diff --git a/src/Rooms.js b/src/Rooms.js index aa025d7dc5..2fda46450f 100644 --- a/src/Rooms.js +++ b/src/Rooms.js @@ -31,26 +31,26 @@ export function getDisplayAliasForRoom(room) { * If the room contains only two members including the logged-in user, * return the other one. Otherwise, return null. */ -export function getOnlyOtherMember(room, me) { - const joinedMembers = room.getJoinedMembers(); +export function getOnlyOtherMember(room, myUserId) { - if (joinedMembers.length === 2) { - return joinedMembers.filter(function(m) { - return m.userId !== me.userId; + if (room.currentState.getJoinedMemberCount() === 2) { + return room.getJoinedMembers().filter(function(m) { + return m.userId !== myUserId; })[0]; } return null; } -function _isConfCallRoom(room, me, conferenceHandler) { +function _isConfCallRoom(room, myUserId, conferenceHandler) { if (!conferenceHandler) return false; - if (me.membership != "join") { + const myMembership = room.getMyMembership(myUserId); + if (myMembership != "join") { return false; } - const otherMember = getOnlyOtherMember(room, me); + const otherMember = getOnlyOtherMember(room, myUserId); if (otherMember === null) { return false; } @@ -68,28 +68,30 @@ const isConfCallRoomCache = { // $roomId: bool }; -export function isConfCallRoom(room, me, conferenceHandler) { +export function isConfCallRoom(room, myUserId, conferenceHandler) { if (isConfCallRoomCache[room.roomId] !== undefined) { return isConfCallRoomCache[room.roomId]; } - const result = _isConfCallRoom(room, me, conferenceHandler); + const result = _isConfCallRoom(room, myUserId, conferenceHandler); isConfCallRoomCache[room.roomId] = result; return result; } -export function looksLikeDirectMessageRoom(room, me) { - if (me.membership == "join" || me.membership === "ban" || me.isKicked()) { +export function looksLikeDirectMessageRoom(room, myUserId) { + const myMembership = room.getMyMembership(myUserId); + const me = room.getMember(myUserId); + + if (myMembership == "join" || myMembership === "ban" || (me && me.isKicked())) { // Used to split rooms via tags const tagNames = Object.keys(room.tags); // Used for 1:1 direct chats - const members = room.currentState.getMembers(); - // Show 1:1 chats in seperate "Direct Messages" section as long as they haven't // been moved to a different tag section - if (members.length === 2 && !tagNames.length) { + // TODO: Use SUMMARYAPI to take invited users into account + if (room.currentState.getJoinedMemberCount() === 2 && !tagNames.length) { return true; } } @@ -99,10 +101,10 @@ export function looksLikeDirectMessageRoom(room, me) { export function guessAndSetDMRoom(room, isDirect) { let newTarget; if (isDirect) { - const guessedTarget = guessDMRoomTarget( - room, room.getMember(MatrixClientPeg.get().credentials.userId), + const guessedUserId = guessDMRoomTargetId( + room, MatrixClientPeg.get().getUserId() ); - newTarget = guessedTarget.userId; + newTarget = guessedUserId; } else { newTarget = null; } @@ -158,13 +160,13 @@ export function setDMRoom(roomId, userId) { * Given a room, estimate which of its members is likely to * be the target if the room were a DM room and return that user. */ -export function guessDMRoomTarget(room, me) { +function guessDMRoomTargetId(room, myUserId) { let oldestTs; let oldestUser; // Pick the joined user who's been here longest (and isn't us), for (const user of room.getJoinedMembers()) { - if (user.userId == me.userId) continue; + if (user.userId == myUserId) continue; if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) { oldestUser = user; @@ -175,7 +177,7 @@ export function guessDMRoomTarget(room, me) { // if there are no joined members other than us, use the oldest member for (const user of room.currentState.getMembers()) { - if (user.userId == me.userId) continue; + if (user.userId == myUserId) continue; if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) { oldestUser = user; @@ -183,6 +185,6 @@ export function guessDMRoomTarget(room, me) { } } - if (oldestUser === undefined) return me; + if (oldestUser === undefined) return myUserId; return oldestUser; } diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 8533e3f61a..9d48ed32c9 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -342,8 +342,8 @@ module.exports = React.createClass({ if (!taggedRoom) { return; } - const me = taggedRoom.getMember(MatrixClientPeg.get().credentials.userId); - if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, me, this.props.ConferenceHandler)) { + const myUserId = MatrixClientPeg.get().getUserId(); + if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, myUserId, this.props.ConferenceHandler)) { return; } diff --git a/src/stores/RoomListStore.js b/src/stores/RoomListStore.js index b95eafa2ab..38ad7e0b3d 100644 --- a/src/stores/RoomListStore.js +++ b/src/stores/RoomListStore.js @@ -173,8 +173,7 @@ class RoomListStore extends Store { if (!this._matrixClient) return; this._matrixClient.getRooms().forEach((room, index) => { - const me = room.getMember(this._matrixClient.credentials.userId); - const membership = me ? me.membership : room.getSyncedMembership(); + const membership = room.getMyMembership(this._matrixClient.getUserId()); if (membership == "invite") { lists["im.vector.fake.invite"].push(room); diff --git a/src/utils/DMRoomMap.js b/src/utils/DMRoomMap.js index d47282f370..acb1573cbf 100644 --- a/src/utils/DMRoomMap.js +++ b/src/utils/DMRoomMap.js @@ -96,9 +96,10 @@ export default class DMRoomMap { if (this.roomToUser[roomId] === undefined) { // no entry? if the room is an invite, look for the is_direct hint. const room = this.matrixClient.getRoom(roomId); + // TODO Use SUMMARYAPI to fix DM detection? if (room) { const me = room.getMember(this.matrixClient.getUserId()); - return me.getDMInviter(); + return me && me.getDMInviter(); } } return this.roomToUser[roomId];