From 8870da6c2403074b2d8f41875f1c5522ebdda194 Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Fri, 21 Feb 2020 12:50:18 +0100 Subject: [PATCH] Add alt_aliases to room completion candidates but don't match on name otherwise you see multiple entries per room when searching for a room name Also pass the roomId to the composer autocomplete, so it's easier to we don't need to loop through all the rooms and it's also easier accept room with local aliases as well in the future --- src/autocomplete/RoomProvider.js | 41 +++++++++++++++++++------------- src/editor/autocomplete.js | 2 +- src/editor/parts.js | 8 +++---- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/autocomplete/RoomProvider.js b/src/autocomplete/RoomProvider.js index fccf1e3524..1074197814 100644 --- a/src/autocomplete/RoomProvider.js +++ b/src/autocomplete/RoomProvider.js @@ -40,11 +40,19 @@ function score(query, space) { } } +function matcherObject(room, displayedAlias, matchName = "") { + return { + room, + matchName, + displayedAlias, + }; +} + export default class RoomProvider extends AutocompleteProvider { constructor() { super(ROOM_REGEX); this.matcher = new QueryMatcher([], { - keys: ['displayedAlias', 'name'], + keys: ['displayedAlias', 'matchName'], }); } @@ -56,16 +64,16 @@ export default class RoomProvider extends AutocompleteProvider { const {command, range} = this.getCurrentCommand(query, selection, force); if (command) { // the only reason we need to do this is because Fuse only matches on properties - let matcherObjects = client.getVisibleRooms().filter( - (room) => !!room && !!getDisplayAliasForRoom(room), - ).map((room) => { - return { - room: room, - name: room.name, - displayedAlias: getDisplayAliasForRoom(room), - }; - }); - + let matcherObjects = client.getVisibleRooms().reduce((aliases, room) => { + if (room.getCanonicalAlias()) { + aliases = aliases.concat(matcherObject(room, room.getCanonicalAlias(), room.name)); + } + if (room.getAltAliases().length) { + const altAliases = room.getAltAliases().map(alias => matcherObject(room, alias)); + aliases = aliases.concat(altAliases); + } + return aliases; + }, []); // Filter out any matches where the user will have also autocompleted new rooms matcherObjects = matcherObjects.filter((r) => { const tombstone = r.room.currentState.getStateEvents("m.room.tombstone", ""); @@ -84,16 +92,15 @@ export default class RoomProvider extends AutocompleteProvider { completions = _sortBy(completions, [ (c) => score(matchedString, c.displayedAlias), (c) => c.displayedAlias.length, - ]).map((room) => { - const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId; + completions = completions.map((room) => { return { - completion: displayAlias, - completionId: displayAlias, + completion: room.displayedAlias, + completionId: room.room.roomId, type: "room", suffix: ' ', - href: makeRoomPermalink(displayAlias), + href: makeRoomPermalink(room.displayedAlias), component: ( - } title={room.name} description={displayAlias} /> + } title={room.room.name} description={room.displayedAlias} /> ), range, }; diff --git a/src/editor/autocomplete.js b/src/editor/autocomplete.js index 1ead3aef07..fcde6e0ce4 100644 --- a/src/editor/autocomplete.js +++ b/src/editor/autocomplete.js @@ -102,7 +102,7 @@ export default class AutocompleteWrapperModel { const text = completion.completion; switch (completion.type) { case "room": - return [this._partCreator.roomPill(completionId), this._partCreator.plain(completion.suffix)]; + return [this._partCreator.roomPill(text, completionId), this._partCreator.plain(completion.suffix)]; case "at-room": return [this._partCreator.atRoomPill(completionId), this._partCreator.plain(completion.suffix)]; case "user": diff --git a/src/editor/parts.js b/src/editor/parts.js index 652342405f..083ee38478 100644 --- a/src/editor/parts.js +++ b/src/editor/parts.js @@ -422,14 +422,14 @@ export class PartCreator { return new PillCandidatePart(text, this._autoCompleteCreator); } - roomPill(alias) { + roomPill(alias, roomId) { let room; - if (alias[0] === '#') { + if (roomId || alias[0] !== "#") { + room = this._client.getRoom(roomId || alias); + } else { room = this._client.getRooms().find((r) => { return r.getCanonicalAlias() === alias || r.getAliases().includes(alias); }); - } else { - room = this._client.getRoom(alias); } return new RoomPillPart(alias, room); }