Experimental: Lazy load user autocomplete entries
Loading the users into the autocomplete provider is quite a large chunk of work for a large room. Try lazy loading it the first time a completion is done rather than up front when the room is loaded, given that a lot of the time you switch to a room you won't say anything.pull/21833/head
parent
45c4eeba01
commit
02894ee906
|
@ -33,7 +33,8 @@ const USER_REGEX = /@\S*/g;
|
|||
let instance = null;
|
||||
|
||||
export default class UserProvider extends AutocompleteProvider {
|
||||
users: Array<RoomMember> = [];
|
||||
users: Array<RoomMember> = null;
|
||||
room: Room = null;
|
||||
|
||||
constructor() {
|
||||
super(USER_REGEX, {
|
||||
|
@ -54,6 +55,9 @@ export default class UserProvider extends AutocompleteProvider {
|
|||
return [];
|
||||
}
|
||||
|
||||
// lazy-load user list into matcher
|
||||
if (this.users === null) this._makeUsers();
|
||||
|
||||
let completions = [];
|
||||
let {command, range} = this.getCurrentCommand(query, selection, force);
|
||||
if (command) {
|
||||
|
@ -83,7 +87,12 @@ export default class UserProvider extends AutocompleteProvider {
|
|||
}
|
||||
|
||||
setUserListFromRoom(room: Room) {
|
||||
const events = room.getLiveTimeline().getEvents();
|
||||
this.room = room;
|
||||
this.users = null;
|
||||
}
|
||||
|
||||
_makeUsers() {
|
||||
const events = this.room.getLiveTimeline().getEvents();
|
||||
const lastSpoken = {};
|
||||
|
||||
for(const event of events) {
|
||||
|
@ -91,7 +100,7 @@ export default class UserProvider extends AutocompleteProvider {
|
|||
}
|
||||
|
||||
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;
|
||||
});
|
||||
|
||||
|
@ -103,7 +112,8 @@ export default class UserProvider extends AutocompleteProvider {
|
|||
}
|
||||
|
||||
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
|
||||
this.users.splice(
|
||||
|
|
Loading…
Reference in New Issue