fix dm detection and conf call code with lazy loading

pull/21833/head
Bruno Windels 2018-07-25 14:54:10 +02:00
parent 7ea913ccec
commit d87d34030a
4 changed files with 29 additions and 27 deletions

View File

@ -31,26 +31,26 @@ export function getDisplayAliasForRoom(room) {
* If the room contains only two members including the logged-in user, * If the room contains only two members including the logged-in user,
* return the other one. Otherwise, return null. * return the other one. Otherwise, return null.
*/ */
export function getOnlyOtherMember(room, me) { export function getOnlyOtherMember(room, myUserId) {
const joinedMembers = room.getJoinedMembers();
if (joinedMembers.length === 2) { if (room.currentState.getJoinedMemberCount() === 2) {
return joinedMembers.filter(function(m) { return room.getJoinedMembers().filter(function(m) {
return m.userId !== me.userId; return m.userId !== myUserId;
})[0]; })[0];
} }
return null; return null;
} }
function _isConfCallRoom(room, me, conferenceHandler) { function _isConfCallRoom(room, myUserId, conferenceHandler) {
if (!conferenceHandler) return false; if (!conferenceHandler) return false;
if (me.membership != "join") { const myMembership = room.getMyMembership(myUserId);
if (myMembership != "join") {
return false; return false;
} }
const otherMember = getOnlyOtherMember(room, me); const otherMember = getOnlyOtherMember(room, myUserId);
if (otherMember === null) { if (otherMember === null) {
return false; return false;
} }
@ -68,28 +68,30 @@ const isConfCallRoomCache = {
// $roomId: bool // $roomId: bool
}; };
export function isConfCallRoom(room, me, conferenceHandler) { export function isConfCallRoom(room, myUserId, conferenceHandler) {
if (isConfCallRoomCache[room.roomId] !== undefined) { if (isConfCallRoomCache[room.roomId] !== undefined) {
return isConfCallRoomCache[room.roomId]; return isConfCallRoomCache[room.roomId];
} }
const result = _isConfCallRoom(room, me, conferenceHandler); const result = _isConfCallRoom(room, myUserId, conferenceHandler);
isConfCallRoomCache[room.roomId] = result; isConfCallRoomCache[room.roomId] = result;
return result; return result;
} }
export function looksLikeDirectMessageRoom(room, me) { export function looksLikeDirectMessageRoom(room, myUserId) {
if (me.membership == "join" || me.membership === "ban" || me.isKicked()) { const myMembership = room.getMyMembership(myUserId);
const me = room.getMember(myUserId);
if (myMembership == "join" || myMembership === "ban" || (me && me.isKicked())) {
// Used to split rooms via tags // Used to split rooms via tags
const tagNames = Object.keys(room.tags); const tagNames = Object.keys(room.tags);
// Used for 1:1 direct chats // 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 // Show 1:1 chats in seperate "Direct Messages" section as long as they haven't
// been moved to a different tag section // 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; return true;
} }
} }
@ -99,10 +101,10 @@ export function looksLikeDirectMessageRoom(room, me) {
export function guessAndSetDMRoom(room, isDirect) { export function guessAndSetDMRoom(room, isDirect) {
let newTarget; let newTarget;
if (isDirect) { if (isDirect) {
const guessedTarget = guessDMRoomTarget( const guessedUserId = guessDMRoomTargetId(
room, room.getMember(MatrixClientPeg.get().credentials.userId), room, MatrixClientPeg.get().getUserId()
); );
newTarget = guessedTarget.userId; newTarget = guessedUserId;
} else { } else {
newTarget = null; newTarget = null;
} }
@ -158,13 +160,13 @@ export function setDMRoom(roomId, userId) {
* Given a room, estimate which of its members is likely to * 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. * 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 oldestTs;
let oldestUser; let oldestUser;
// Pick the joined user who's been here longest (and isn't us), // Pick the joined user who's been here longest (and isn't us),
for (const user of room.getJoinedMembers()) { 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)) { if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {
oldestUser = user; oldestUser = user;
@ -175,7 +177,7 @@ export function guessDMRoomTarget(room, me) {
// if there are no joined members other than us, use the oldest member // if there are no joined members other than us, use the oldest member
for (const user of room.currentState.getMembers()) { 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)) { if (oldestTs === undefined || (user.events.member && user.events.member.getTs() < oldestTs)) {
oldestUser = user; oldestUser = user;
@ -183,6 +185,6 @@ export function guessDMRoomTarget(room, me) {
} }
} }
if (oldestUser === undefined) return me; if (oldestUser === undefined) return myUserId;
return oldestUser; return oldestUser;
} }

View File

@ -342,8 +342,8 @@ module.exports = React.createClass({
if (!taggedRoom) { if (!taggedRoom) {
return; return;
} }
const me = taggedRoom.getMember(MatrixClientPeg.get().credentials.userId); const myUserId = MatrixClientPeg.get().getUserId();
if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, me, this.props.ConferenceHandler)) { if (HIDE_CONFERENCE_CHANS && Rooms.isConfCallRoom(taggedRoom, myUserId, this.props.ConferenceHandler)) {
return; return;
} }

View File

@ -173,8 +173,7 @@ class RoomListStore extends Store {
if (!this._matrixClient) return; if (!this._matrixClient) return;
this._matrixClient.getRooms().forEach((room, index) => { this._matrixClient.getRooms().forEach((room, index) => {
const me = room.getMember(this._matrixClient.credentials.userId); const membership = room.getMyMembership(this._matrixClient.getUserId());
const membership = me ? me.membership : room.getSyncedMembership();
if (membership == "invite") { if (membership == "invite") {
lists["im.vector.fake.invite"].push(room); lists["im.vector.fake.invite"].push(room);

View File

@ -96,9 +96,10 @@ export default class DMRoomMap {
if (this.roomToUser[roomId] === undefined) { if (this.roomToUser[roomId] === undefined) {
// no entry? if the room is an invite, look for the is_direct hint. // no entry? if the room is an invite, look for the is_direct hint.
const room = this.matrixClient.getRoom(roomId); const room = this.matrixClient.getRoom(roomId);
// TODO Use SUMMARYAPI to fix DM detection?
if (room) { if (room) {
const me = room.getMember(this.matrixClient.getUserId()); const me = room.getMember(this.matrixClient.getUserId());
return me.getDMInviter(); return me && me.getDMInviter();
} }
} }
return this.roomToUser[roomId]; return this.roomToUser[roomId];