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