matrix-react-sdk
Version:
SDK for matrix.org using React
82 lines (77 loc) • 11.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePermalinkTargetRoom = void 0;
var _react = require("react");
var _Pill = require("../components/views/elements/Pill");
var _MatrixClientPeg = require("../MatrixClientPeg");
/*
Copyright 2024 New Vector Ltd.
Copyright 2023 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.
*/
/**
* Tries to determine the initial room.
* Initial here means it should be possible to load the room without sending API requests.
* For an @room or a user mention it is the permalinkRoom.
* If the parse result contains a room Id or alias try to find it with {@link findRoom}.
* Otherwise returns null.
*
* @param type - Pill type
* @param permalinkRoom - Room in which the permalink is displayed.
* @param parseResult - Permalink parser result
* @returns Initial room or null if it cannot be determined.
*/
const determineInitialRoom = (type, parseResult, permalinkRoom) => {
if (type === _Pill.PillType.AtRoomMention && permalinkRoom) return permalinkRoom;
if (type === _Pill.PillType.UserMention && permalinkRoom) {
return permalinkRoom;
}
if (parseResult?.roomIdOrAlias) {
const room = findRoom(parseResult.roomIdOrAlias);
if (room) return room;
}
return null;
};
/**
* Tries to find a room by room Id or searching all rooms for an alias.
*
* @param roomIdOrAlias - Id or alias of the room to find.
* @returns Room if found, else null.
*/
const findRoom = roomIdOrAlias => {
const client = _MatrixClientPeg.MatrixClientPeg.safeGet();
return roomIdOrAlias[0] === "#" ? client.getRooms().find(r => {
return r.getCanonicalAlias() === roomIdOrAlias || r.getAltAliases().includes(roomIdOrAlias);
}) ?? null : client.getRoom(roomIdOrAlias);
};
/**
* Hook to get the permalink target room:
*
* @param type - Permalink type
* @param parseResult - Permalink parse result
* @param permalinkRoom - Room in which the permalink is rendered
* @returns Returns the target room:
* - The permalinkRoom for an @room or user mention
* - The room of the parse result for a room mention
* - The room of the event for an event permalink
* - Null in other cases or if the room cannot be found
*/
const usePermalinkTargetRoom = (type, parseResult, permalinkRoom) => {
// The listed permalink types require a room.
// If it cannot be initially determined, it will be looked up later by a memo hook.
const shouldLookUpRoom = type && [_Pill.PillType.RoomMention, _Pill.PillType.EventInSameRoom, _Pill.PillType.EventInOtherRoom, "space"].includes(type);
const initialRoom = determineInitialRoom(type, parseResult, permalinkRoom);
const [targetRoom, setTargetRoom] = (0, _react.useState)(initialRoom);
(0, _react.useEffect)(() => {
if (shouldLookUpRoom && !targetRoom && parseResult?.roomIdOrAlias) {
const newRoom = findRoom(parseResult.roomIdOrAlias);
setTargetRoom(newRoom);
}
}, [parseResult?.roomIdOrAlias, shouldLookUpRoom, targetRoom]);
return targetRoom;
};
exports.usePermalinkTargetRoom = usePermalinkTargetRoom;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX1BpbGwiLCJfTWF0cml4Q2xpZW50UGVnIiwiZGV0ZXJtaW5lSW5pdGlhbFJvb20iLCJ0eXBlIiwicGFyc2VSZXN1bHQiLCJwZXJtYWxpbmtSb29tIiwiUGlsbFR5cGUiLCJBdFJvb21NZW50aW9uIiwiVXNlck1lbnRpb24iLCJyb29tSWRPckFsaWFzIiwicm9vbSIsImZpbmRSb29tIiwiY2xpZW50IiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsImdldFJvb21zIiwiZmluZCIsInIiLCJnZXRDYW5vbmljYWxBbGlhcyIsImdldEFsdEFsaWFzZXMiLCJpbmNsdWRlcyIsImdldFJvb20iLCJ1c2VQZXJtYWxpbmtUYXJnZXRSb29tIiwic2hvdWxkTG9va1VwUm9vbSIsIlJvb21NZW50aW9uIiwiRXZlbnRJblNhbWVSb29tIiwiRXZlbnRJbk90aGVyUm9vbSIsImluaXRpYWxSb29tIiwidGFyZ2V0Um9vbSIsInNldFRhcmdldFJvb20iLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIm5ld1Jvb20iLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZVBlcm1hbGlua1RhcmdldFJvb20udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgUGlsbFR5cGUgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9lbGVtZW50cy9QaWxsXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBQZXJtYWxpbmtQYXJ0cyB9IGZyb20gXCIuLi91dGlscy9wZXJtYWxpbmtzL1Blcm1hbGlua0NvbnN0cnVjdG9yXCI7XG5cbi8qKlxuICogVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHJvb20uXG4gKiBJbml0aWFsIGhlcmUgbWVhbnMgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGxvYWQgdGhlIHJvb20gd2l0aG91dCBzZW5kaW5nIEFQSSByZXF1ZXN0cy5cbiAqIEZvciBhbiBAcm9vbSBvciBhIHVzZXIgbWVudGlvbiBpdCBpcyB0aGUgcGVybWFsaW5rUm9vbS5cbiAqIElmIHRoZSBwYXJzZSByZXN1bHQgY29udGFpbnMgYSByb29tIElkIG9yIGFsaWFzIHRyeSB0byBmaW5kIGl0IHdpdGgge0BsaW5rIGZpbmRSb29tfS5cbiAqIE90aGVyd2lzZSByZXR1cm5zIG51bGwuXG4gKlxuICogQHBhcmFtIHR5cGUgLSBQaWxsIHR5cGVcbiAqIEBwYXJhbSBwZXJtYWxpbmtSb29tIC0gUm9vbSBpbiB3aGljaCB0aGUgcGVybWFsaW5rIGlzIGRpc3BsYXllZC5cbiAqIEBwYXJhbSBwYXJzZVJlc3VsdCAtIFBlcm1hbGluayBwYXJzZXIgcmVzdWx0XG4gKiBAcmV0dXJucyBJbml0aWFsIHJvb20gb3IgbnVsbCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xuY29uc3QgZGV0ZXJtaW5lSW5pdGlhbFJvb20gPSAoXG4gICAgdHlwZTogUGlsbFR5cGUgfCBudWxsLFxuICAgIHBhcnNlUmVzdWx0OiBQZXJtYWxpbmtQYXJ0cyB8IG51bGwsXG4gICAgcGVybWFsaW5rUm9vbTogUm9vbSB8IHVuZGVmaW5lZCxcbik6IFJvb20gfCBudWxsID0+IHtcbiAgICBpZiAodHlwZSA9PT0gUGlsbFR5cGUuQXRSb29tTWVudGlvbiAmJiBwZXJtYWxpbmtSb29tKSByZXR1cm4gcGVybWFsaW5rUm9vbTtcblxuICAgIGlmICh0eXBlID09PSBQaWxsVHlwZS5Vc2VyTWVudGlvbiAmJiBwZXJtYWxpbmtSb29tKSB7XG4gICAgICAgIHJldHVybiBwZXJtYWxpbmtSb29tO1xuICAgIH1cblxuICAgIGlmIChwYXJzZVJlc3VsdD8ucm9vbUlkT3JBbGlhcykge1xuICAgICAgICBjb25zdCByb29tID0gZmluZFJvb20ocGFyc2VSZXN1bHQucm9vbUlkT3JBbGlhcyk7XG4gICAgICAgIGlmIChyb29tKSByZXR1cm4gcm9vbTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogVHJpZXMgdG8gZmluZCBhIHJvb20gYnkgcm9vbSBJZCBvciBzZWFyY2hpbmcgYWxsIHJvb21zIGZvciBhbiBhbGlhcy5cbiAqXG4gKiBAcGFyYW0gcm9vbUlkT3JBbGlhcyAtIElkIG9yIGFsaWFzIG9mIHRoZSByb29tIHRvIGZpbmQuXG4gKiBAcmV0dXJucyBSb29tIGlmIGZvdW5kLCBlbHNlIG51bGwuXG4gKi9cbmNvbnN0IGZpbmRSb29tID0gKHJvb21JZE9yQWxpYXM6IHN0cmluZyk6IFJvb20gfCBudWxsID0+IHtcbiAgICBjb25zdCBjbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuXG4gICAgcmV0dXJuIHJvb21JZE9yQWxpYXNbMF0gPT09IFwiI1wiXG4gICAgICAgID8gKGNsaWVudC5nZXRSb29tcygpLmZpbmQoKHIpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIuZ2V0Q2Fub25pY2FsQWxpYXMoKSA9PT0gcm9vbUlkT3JBbGlhcyB8fCByLmdldEFsdEFsaWFzZXMoKS5pbmNsdWRlcyhyb29tSWRPckFsaWFzKTtcbiAgICAgICAgICB9KSA/PyBudWxsKVxuICAgICAgICA6IGNsaWVudC5nZXRSb29tKHJvb21JZE9yQWxpYXMpO1xufTtcblxuLyoqXG4gKiBIb29rIHRvIGdldCB0aGUgcGVybWFsaW5rIHRhcmdldCByb29tOlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gUGVybWFsaW5rIHR5cGVcbiAqIEBwYXJhbSBwYXJzZVJlc3VsdCAtIFBlcm1hbGluayBwYXJzZSByZXN1bHRcbiAqIEBwYXJhbSBwZXJtYWxpbmtSb29tIC0gUm9vbSBpbiB3aGljaCB0aGUgcGVybWFsaW5rIGlzIHJlbmRlcmVkXG4gKiBAcmV0dXJucyBSZXR1cm5zIHRoZSB0YXJnZXQgcm9vbTpcbiAqICAgICAgICAgIC0gVGhlIHBlcm1hbGlua1Jvb20gZm9yIGFuIEByb29tIG9yIHVzZXIgbWVudGlvblxuICogICAgICAgICAgLSBUaGUgcm9vbSBvZiB0aGUgcGFyc2UgcmVzdWx0IGZvciBhIHJvb20gbWVudGlvblxuICogICAgICAgICAgLSBUaGUgcm9vbSBvZiB0aGUgZXZlbnQgZm9yIGFuIGV2ZW50IHBlcm1hbGlua1xuICogICAgICAgICAgLSBOdWxsIGluIG90aGVyIGNhc2VzIG9yIGlmIHRoZSByb29tIGNhbm5vdCBiZSBmb3VuZFxuICovXG5leHBvcnQgY29uc3QgdXNlUGVybWFsaW5rVGFyZ2V0Um9vbSA9IChcbiAgICB0eXBlOiBQaWxsVHlwZSB8IG51bGwsXG4gICAgcGFyc2VSZXN1bHQ6IFBlcm1hbGlua1BhcnRzIHwgbnVsbCxcbiAgICBwZXJtYWxpbmtSb29tOiBSb29tIHwgdW5kZWZpbmVkLFxuKTogUm9vbSB8IG51bGwgPT4ge1xuICAgIC8vIFRoZSBsaXN0ZWQgcGVybWFsaW5rIHR5cGVzIHJlcXVpcmUgYSByb29tLlxuICAgIC8vIElmIGl0IGNhbm5vdCBiZSBpbml0aWFsbHkgZGV0ZXJtaW5lZCwgaXQgd2lsbCBiZSBsb29rZWQgdXAgbGF0ZXIgYnkgYSBtZW1vIGhvb2suXG4gICAgY29uc3Qgc2hvdWxkTG9va1VwUm9vbSA9XG4gICAgICAgIHR5cGUgJiYgW1BpbGxUeXBlLlJvb21NZW50aW9uLCBQaWxsVHlwZS5FdmVudEluU2FtZVJvb20sIFBpbGxUeXBlLkV2ZW50SW5PdGhlclJvb20sIFwic3BhY2VcIl0uaW5jbHVkZXModHlwZSk7XG4gICAgY29uc3QgaW5pdGlhbFJvb20gPSBkZXRlcm1pbmVJbml0aWFsUm9vbSh0eXBlLCBwYXJzZVJlc3VsdCwgcGVybWFsaW5rUm9vbSk7XG4gICAgY29uc3QgW3RhcmdldFJvb20sIHNldFRhcmdldFJvb21dID0gdXNlU3RhdGU8Um9vbSB8IG51bGw+KGluaXRpYWxSb29tKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRMb29rVXBSb29tICYmICF0YXJnZXRSb29tICYmIHBhcnNlUmVzdWx0Py5yb29tSWRPckFsaWFzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdSb29tID0gZmluZFJvb20ocGFyc2VSZXN1bHQucm9vbUlkT3JBbGlhcyk7XG4gICAgICAgICAgICBzZXRUYXJnZXRSb29tKG5ld1Jvb20pO1xuICAgICAgICB9XG4gICAgfSwgW3BhcnNlUmVzdWx0Py5yb29tSWRPckFsaWFzLCBzaG91bGRMb29rVXBSb29tLCB0YXJnZXRSb29tXSk7XG5cbiAgICByZXR1cm4gdGFyZ2V0Um9vbTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRyxvQkFBb0IsR0FBR0EsQ0FDekJDLElBQXFCLEVBQ3JCQyxXQUFrQyxFQUNsQ0MsYUFBK0IsS0FDakI7RUFDZCxJQUFJRixJQUFJLEtBQUtHLGNBQVEsQ0FBQ0MsYUFBYSxJQUFJRixhQUFhLEVBQUUsT0FBT0EsYUFBYTtFQUUxRSxJQUFJRixJQUFJLEtBQUtHLGNBQVEsQ0FBQ0UsV0FBVyxJQUFJSCxhQUFhLEVBQUU7SUFDaEQsT0FBT0EsYUFBYTtFQUN4QjtFQUVBLElBQUlELFdBQVcsRUFBRUssYUFBYSxFQUFFO0lBQzVCLE1BQU1DLElBQUksR0FBR0MsUUFBUSxDQUFDUCxXQUFXLENBQUNLLGFBQWEsQ0FBQztJQUNoRCxJQUFJQyxJQUFJLEVBQUUsT0FBT0EsSUFBSTtFQUN6QjtFQUVBLE9BQU8sSUFBSTtBQUNmLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsUUFBUSxHQUFJRixhQUFxQixJQUFrQjtFQUNyRCxNQUFNRyxNQUFNLEdBQUdDLGdDQUFlLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0VBRXhDLE9BQU9MLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQ3hCRyxNQUFNLENBQUNHLFFBQVEsQ0FBQyxDQUFDLENBQUNDLElBQUksQ0FBRUMsQ0FBQyxJQUFLO0lBQzNCLE9BQU9BLENBQUMsQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQyxLQUFLVCxhQUFhLElBQUlRLENBQUMsQ0FBQ0UsYUFBYSxDQUFDLENBQUMsQ0FBQ0MsUUFBUSxDQUFDWCxhQUFhLENBQUM7RUFDL0YsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUNWRyxNQUFNLENBQUNTLE9BQU8sQ0FBQ1osYUFBYSxDQUFDO0FBQ3ZDLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sTUFBTWEsc0JBQXNCLEdBQUdBLENBQ2xDbkIsSUFBcUIsRUFDckJDLFdBQWtDLEVBQ2xDQyxhQUErQixLQUNqQjtFQUNkO0VBQ0E7RUFDQSxNQUFNa0IsZ0JBQWdCLEdBQ2xCcEIsSUFBSSxJQUFJLENBQUNHLGNBQVEsQ0FBQ2tCLFdBQVcsRUFBRWxCLGNBQVEsQ0FBQ21CLGVBQWUsRUFBRW5CLGNBQVEsQ0FBQ29CLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDTixRQUFRLENBQUNqQixJQUFJLENBQUM7RUFDL0csTUFBTXdCLFdBQVcsR0FBR3pCLG9CQUFvQixDQUFDQyxJQUFJLEVBQUVDLFdBQVcsRUFBRUMsYUFBYSxDQUFDO0VBQzFFLE1BQU0sQ0FBQ3VCLFVBQVUsRUFBRUMsYUFBYSxDQUFDLEdBQUcsSUFBQUMsZUFBUSxFQUFjSCxXQUFXLENBQUM7RUFFdEUsSUFBQUksZ0JBQVMsRUFBQyxNQUFNO0lBQ1osSUFBSVIsZ0JBQWdCLElBQUksQ0FBQ0ssVUFBVSxJQUFJeEIsV0FBVyxFQUFFSyxhQUFhLEVBQUU7TUFDL0QsTUFBTXVCLE9BQU8sR0FBR3JCLFFBQVEsQ0FBQ1AsV0FBVyxDQUFDSyxhQUFhLENBQUM7TUFDbkRvQixhQUFhLENBQUNHLE9BQU8sQ0FBQztJQUMxQjtFQUNKLENBQUMsRUFBRSxDQUFDNUIsV0FBVyxFQUFFSyxhQUFhLEVBQUVjLGdCQUFnQixFQUFFSyxVQUFVLENBQUMsQ0FBQztFQUU5RCxPQUFPQSxVQUFVO0FBQ3JCLENBQUM7QUFBQ0ssT0FBQSxDQUFBWCxzQkFBQSxHQUFBQSxzQkFBQSIsImlnbm9yZUxpc3QiOltdfQ==