matrix-react-sdk
Version:
SDK for matrix.org using React
183 lines (146 loc) • 18.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _lodash = require("lodash");
var _languageHandler = require("../languageHandler");
var _AutocompleteProvider = _interopRequireDefault(require("./AutocompleteProvider"));
var _MatrixClientPeg = require("../MatrixClientPeg");
var _QueryMatcher = _interopRequireDefault(require("./QueryMatcher"));
var _Components = require("./Components");
var _Permalinks = require("../utils/permalinks/Permalinks");
var _RoomAvatar = _interopRequireDefault(require("../components/views/avatars/RoomAvatar"));
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
/*
Copyright 2016 Aviral Dasgupta
Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2017, 2018, 2021 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
const ROOM_REGEX = /\B#\S*/g;
function score(query
/*: string*/
, space
/*: string*/
) {
const index = space.indexOf(query);
if (index === -1) {
return Infinity;
} else {
return index;
}
}
function matcherObject(room
/*: Room*/
, displayedAlias
/*: string*/
, matchName = "") {
return {
room,
matchName,
displayedAlias
};
}
class RoomProvider extends _AutocompleteProvider.default {
constructor() {
super(ROOM_REGEX);
(0, _defineProperty2.default)(this, "matcher", void 0);
this.matcher = new _QueryMatcher.default([], {
keys: ['displayedAlias', 'matchName']
});
}
getRooms() {
const cli = _MatrixClientPeg.MatrixClientPeg.get();
let rooms = cli.getVisibleRooms();
if (_SettingsStore.default.getValue("feature_spaces")) {
rooms = rooms.filter(r => !r.isSpaceRoom());
}
return rooms;
}
async getCompletions(query
/*: string*/
, selection
/*: ISelectionRange*/
, force = false, limit = -1)
/*: Promise<ICompletion[]>*/
{
let completions = [];
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 = this.getRooms().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", "");
if (tombstone && tombstone.getContent() && tombstone.getContent()['replacement_room']) {
const hasReplacementRoom = matcherObjects.some(r2 => r2.room.roomId === tombstone.getContent()['replacement_room']);
return !hasReplacementRoom;
}
return true;
});
this.matcher.setObjects(matcherObjects);
const matchedString = command[0];
completions = this.matcher.match(matchedString, limit);
completions = (0, _lodash.sortBy)(completions, [c => score(matchedString, c.displayedAlias), c => c.displayedAlias.length]);
completions = (0, _lodash.uniqBy)(completions, match => match.room);
completions = completions.map(room => {
return {
completion: room.displayedAlias,
completionId: room.room.roomId,
type: "room",
suffix: ' ',
href: (0, _Permalinks.makeRoomPermalink)(room.displayedAlias),
component: /*#__PURE__*/_react.default.createElement(_Components.PillCompletion, {
title: room.room.name,
description: room.displayedAlias
}, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
width: 24,
height: 24,
room: room.room
})),
range
};
}).filter(completion => !!completion.completion && completion.completion.length > 0);
}
return completions;
}
getName() {
return (0, _languageHandler._t)('Rooms');
}
renderCompletions(completions
/*: React.ReactNode[]*/
)
/*: React.ReactNode*/
{
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Autocomplete_Completion_container_pill mx_Autocomplete_Completion_container_truncate",
role: "listbox",
"aria-label": (0, _languageHandler._t)("Room Autocomplete")
}, completions);
}
}
exports.default = RoomProvider;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRvY29tcGxldGUvUm9vbVByb3ZpZGVyLnRzeCJdLCJuYW1lcyI6WyJST09NX1JFR0VYIiwic2NvcmUiLCJxdWVyeSIsInNwYWNlIiwiaW5kZXgiLCJpbmRleE9mIiwiSW5maW5pdHkiLCJtYXRjaGVyT2JqZWN0Iiwicm9vbSIsImRpc3BsYXllZEFsaWFzIiwibWF0Y2hOYW1lIiwiUm9vbVByb3ZpZGVyIiwiQXV0b2NvbXBsZXRlUHJvdmlkZXIiLCJjb25zdHJ1Y3RvciIsIm1hdGNoZXIiLCJRdWVyeU1hdGNoZXIiLCJrZXlzIiwiZ2V0Um9vbXMiLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJyb29tcyIsImdldFZpc2libGVSb29tcyIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsImZpbHRlciIsInIiLCJpc1NwYWNlUm9vbSIsImdldENvbXBsZXRpb25zIiwic2VsZWN0aW9uIiwiZm9yY2UiLCJsaW1pdCIsImNvbXBsZXRpb25zIiwiY29tbWFuZCIsInJhbmdlIiwiZ2V0Q3VycmVudENvbW1hbmQiLCJtYXRjaGVyT2JqZWN0cyIsInJlZHVjZSIsImFsaWFzZXMiLCJnZXRDYW5vbmljYWxBbGlhcyIsImNvbmNhdCIsIm5hbWUiLCJnZXRBbHRBbGlhc2VzIiwibGVuZ3RoIiwiYWx0QWxpYXNlcyIsIm1hcCIsImFsaWFzIiwidG9tYnN0b25lIiwiY3VycmVudFN0YXRlIiwiZ2V0U3RhdGVFdmVudHMiLCJnZXRDb250ZW50IiwiaGFzUmVwbGFjZW1lbnRSb29tIiwic29tZSIsInIyIiwicm9vbUlkIiwic2V0T2JqZWN0cyIsIm1hdGNoZWRTdHJpbmciLCJtYXRjaCIsImMiLCJjb21wbGV0aW9uIiwiY29tcGxldGlvbklkIiwidHlwZSIsInN1ZmZpeCIsImhyZWYiLCJjb21wb25lbnQiLCJnZXROYW1lIiwicmVuZGVyQ29tcGxldGlvbnMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBa0JBOztBQUNBOztBQUdBOztBQUNB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NiBBdmlyYWwgRGFzZ3VwdGFcbkNvcHlyaWdodCAyMDE4IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTcsIDIwMTgsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge3VuaXFCeSwgc29ydEJ5fSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgUm9vbSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb21cIjtcblxuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IEF1dG9jb21wbGV0ZVByb3ZpZGVyIGZyb20gJy4vQXV0b2NvbXBsZXRlUHJvdmlkZXInO1xuaW1wb3J0IHtNYXRyaXhDbGllbnRQZWd9IGZyb20gJy4uL01hdHJpeENsaWVudFBlZyc7XG5pbXBvcnQgUXVlcnlNYXRjaGVyIGZyb20gJy4vUXVlcnlNYXRjaGVyJztcbmltcG9ydCB7UGlsbENvbXBsZXRpb259IGZyb20gJy4vQ29tcG9uZW50cyc7XG5pbXBvcnQge21ha2VSb29tUGVybWFsaW5rfSBmcm9tIFwiLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQge0lDb21wbGV0aW9uLCBJU2VsZWN0aW9uUmFuZ2V9IGZyb20gXCIuL0F1dG9jb21wbGV0ZXJcIjtcbmltcG9ydCBSb29tQXZhdGFyIGZyb20gJy4uL2NvbXBvbmVudHMvdmlld3MvYXZhdGFycy9Sb29tQXZhdGFyJztcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5cbmNvbnN0IFJPT01fUkVHRVggPSAvXFxCI1xcUyovZztcblxuZnVuY3Rpb24gc2NvcmUocXVlcnk6IHN0cmluZywgc3BhY2U6IHN0cmluZykge1xuICAgIGNvbnN0IGluZGV4ID0gc3BhY2UuaW5kZXhPZihxdWVyeSk7XG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbWF0Y2hlck9iamVjdChyb29tOiBSb29tLCBkaXNwbGF5ZWRBbGlhczogc3RyaW5nLCBtYXRjaE5hbWUgPSBcIlwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcm9vbSxcbiAgICAgICAgbWF0Y2hOYW1lLFxuICAgICAgICBkaXNwbGF5ZWRBbGlhcyxcbiAgICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSb29tUHJvdmlkZXIgZXh0ZW5kcyBBdXRvY29tcGxldGVQcm92aWRlciB7XG4gICAgcHJvdGVjdGVkIG1hdGNoZXI6IFF1ZXJ5TWF0Y2hlcjxSb29tPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihST09NX1JFR0VYKTtcbiAgICAgICAgdGhpcy5tYXRjaGVyID0gbmV3IFF1ZXJ5TWF0Y2hlcihbXSwge1xuICAgICAgICAgICAga2V5czogWydkaXNwbGF5ZWRBbGlhcycsICdtYXRjaE5hbWUnXSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldFJvb21zKCkge1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIGxldCByb29tcyA9IGNsaS5nZXRWaXNpYmxlUm9vbXMoKTtcblxuICAgICAgICBpZiAoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcImZlYXR1cmVfc3BhY2VzXCIpKSB7XG4gICAgICAgICAgICByb29tcyA9IHJvb21zLmZpbHRlcihyID0+ICFyLmlzU3BhY2VSb29tKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJvb21zO1xuICAgIH1cblxuICAgIGFzeW5jIGdldENvbXBsZXRpb25zKFxuICAgICAgICBxdWVyeTogc3RyaW5nLFxuICAgICAgICBzZWxlY3Rpb246IElTZWxlY3Rpb25SYW5nZSxcbiAgICAgICAgZm9yY2UgPSBmYWxzZSxcbiAgICAgICAgbGltaXQgPSAtMSxcbiAgICApOiBQcm9taXNlPElDb21wbGV0aW9uW10+IHtcbiAgICAgICAgbGV0IGNvbXBsZXRpb25zID0gW107XG4gICAgICAgIGNvbnN0IHtjb21tYW5kLCByYW5nZX0gPSB0aGlzLmdldEN1cnJlbnRDb21tYW5kKHF1ZXJ5LCBzZWxlY3Rpb24sIGZvcmNlKTtcbiAgICAgICAgaWYgKGNvbW1hbmQpIHtcbiAgICAgICAgICAgIC8vIHRoZSBvbmx5IHJlYXNvbiB3ZSBuZWVkIHRvIGRvIHRoaXMgaXMgYmVjYXVzZSBGdXNlIG9ubHkgbWF0Y2hlcyBvbiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBsZXQgbWF0Y2hlck9iamVjdHMgPSB0aGlzLmdldFJvb21zKCkucmVkdWNlKChhbGlhc2VzLCByb29tKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJvb20uZ2V0Q2Fub25pY2FsQWxpYXMoKSkge1xuICAgICAgICAgICAgICAgICAgICBhbGlhc2VzID0gYWxpYXNlcy5jb25jYXQobWF0Y2hlck9iamVjdChyb29tLCByb29tLmdldENhbm9uaWNhbEFsaWFzKCksIHJvb20ubmFtZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocm9vbS5nZXRBbHRBbGlhc2VzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsdEFsaWFzZXMgPSByb29tLmdldEFsdEFsaWFzZXMoKS5tYXAoYWxpYXMgPT4gbWF0Y2hlck9iamVjdChyb29tLCBhbGlhcykpO1xuICAgICAgICAgICAgICAgICAgICBhbGlhc2VzID0gYWxpYXNlcy5jb25jYXQoYWx0QWxpYXNlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhbGlhc2VzO1xuICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgbWF0Y2hlcyB3aGVyZSB0aGUgdXNlciB3aWxsIGhhdmUgYWxzbyBhdXRvY29tcGxldGVkIG5ldyByb29tc1xuICAgICAgICAgICAgbWF0Y2hlck9iamVjdHMgPSBtYXRjaGVyT2JqZWN0cy5maWx0ZXIoKHIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b21ic3RvbmUgPSByLnJvb20uY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKFwibS5yb29tLnRvbWJzdG9uZVwiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICBpZiAodG9tYnN0b25lICYmIHRvbWJzdG9uZS5nZXRDb250ZW50KCkgJiYgdG9tYnN0b25lLmdldENvbnRlbnQoKVsncmVwbGFjZW1lbnRfcm9vbSddKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc1JlcGxhY2VtZW50Um9vbSA9IG1hdGNoZXJPYmplY3RzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAocjIpID0+IHIyLnJvb20ucm9vbUlkID09PSB0b21ic3RvbmUuZ2V0Q29udGVudCgpWydyZXBsYWNlbWVudF9yb29tJ10sXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaGFzUmVwbGFjZW1lbnRSb29tO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm1hdGNoZXIuc2V0T2JqZWN0cyhtYXRjaGVyT2JqZWN0cyk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gY29tbWFuZFswXTtcbiAgICAgICAgICAgIGNvbXBsZXRpb25zID0gdGhpcy5tYXRjaGVyLm1hdGNoKG1hdGNoZWRTdHJpbmcsIGxpbWl0KTtcbiAgICAgICAgICAgIGNvbXBsZXRpb25zID0gc29ydEJ5KGNvbXBsZXRpb25zLCBbXG4gICAgICAgICAgICAgICAgKGMpID0+IHNjb3JlKG1hdGNoZWRTdHJpbmcsIGMuZGlzcGxheWVkQWxpYXMpLFxuICAgICAgICAgICAgICAgIChjKSA9PiBjLmRpc3BsYXllZEFsaWFzLmxlbmd0aCxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgY29tcGxldGlvbnMgPSB1bmlxQnkoY29tcGxldGlvbnMsIChtYXRjaCkgPT4gbWF0Y2gucm9vbSk7XG4gICAgICAgICAgICBjb21wbGV0aW9ucyA9IGNvbXBsZXRpb25zLm1hcCgocm9vbSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb246IHJvb20uZGlzcGxheWVkQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25JZDogcm9vbS5yb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJyb29tXCIsXG4gICAgICAgICAgICAgICAgICAgIHN1ZmZpeDogJyAnLFxuICAgICAgICAgICAgICAgICAgICBocmVmOiBtYWtlUm9vbVBlcm1hbGluayhyb29tLmRpc3BsYXllZEFsaWFzKSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8UGlsbENvbXBsZXRpb24gdGl0bGU9e3Jvb20ucm9vbS5uYW1lfSBkZXNjcmlwdGlvbj17cm9vbS5kaXNwbGF5ZWRBbGlhc30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJvb21BdmF0YXIgd2lkdGg9ezI0fSBoZWlnaHQ9ezI0fSByb29tPXtyb29tLnJvb219IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1BpbGxDb21wbGV0aW9uPlxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkuZmlsdGVyKChjb21wbGV0aW9uKSA9PiAhIWNvbXBsZXRpb24uY29tcGxldGlvbiAmJiBjb21wbGV0aW9uLmNvbXBsZXRpb24ubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBsZXRpb25zO1xuICAgIH1cblxuICAgIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiBfdCgnUm9vbXMnKTtcbiAgICB9XG5cbiAgICByZW5kZXJDb21wbGV0aW9ucyhjb21wbGV0aW9uczogUmVhY3QuUmVhY3ROb2RlW10pOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0F1dG9jb21wbGV0ZV9Db21wbGV0aW9uX2NvbnRhaW5lcl9waWxsIG14X0F1dG9jb21wbGV0ZV9Db21wbGV0aW9uX2NvbnRhaW5lcl90cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiUm9vbSBBdXRvY29tcGxldGVcIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgeyBjb21wbGV0aW9ucyB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=