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); }