matrix-react-sdk
Version:
SDK for matrix.org using React
82 lines (73 loc) • 9.04 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.OrderingAlgorithm = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _logger = require("matrix-js-sdk/src/logger");
var _models = require("../models");
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
/**
* Represents a list ordering algorithm. Subclasses should populate the
* `cachedOrderedRooms` field.
*/
class OrderingAlgorithm {
constructor(tagId, initialSortingAlgorithm) {
(0, _defineProperty2.default)(this, "cachedOrderedRooms", []);
// set by setSortAlgorithm() in ctor
(0, _defineProperty2.default)(this, "sortingAlgorithm", void 0);
this.tagId = tagId;
// noinspection JSIgnoredPromiseFromCall
this.setSortAlgorithm(initialSortingAlgorithm); // we use the setter for validation
}
/**
* The rooms as ordered by the algorithm.
*/
get orderedRooms() {
return this.cachedOrderedRooms;
}
get isMutedToBottom() {
return this.sortingAlgorithm === _models.SortAlgorithm.Recent;
}
/**
* Sets the sorting algorithm to use within the list.
* @param newAlgorithm The new algorithm. Must be defined.
* @returns Resolves when complete.
*/
setSortAlgorithm(newAlgorithm) {
if (!newAlgorithm) throw new Error("A sorting algorithm must be defined");
this.sortingAlgorithm = newAlgorithm;
// Force regeneration of the rooms
this.setRooms(this.orderedRooms);
}
/**
* Sets the rooms the algorithm should be handling, implying a reconstruction
* of the ordering.
* @param rooms The rooms to use going forward.
*/
/**
* Handle a room update. The Algorithm will only call this for causes which
* the list ordering algorithm can handle within the same tag. For example,
* tag changes will not be sent here.
* @param room The room where the update happened.
* @param cause The cause of the update.
* @returns True if the update requires the Algorithm to update the presentation layers.
*/
getRoomIndex(room) {
let roomIdx = this.cachedOrderedRooms.indexOf(room);
if (roomIdx === -1) {
// can only happen if the js-sdk's store goes sideways.
_logger.logger.warn(`Degrading performance to find missing room in "${this.tagId}": ${room.roomId}`);
roomIdx = this.cachedOrderedRooms.findIndex(r => r.roomId === room.roomId);
}
return roomIdx;
}
}
exports.OrderingAlgorithm = OrderingAlgorithm;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tb2RlbHMiLCJPcmRlcmluZ0FsZ29yaXRobSIsImNvbnN0cnVjdG9yIiwidGFnSWQiLCJpbml0aWFsU29ydGluZ0FsZ29yaXRobSIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0Iiwic2V0U29ydEFsZ29yaXRobSIsIm9yZGVyZWRSb29tcyIsImNhY2hlZE9yZGVyZWRSb29tcyIsImlzTXV0ZWRUb0JvdHRvbSIsInNvcnRpbmdBbGdvcml0aG0iLCJTb3J0QWxnb3JpdGhtIiwiUmVjZW50IiwibmV3QWxnb3JpdGhtIiwiRXJyb3IiLCJzZXRSb29tcyIsImdldFJvb21JbmRleCIsInJvb20iLCJyb29tSWR4IiwiaW5kZXhPZiIsImxvZ2dlciIsIndhcm4iLCJyb29tSWQiLCJmaW5kSW5kZXgiLCJyIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zdG9yZXMvcm9vbS1saXN0L2FsZ29yaXRobXMvbGlzdC1vcmRlcmluZy9PcmRlcmluZ0FsZ29yaXRobS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBSb29tVXBkYXRlQ2F1c2UsIFRhZ0lEIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuaW1wb3J0IHsgU29ydEFsZ29yaXRobSB9IGZyb20gXCIuLi9tb2RlbHNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbGlzdCBvcmRlcmluZyBhbGdvcml0aG0uIFN1YmNsYXNzZXMgc2hvdWxkIHBvcHVsYXRlIHRoZVxuICogYGNhY2hlZE9yZGVyZWRSb29tc2AgZmllbGQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPcmRlcmluZ0FsZ29yaXRobSB7XG4gICAgcHJvdGVjdGVkIGNhY2hlZE9yZGVyZWRSb29tczogUm9vbVtdID0gW107XG5cbiAgICAvLyBzZXQgYnkgc2V0U29ydEFsZ29yaXRobSgpIGluIGN0b3JcbiAgICBwcm90ZWN0ZWQgc29ydGluZ0FsZ29yaXRobSE6IFNvcnRBbGdvcml0aG07XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgICAgIHByb3RlY3RlZCB0YWdJZDogVGFnSUQsXG4gICAgICAgIGluaXRpYWxTb3J0aW5nQWxnb3JpdGhtOiBTb3J0QWxnb3JpdGhtLFxuICAgICkge1xuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNJZ25vcmVkUHJvbWlzZUZyb21DYWxsXG4gICAgICAgIHRoaXMuc2V0U29ydEFsZ29yaXRobShpbml0aWFsU29ydGluZ0FsZ29yaXRobSk7IC8vIHdlIHVzZSB0aGUgc2V0dGVyIGZvciB2YWxpZGF0aW9uXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIHJvb21zIGFzIG9yZGVyZWQgYnkgdGhlIGFsZ29yaXRobS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG9yZGVyZWRSb29tcygpOiBSb29tW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZWRPcmRlcmVkUm9vbXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc011dGVkVG9Cb3R0b20oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvcnRpbmdBbGdvcml0aG0gPT09IFNvcnRBbGdvcml0aG0uUmVjZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHVzZSB3aXRoaW4gdGhlIGxpc3QuXG4gICAgICogQHBhcmFtIG5ld0FsZ29yaXRobSBUaGUgbmV3IGFsZ29yaXRobS4gTXVzdCBiZSBkZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAgICovXG4gICAgcHVibGljIHNldFNvcnRBbGdvcml0aG0obmV3QWxnb3JpdGhtOiBTb3J0QWxnb3JpdGhtKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3QWxnb3JpdGhtKSB0aHJvdyBuZXcgRXJyb3IoXCJBIHNvcnRpbmcgYWxnb3JpdGhtIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICAgICAgdGhpcy5zb3J0aW5nQWxnb3JpdGhtID0gbmV3QWxnb3JpdGhtO1xuXG4gICAgICAgIC8vIEZvcmNlIHJlZ2VuZXJhdGlvbiBvZiB0aGUgcm9vbXNcbiAgICAgICAgdGhpcy5zZXRSb29tcyh0aGlzLm9yZGVyZWRSb29tcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcm9vbXMgdGhlIGFsZ29yaXRobSBzaG91bGQgYmUgaGFuZGxpbmcsIGltcGx5aW5nIGEgcmVjb25zdHJ1Y3Rpb25cbiAgICAgKiBvZiB0aGUgb3JkZXJpbmcuXG4gICAgICogQHBhcmFtIHJvb21zIFRoZSByb29tcyB0byB1c2UgZ29pbmcgZm9yd2FyZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzdHJhY3Qgc2V0Um9vbXMocm9vbXM6IFJvb21bXSk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYSByb29tIHVwZGF0ZS4gVGhlIEFsZ29yaXRobSB3aWxsIG9ubHkgY2FsbCB0aGlzIGZvciBjYXVzZXMgd2hpY2hcbiAgICAgKiB0aGUgbGlzdCBvcmRlcmluZyBhbGdvcml0aG0gY2FuIGhhbmRsZSB3aXRoaW4gdGhlIHNhbWUgdGFnLiBGb3IgZXhhbXBsZSxcbiAgICAgKiB0YWcgY2hhbmdlcyB3aWxsIG5vdCBiZSBzZW50IGhlcmUuXG4gICAgICogQHBhcmFtIHJvb20gVGhlIHJvb20gd2hlcmUgdGhlIHVwZGF0ZSBoYXBwZW5lZC5cbiAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlIG9mIHRoZSB1cGRhdGUuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdXBkYXRlIHJlcXVpcmVzIHRoZSBBbGdvcml0aG0gdG8gdXBkYXRlIHRoZSBwcmVzZW50YXRpb24gbGF5ZXJzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnN0cmFjdCBoYW5kbGVSb29tVXBkYXRlKHJvb206IFJvb20sIGNhdXNlOiBSb29tVXBkYXRlQ2F1c2UpOiBib29sZWFuO1xuXG4gICAgcHJvdGVjdGVkIGdldFJvb21JbmRleChyb29tOiBSb29tKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJvb21JZHggPSB0aGlzLmNhY2hlZE9yZGVyZWRSb29tcy5pbmRleE9mKHJvb20pO1xuICAgICAgICBpZiAocm9vbUlkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUganMtc2RrJ3Mgc3RvcmUgZ29lcyBzaWRld2F5cy5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBEZWdyYWRpbmcgcGVyZm9ybWFuY2UgdG8gZmluZCBtaXNzaW5nIHJvb20gaW4gXCIke3RoaXMudGFnSWR9XCI6ICR7cm9vbS5yb29tSWR9YCk7XG4gICAgICAgICAgICByb29tSWR4ID0gdGhpcy5jYWNoZWRPcmRlcmVkUm9vbXMuZmluZEluZGV4KChyKSA9PiByLnJvb21JZCA9PT0gcm9vbS5yb29tSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb29tSWR4O1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFHQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQWVFLGlCQUFpQixDQUFDO0VBTTFCQyxXQUFXQSxDQUNQQyxLQUFZLEVBQ3RCQyx1QkFBc0MsRUFDeEM7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBLDhCQVJxQyxFQUFFO0lBRXpDO0lBQUEsSUFBQUQsZ0JBQUEsQ0FBQUMsT0FBQTtJQUFBLEtBSWNILEtBQVksR0FBWkEsS0FBWTtJQUd0QjtJQUNBLElBQUksQ0FBQ0ksZ0JBQWdCLENBQUNILHVCQUF1QixDQUFDLENBQUMsQ0FBQztFQUNwRDs7RUFFQTtBQUNKO0FBQ0E7RUFDSSxJQUFXSSxZQUFZQSxDQUFBLEVBQVc7SUFDOUIsT0FBTyxJQUFJLENBQUNDLGtCQUFrQjtFQUNsQztFQUVBLElBQVdDLGVBQWVBLENBQUEsRUFBWTtJQUNsQyxPQUFPLElBQUksQ0FBQ0MsZ0JBQWdCLEtBQUtDLHFCQUFhLENBQUNDLE1BQU07RUFDekQ7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtFQUNXTixnQkFBZ0JBLENBQUNPLFlBQTJCLEVBQVE7SUFDdkQsSUFBSSxDQUFDQSxZQUFZLEVBQUUsTUFBTSxJQUFJQyxLQUFLLENBQUMscUNBQXFDLENBQUM7SUFDekUsSUFBSSxDQUFDSixnQkFBZ0IsR0FBR0csWUFBWTs7SUFFcEM7SUFDQSxJQUFJLENBQUNFLFFBQVEsQ0FBQyxJQUFJLENBQUNSLFlBQVksQ0FBQztFQUNwQzs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztFQUdJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBR2NTLFlBQVlBLENBQUNDLElBQVUsRUFBVTtJQUN2QyxJQUFJQyxPQUFPLEdBQUcsSUFBSSxDQUFDVixrQkFBa0IsQ0FBQ1csT0FBTyxDQUFDRixJQUFJLENBQUM7SUFDbkQsSUFBSUMsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFO01BQ2hCO01BQ0FFLGNBQU0sQ0FBQ0MsSUFBSSxDQUFDLGtEQUFrRCxJQUFJLENBQUNuQixLQUFLLE1BQU1lLElBQUksQ0FBQ0ssTUFBTSxFQUFFLENBQUM7TUFDNUZKLE9BQU8sR0FBRyxJQUFJLENBQUNWLGtCQUFrQixDQUFDZSxTQUFTLENBQUVDLENBQUMsSUFBS0EsQ0FBQyxDQUFDRixNQUFNLEtBQUtMLElBQUksQ0FBQ0ssTUFBTSxDQUFDO0lBQ2hGO0lBQ0EsT0FBT0osT0FBTztFQUNsQjtBQUNKO0FBQUNPLE9BQUEsQ0FBQXpCLGlCQUFBLEdBQUFBLGlCQUFBIiwiaWdub3JlTGlzdCI6W119