From 840132315672b906b9d2a0aa30d1341899364340 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 6 Sep 2016 16:39:21 +0100 Subject: [PATCH] Hopefully read DM rooms from account data --- src/DMRoomMap.js | 46 ++++++++++++++++++++++++++ src/MatrixTools.js | 2 +- src/components/views/rooms/RoomList.js | 24 ++++++++++++-- 3 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 src/DMRoomMap.js diff --git a/src/DMRoomMap.js b/src/DMRoomMap.js new file mode 100644 index 0000000000..d92ae87e64 --- /dev/null +++ b/src/DMRoomMap.js @@ -0,0 +1,46 @@ +/* +Copyright 2016 OpenMarket Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** + * Class that takes a Matrix Client and flips the m.direct map + * so the operation of mapping a room ID to which user it's a DM + * with can be performed efficiently. + */ +export default class DMRoomMap { + constructor(matrixClient) { + const mDirectEvent = matrixClient.getAccountData('m.direct'); + if (!mDirectEvent) { + this.userToRooms = {}; + this.roomToUser = {}; + } else { + this.userToRooms = mDirectEvent.getContent(); + this.roomToUser = {}; + for (const user of Object.keys(this.userToRooms)) { + for (const roomId of this.userToRooms[user]) { + this.roomToUser[roomId] = user; + } + } + } + } + + getDMRoomsForUserId(userId) { + return this.userToRooms[userId]; + } + + getUserIdForRoomId(roomId) { + return this.roomToUser[roomId]; + } +} diff --git a/src/MatrixTools.js b/src/MatrixTools.js index b95e21a4af..f3c0cd6949 100644 --- a/src/MatrixTools.js +++ b/src/MatrixTools.js @@ -59,7 +59,7 @@ module.exports = { } }, - isDirectMessageRoom: function(room, me) { + looksLikeDirectMessageRoom: function(room, me) { if (me.membership == "join" || me.membership === "ban" || (me.membership === "leave" && me.events.member.getSender() !== me.events.member.getStateKey())) { diff --git a/src/components/views/rooms/RoomList.js b/src/components/views/rooms/RoomList.js index 4fef4ff0a4..6ce85af82b 100644 --- a/src/components/views/rooms/RoomList.js +++ b/src/components/views/rooms/RoomList.js @@ -26,6 +26,7 @@ var dis = require("../../../dispatcher"); var sdk = require('../../../index'); var rate_limited_func = require('../../../ratelimitedfunc'); var MatrixTools = require('../../../MatrixTools'); +var DMRoomMap = require('../../../DMRoomMap'); var HIDE_CONFERENCE_CHANS = true; @@ -209,8 +210,10 @@ module.exports = React.createClass({ s.lists["m.lowpriority"] = []; s.lists["im.vector.fake.archived"] = []; + const dmRoomMap = new DMRoomMap(MatrixClientPeg.get()); + MatrixClientPeg.get().getRooms().forEach(function(room) { - var me = room.getMember(MatrixClientPeg.get().credentials.userId); + const me = room.getMember(MatrixClientPeg.get().credentials.userId); if (!me) return; // console.log("room = " + room.name + ", me.membership = " + me.membership + @@ -224,7 +227,7 @@ module.exports = React.createClass({ else if (HIDE_CONFERENCE_CHANS && MatrixTools.isConfCallRoom(room, me, self.props.ConferenceHandler)) { // skip past this room & don't put it in any lists } - else if (MatrixTools.isDirectMessageRoom(room, me)) { + else if (dmRoomMap.getUserIdForRoomId(room.roomId)) { // "Direct Message" rooms s.lists["im.vector.fake.direct"].push(room); } @@ -253,6 +256,23 @@ module.exports = React.createClass({ } }); + if (s.lists["im.vector.fake.direct"].length == 0 && MatrixClientPeg.get().getAccountData('m.direct') === undefined) { + // scan through the 'recents' list for any rooms which look like DM rooms + // and make them DM rooms + const oldRecents = s.lists["im.vector.fake.recent"]; + s.lists["im.vector.fake.recent"] = []; + + for (const room of oldRecents) { + const me = room.getMember(MatrixClientPeg.get().credentials.userId); + + if (!me || MatrixTools.looksLikeDirectMessageRoom(room, me)) { + s.lists["im.vector.fake.recent"].push(room); + } else { + s.lists["im.vector.fake.direct"].push(room); + } + } + } + //console.log("calculated new roomLists; im.vector.fake.recent = " + s.lists["im.vector.fake.recent"]); // we actually apply the sorting to this when receiving the prop in RoomSubLists.