From 4e4c670458274b8eafa31c61017191840980da56 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 30 May 2017 12:34:19 +0100 Subject: [PATCH] Improve ChatInviteDialog perf by ditching fuse, using indexOf and lastActiveTs() --- .../views/dialogs/ChatInviteDialog.js | 47 +++++++------------ 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/src/components/views/dialogs/ChatInviteDialog.js b/src/components/views/dialogs/ChatInviteDialog.js index ca0f10bc6b..04f21c1404 100644 --- a/src/components/views/dialogs/ChatInviteDialog.js +++ b/src/components/views/dialogs/ChatInviteDialog.js @@ -27,7 +27,6 @@ import dis from '../../../dispatcher'; import Modal from '../../../Modal'; import AccessibleButton from '../elements/AccessibleButton'; import q from 'q'; -import Fuse from 'fuse.js'; const TRUNCATE_QUERY_LIST = 40; @@ -74,19 +73,6 @@ module.exports = React.createClass({ // Set the cursor at the end of the text input this.refs.textinput.value = this.props.value; } - // Create a Fuse instance for fuzzy searching this._userList - this._fuse = new Fuse( - // Use an empty list at first that will later be populated - // (see this._updateUserList) - [], - { - shouldSort: true, - location: 0, // The index of the query in the test string - distance: 5, // The distance away from location the query can be - // 0.0 = exact match, 1.0 = match anything - threshold: 0.3, - } - ); this._updateUserList(); }, @@ -175,7 +161,7 @@ module.exports = React.createClass({ }, onQueryChanged: function(ev) { - const query = ev.target.value; + const query = ev.target.value.toLowerCase(); let queryList = []; if (query.length < 2) { @@ -188,24 +174,27 @@ module.exports = React.createClass({ this.queryChangedDebouncer = setTimeout(() => { // Only do search if there is something to search if (query.length > 0 && query != '@') { - // Weighted keys prefer to match userIds when first char is @ - this._fuse.options.keys = [{ - name: 'displayName', - weight: query[0] === '@' ? 0.1 : 0.9, - },{ - name: 'userId', - weight: query[0] === '@' ? 0.9 : 0.1, - }]; - queryList = this._fuse.search(query).map((user) => { + this._userList.forEach((user) => { + if (user.userId.toLowerCase().indexOf(query) === -1 && + user.displayName.toLowerCase().indexOf(query) === -1 + ) { + return; + } + // Return objects, structure of which is defined // by InviteAddressType - return { + queryList.push({ addressType: 'mx', address: user.userId, displayName: user.displayName, avatarMxc: user.avatarUrl, isKnown: true, - } + order: user.getLastActiveTs(), + }); + }); + + queryList = queryList.sort((a,b) => { + return a.order < b.order; }); // If the query is a valid address, add an entry for that @@ -351,7 +340,7 @@ module.exports = React.createClass({ this.props.onFinished(true, addrTexts); }, - _updateUserList: new rate_limited_func(function() { + _updateUserList: function() { // Get all the users this._userList = MatrixClientPeg.get().getUsers(); // Remove current user @@ -359,9 +348,7 @@ module.exports = React.createClass({ return u.userId === MatrixClientPeg.get().credentials.userId; }); this._userList.splice(meIx, 1); - - this._fuse.set(this._userList); - }, 500), + }, _isOnInviteList: function(uid) { for (let i = 0; i < this.state.inviteList.length; i++) {