When sorting completions, use matched string, not entire query

Otherwise the results vary depending on where you start autocompleting in your message. We only care about the matched string.
This commit is contained in:
Luke Barnard 2017-08-02 10:09:00 +01:00
parent b632c9132c
commit 72c1cf9288
2 changed files with 8 additions and 7 deletions

View file

@ -115,12 +115,12 @@ export default class EmojiProvider extends AutocompleteProvider {
completions = completions.concat(this.nameMatcher.match(matchedString));
const sorters = [];
// First, sort by score (Infinity if query not in shortname)
sorters.push((c) => score(query, c.shortname));
// If the query is not empty, sort by length of shortname. Example:
// query = ":bookmark"
// First, sort by score (Infinity if matchedString not in shortname)
sorters.push((c) => score(matchedString, c.shortname));
// If the matchedString is not empty, sort by length of shortname. Example:
// matchedString = ":bookmark"
// completions = [":bookmark:", ":bookmark_tabs:", ...]
if (query.length > 1) {
if (matchedString.length > 1) {
sorters.push((c) => c.shortname.length);
}
// Finally, sort by original ordering

View file

@ -63,9 +63,10 @@ export default class RoomProvider extends AutocompleteProvider {
displayedAlias: getDisplayAliasForRoom(room),
};
}));
completions = this.matcher.match(command[0]);
const matchedString = command[0];
completions = this.matcher.match(matchedString);
completions = _sortBy(completions, [
(c) => score(query, c.displayedAlias),
(c) => score(matchedString, c.displayedAlias),
(c) => c.displayedAlias.length,
]).map((room) => {
const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId;