Bring back the little green men without slowness

Introduces a singleton DMRoomMap that subscribes to account data to keep itself up to date so we don't have to keep doing the map inversion for each room tile.
This commit is contained in:
David Baker 2016-09-26 18:02:14 +01:00
parent 40ba1ff5aa
commit 690309adfc
3 changed files with 44 additions and 7 deletions

View file

@ -22,6 +22,7 @@ import Notifier from './Notifier'
import UserActivity from './UserActivity';
import Presence from './Presence';
import dis from './dispatcher';
import DMRoomMap from './utils/DMRoomMap';
/**
* Called at startup, to attempt to build a logged-in Matrix session. It tries
@ -317,6 +318,7 @@ export function startMatrixClient() {
Notifier.start();
UserActivity.start();
Presence.start();
DMRoomMap.shared().start();
MatrixClientPeg.start();
}
@ -354,6 +356,7 @@ export function stopMatrixClient() {
Notifier.stop();
UserActivity.stop();
Presence.stop();
DMRoomMap.shared().stop();
var cli = MatrixClientPeg.get();
if (cli) {
cli.stopClient();

View file

@ -70,8 +70,7 @@ module.exports = React.createClass({
},
_isDirectMessageRoom: function(roomId) {
const dmRoomMap = new DMRoomMap(MatrixClientPeg.get());
var dmRooms = dmRoomMap.getUserIdForRoomId(roomId);
var dmRooms = DMRoomMap.shared().getUserIdForRoomId(roomId);
if (dmRooms) {
return true;
} else {
@ -277,11 +276,9 @@ module.exports = React.createClass({
var RoomAvatar = sdk.getComponent('avatars.RoomAvatar');
var directMessageIndicator;
// Temporarily turning off the LGM badges as isDirectMessageRoom is horribly unperformant
// - see https://github.com/vector-im/vector-web/issues/2343
// if (this._isDirectMessageRoom(this.props.room.roomId)) {
// directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm"/>;
// }
if (this._isDirectMessageRoom(this.props.room.roomId)) {
directMessageIndicator = <img src="img/icon_person.svg" className="mx_RoomTile_dm" width="11" height="13" alt="dm"/>;
}
// These props are injected by React DnD,
// as defined by your `collect` function above:

View file

@ -14,16 +14,25 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
import MatrixClientPeg from '../MatrixClientPeg';
/**
* 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.
*
* With 'start', this can also keep itself up to date over time.
*/
export default class DMRoomMap {
constructor(matrixClient) {
this.matrixClient = matrixClient;
this.roomToUser = null;
// XXX: Force-bind the event handler method because it
// doesn't call it with our object as the 'this'
// (use a static property arrow function for this when we can)
this._onAccountData = this._onAccountData.bind(this);
const mDirectEvent = matrixClient.getAccountData('m.direct');
if (!mDirectEvent) {
this.userToRooms = {};
@ -32,6 +41,34 @@ export default class DMRoomMap {
}
}
/**
* Returns a shared instance of the class
* that uses the singleton matrix client
* The shared instance must be started before use.
*/
static shared() {
if (!DMRoomMap._sharedInstance) {
DMRoomMap._sharedInstance = new DMRoomMap(MatrixClientPeg.get());
}
return DMRoomMap._sharedInstance;
}
start() {
this._populateRoomToUser();
this.matrixClient.on("accountData", this._onAccountData);
}
stop() {
this.matrixClient.removeListener("accountData", this._onAccountData);
}
_onAccountData(ev) {
this.userToRooms = this.matrixClient.getAccountData('m.direct').getContent();
if (ev.getType() == 'm.direct') {
this._populateRoomToUser();
}
}
getDMRoomsForUserId(userId) {
// Here, we return the empty list if there are no rooms,
// since the number of conversations you have with this user is zero.