Move RoomMember[] -> MemberEntry[] conversion somewhere sensible

This is required for automatically entering tab-complete mode because
onKeyDown is NOT called in that case, so we need to make sure to have a
membership list hanging around.
This commit is contained in:
Kegan Dougal 2015-12-22 15:38:23 +00:00
parent a20cabb06f
commit 460f68caef
3 changed files with 47 additions and 34 deletions

View file

@ -68,5 +68,34 @@ class MemberEntry extends Entry {
} }
} }
MemberEntry.fromMemberList = function(members) {
return members.sort(function(a, b) {
var userA = a.user;
var userB = b.user;
if (userA && !userB) {
return -1; // a comes first
}
else if (!userA && userB) {
return 1; // b comes first
}
else if (!userA && !userB) {
return 0; // don't care
}
else { // both User objects exist
if (userA.lastActiveAgo < userB.lastActiveAgo) {
return -1; // a comes first
}
else if (userA.lastActiveAgo > userB.lastActiveAgo) {
return 1; // b comes first
}
else {
return 0; // same last active ago
}
}
}).map(function(m) {
return new MemberEntry(m);
});
}
module.exports.Entry = Entry; module.exports.Entry = Entry;
module.exports.MemberEntry = MemberEntry; module.exports.MemberEntry = MemberEntry;

View file

@ -35,6 +35,7 @@ var Modal = require("../../Modal");
var sdk = require('../../index'); var sdk = require('../../index');
var CallHandler = require('../../CallHandler'); var CallHandler = require('../../CallHandler');
var TabComplete = require("../../TabComplete"); var TabComplete = require("../../TabComplete");
var MemberEntry = require("../../TabCompleteEntries").MemberEntry;
var Resend = require("../../Resend"); var Resend = require("../../Resend");
var dis = require("../../dispatcher"); var dis = require("../../dispatcher");
@ -264,6 +265,11 @@ module.exports = React.createClass({
}, },
onRoomStateMember: function(ev, state, member) { onRoomStateMember: function(ev, state, member) {
if (member.roomId === this.props.roomId) {
// a member state changed in this room, refresh the tab complete list
this._updateTabCompleteList(this.state.room);
}
if (!this.props.ConferenceHandler) { if (!this.props.ConferenceHandler) {
return; return;
} }
@ -326,6 +332,18 @@ module.exports = React.createClass({
window.addEventListener('resize', this.onResize); window.addEventListener('resize', this.onResize);
this.onResize(); this.onResize();
this._updateTabCompleteList(this.state.room);
},
_updateTabCompleteList: function(room) {
if (!room || !this.tabComplete) {
return;
}
console.log("_updateTabCompleteList");
this.tabComplete.setCompletionList(
MemberEntry.fromMemberList(room.getJoinedMembers())
);
}, },
_initialiseMessagePanel: function() { _initialiseMessagePanel: function() {

View file

@ -200,40 +200,6 @@ module.exports = React.createClass({
this.sentHistory.push(input); this.sentHistory.push(input);
this.onEnter(ev); this.onEnter(ev);
} }
else if (ev.keyCode === KeyCode.TAB) {
if (this.props.tabComplete && this.props.room) {
var memberList = [];
// TODO: We should cache this list and only update it when the
// member list changes. It's also horrendous that this is done here.
memberList = this.props.room.getJoinedMembers().sort(function(a, b) {
var userA = a.user;
var userB = b.user;
if (userA && !userB) {
return -1; // a comes first
}
else if (!userA && userB) {
return 1; // b comes first
}
else if (!userA && !userB) {
return 0; // don't care
}
else { // both User objects exist
if (userA.lastActiveAgo < userB.lastActiveAgo) {
return -1; // a comes first
}
else if (userA.lastActiveAgo > userB.lastActiveAgo) {
return 1; // b comes first
}
else {
return 0; // same last active ago
}
}
}).map(function(m) {
return new MemberEntry(m);
});
this.props.tabComplete.setCompletionList(memberList);
}
}
else if (ev.keyCode === KeyCode.UP) { else if (ev.keyCode === KeyCode.UP) {
var input = this.refs.textarea.value; var input = this.refs.textarea.value;
var offset = this.refs.textarea.selectionStart || 0; var offset = this.refs.textarea.selectionStart || 0;