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.
pull/21833/head
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;