Merge pull request #4102 from matrix-org/bwindels/aliasautocomplete
Use alt_aliases for pills and autocompletepull/21833/head
commit
dc85346e5c
|
@ -23,7 +23,7 @@ import {MatrixClientPeg} from './MatrixClientPeg';
|
||||||
* of aliases. Otherwise return null;
|
* of aliases. Otherwise return null;
|
||||||
*/
|
*/
|
||||||
export function getDisplayAliasForRoom(room) {
|
export function getDisplayAliasForRoom(room) {
|
||||||
return room.getCanonicalAlias() || room.getAliases()[0];
|
return room.getCanonicalAlias() || room.getAltAliases()[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,7 +23,6 @@ import AutocompleteProvider from './AutocompleteProvider';
|
||||||
import {MatrixClientPeg} from '../MatrixClientPeg';
|
import {MatrixClientPeg} from '../MatrixClientPeg';
|
||||||
import QueryMatcher from './QueryMatcher';
|
import QueryMatcher from './QueryMatcher';
|
||||||
import {PillCompletion} from './Components';
|
import {PillCompletion} from './Components';
|
||||||
import {getDisplayAliasForRoom} from '../Rooms';
|
|
||||||
import * as sdk from '../index';
|
import * as sdk from '../index';
|
||||||
import _sortBy from 'lodash/sortBy';
|
import _sortBy from 'lodash/sortBy';
|
||||||
import {makeRoomPermalink} from "../utils/permalinks/Permalinks";
|
import {makeRoomPermalink} from "../utils/permalinks/Permalinks";
|
||||||
|
@ -40,11 +39,19 @@ function score(query, space) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function matcherObject(room, displayedAlias, matchName = "") {
|
||||||
|
return {
|
||||||
|
room,
|
||||||
|
matchName,
|
||||||
|
displayedAlias,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export default class RoomProvider extends AutocompleteProvider {
|
export default class RoomProvider extends AutocompleteProvider {
|
||||||
constructor() {
|
constructor() {
|
||||||
super(ROOM_REGEX);
|
super(ROOM_REGEX);
|
||||||
this.matcher = new QueryMatcher([], {
|
this.matcher = new QueryMatcher([], {
|
||||||
keys: ['displayedAlias', 'name'],
|
keys: ['displayedAlias', 'matchName'],
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,16 +63,16 @@ export default class RoomProvider extends AutocompleteProvider {
|
||||||
const {command, range} = this.getCurrentCommand(query, selection, force);
|
const {command, range} = this.getCurrentCommand(query, selection, force);
|
||||||
if (command) {
|
if (command) {
|
||||||
// the only reason we need to do this is because Fuse only matches on properties
|
// the only reason we need to do this is because Fuse only matches on properties
|
||||||
let matcherObjects = client.getVisibleRooms().filter(
|
let matcherObjects = client.getVisibleRooms().reduce((aliases, room) => {
|
||||||
(room) => !!room && !!getDisplayAliasForRoom(room),
|
if (room.getCanonicalAlias()) {
|
||||||
).map((room) => {
|
aliases = aliases.concat(matcherObject(room, room.getCanonicalAlias(), room.name));
|
||||||
return {
|
}
|
||||||
room: room,
|
if (room.getAltAliases().length) {
|
||||||
name: room.name,
|
const altAliases = room.getAltAliases().map(alias => matcherObject(room, alias));
|
||||||
displayedAlias: getDisplayAliasForRoom(room),
|
aliases = aliases.concat(altAliases);
|
||||||
};
|
}
|
||||||
});
|
return aliases;
|
||||||
|
}, []);
|
||||||
// Filter out any matches where the user will have also autocompleted new rooms
|
// Filter out any matches where the user will have also autocompleted new rooms
|
||||||
matcherObjects = matcherObjects.filter((r) => {
|
matcherObjects = matcherObjects.filter((r) => {
|
||||||
const tombstone = r.room.currentState.getStateEvents("m.room.tombstone", "");
|
const tombstone = r.room.currentState.getStateEvents("m.room.tombstone", "");
|
||||||
|
@ -84,16 +91,16 @@ export default class RoomProvider extends AutocompleteProvider {
|
||||||
completions = _sortBy(completions, [
|
completions = _sortBy(completions, [
|
||||||
(c) => score(matchedString, c.displayedAlias),
|
(c) => score(matchedString, c.displayedAlias),
|
||||||
(c) => c.displayedAlias.length,
|
(c) => c.displayedAlias.length,
|
||||||
]).map((room) => {
|
]);
|
||||||
const displayAlias = getDisplayAliasForRoom(room.room) || room.roomId;
|
completions = completions.map((room) => {
|
||||||
return {
|
return {
|
||||||
completion: displayAlias,
|
completion: room.displayedAlias,
|
||||||
completionId: displayAlias,
|
completionId: room.room.roomId,
|
||||||
type: "room",
|
type: "room",
|
||||||
suffix: ' ',
|
suffix: ' ',
|
||||||
href: makeRoomPermalink(displayAlias),
|
href: makeRoomPermalink(room.displayedAlias),
|
||||||
component: (
|
component: (
|
||||||
<PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.name} description={displayAlias} />
|
<PillCompletion initialComponent={<RoomAvatar width={24} height={24} room={room.room} />} title={room.room.name} description={room.displayedAlias} />
|
||||||
),
|
),
|
||||||
range,
|
range,
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,7 +23,6 @@ import classNames from 'classnames';
|
||||||
import { Room, RoomMember } from 'matrix-js-sdk';
|
import { Room, RoomMember } from 'matrix-js-sdk';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
import {MatrixClientPeg} from '../../../MatrixClientPeg';
|
||||||
import { getDisplayAliasForRoom } from '../../../Rooms';
|
|
||||||
import FlairStore from "../../../stores/FlairStore";
|
import FlairStore from "../../../stores/FlairStore";
|
||||||
import {getPrimaryPermalinkEntity} from "../../../utils/permalinks/Permalinks";
|
import {getPrimaryPermalinkEntity} from "../../../utils/permalinks/Permalinks";
|
||||||
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
import MatrixClientContext from "../../../contexts/MatrixClientContext";
|
||||||
|
@ -129,7 +128,7 @@ const Pill = createReactClass({
|
||||||
const localRoom = resourceId[0] === '#' ?
|
const localRoom = resourceId[0] === '#' ?
|
||||||
MatrixClientPeg.get().getRooms().find((r) => {
|
MatrixClientPeg.get().getRooms().find((r) => {
|
||||||
return r.getCanonicalAlias() === resourceId ||
|
return r.getCanonicalAlias() === resourceId ||
|
||||||
r.getAliases().includes(resourceId);
|
r.getAltAliases().includes(resourceId);
|
||||||
}) : MatrixClientPeg.get().getRoom(resourceId);
|
}) : MatrixClientPeg.get().getRoom(resourceId);
|
||||||
room = localRoom;
|
room = localRoom;
|
||||||
if (!localRoom) {
|
if (!localRoom) {
|
||||||
|
@ -237,12 +236,12 @@ const Pill = createReactClass({
|
||||||
case Pill.TYPE_ROOM_MENTION: {
|
case Pill.TYPE_ROOM_MENTION: {
|
||||||
const room = this.state.room;
|
const room = this.state.room;
|
||||||
if (room) {
|
if (room) {
|
||||||
linkText = (room ? getDisplayAliasForRoom(room) : null) || resource;
|
linkText = resource;
|
||||||
if (this.props.shouldShowPillAvatar) {
|
if (this.props.shouldShowPillAvatar) {
|
||||||
avatar = <RoomAvatar room={room} width={16} height={16} aria-hidden="true" />;
|
avatar = <RoomAvatar room={room} width={16} height={16} aria-hidden="true" />;
|
||||||
}
|
}
|
||||||
pillClass = 'mx_RoomPill';
|
|
||||||
}
|
}
|
||||||
|
pillClass = 'mx_RoomPill';
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Pill.TYPE_GROUP_MENTION: {
|
case Pill.TYPE_GROUP_MENTION: {
|
||||||
|
|
|
@ -102,7 +102,7 @@ export default class AutocompleteWrapperModel {
|
||||||
const text = completion.completion;
|
const text = completion.completion;
|
||||||
switch (completion.type) {
|
switch (completion.type) {
|
||||||
case "room":
|
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":
|
case "at-room":
|
||||||
return [this._partCreator.atRoomPill(completionId), this._partCreator.plain(completion.suffix)];
|
return [this._partCreator.atRoomPill(completionId), this._partCreator.plain(completion.suffix)];
|
||||||
case "user":
|
case "user":
|
||||||
|
|
|
@ -422,14 +422,15 @@ export class PartCreator {
|
||||||
return new PillCandidatePart(text, this._autoCompleteCreator);
|
return new PillCandidatePart(text, this._autoCompleteCreator);
|
||||||
}
|
}
|
||||||
|
|
||||||
roomPill(alias) {
|
roomPill(alias, roomId) {
|
||||||
let room;
|
let room;
|
||||||
if (alias[0] === '#') {
|
if (roomId || alias[0] !== "#") {
|
||||||
room = this._client.getRooms().find((r) => {
|
room = this._client.getRoom(roomId || alias);
|
||||||
return r.getCanonicalAlias() === alias || r.getAliases().includes(alias);
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
room = this._client.getRoom(alias);
|
room = this._client.getRooms().find((r) => {
|
||||||
|
return r.getCanonicalAlias() === alias ||
|
||||||
|
r.getAltAliases().includes(alias);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return new RoomPillPart(alias, room);
|
return new RoomPillPart(alias, room);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue