mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-16 13:14:58 +08:00
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.
This commit is contained in:
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
Block a user