Merge pull request #1413 from matrix-org/dbkr/userprovider_lazyload

Experimental: Lazy load user autocomplete entries
This commit is contained in:
David Baker 2017-09-22 15:16:07 +01:00 committed by GitHub
commit aed1b9072d

View file

@ -33,7 +33,8 @@ const USER_REGEX = /@\S*/g;
let instance = null; let instance = null;
export default class UserProvider extends AutocompleteProvider { export default class UserProvider extends AutocompleteProvider {
users: Array<RoomMember> = []; users: Array<RoomMember> = null;
room: Room = null;
constructor() { constructor() {
super(USER_REGEX, { super(USER_REGEX, {
@ -54,6 +55,9 @@ export default class UserProvider extends AutocompleteProvider {
return []; return [];
} }
// lazy-load user list into matcher
if (this.users === null) this._makeUsers();
let completions = []; let completions = [];
let {command, range} = this.getCurrentCommand(query, selection, force); let {command, range} = this.getCurrentCommand(query, selection, force);
if (command) { if (command) {
@ -83,7 +87,12 @@ export default class UserProvider extends AutocompleteProvider {
} }
setUserListFromRoom(room: Room) { setUserListFromRoom(room: Room) {
const events = room.getLiveTimeline().getEvents(); this.room = room;
this.users = null;
}
_makeUsers() {
const events = this.room.getLiveTimeline().getEvents();
const lastSpoken = {}; const lastSpoken = {};
for(const event of events) { for(const event of events) {
@ -91,7 +100,7 @@ export default class UserProvider extends AutocompleteProvider {
} }
const currentUserId = MatrixClientPeg.get().credentials.userId; const currentUserId = MatrixClientPeg.get().credentials.userId;
this.users = room.getJoinedMembers().filter((member) => { this.users = this.room.getJoinedMembers().filter((member) => {
if (member.userId !== currentUserId) return true; if (member.userId !== currentUserId) return true;
}); });
@ -103,7 +112,8 @@ export default class UserProvider extends AutocompleteProvider {
} }
onUserSpoke(user: RoomMember) { onUserSpoke(user: RoomMember) {
if(user.userId === MatrixClientPeg.get().credentials.userId) return; if (this.room === null) return;
if (user.userId === MatrixClientPeg.get().credentials.userId) return;
// Move the user that spoke to the front of the array // Move the user that spoke to the front of the array
this.users.splice( this.users.splice(