matrix-react-sdk
Version:
SDK for matrix.org using React
112 lines (106 loc) • 14.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePermalinkMember = void 0;
var _matrix = require("matrix-js-sdk/src/matrix");
var _react = require("react");
var _Pill = require("../components/views/elements/Pill");
var _SDKContext = require("../contexts/SDKContext");
/*
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.
*/
const createMemberFromProfile = (userId, profile) => {
const member = new _matrix.RoomMember("", userId);
member.name = profile.displayname ?? userId;
member.rawDisplayName = member.name;
member.events.member = {
getContent: () => {
return {
avatar_url: profile.avatar_url
};
},
getDirectionalContent: function () {
// eslint-disable-next-line
return this.getContent();
}
};
return member;
};
/**
* Tries to determine the user Id of a permalink.
* In case of a user permalink it is the user id.
* In case of an event permalink it is the sender user Id of the event if that event is available.
* Otherwise returns null.
*
* @param type - pill type
* @param parseResult - permalink parse result
* @param event - permalink event, if available
* @returns permalink user Id. null if the Id cannot be determined.
*/
const determineUserId = (type, parseResult, event) => {
if (type === null) return null;
if (parseResult?.userId) return parseResult.userId;
if (event && [_Pill.PillType.EventInSameRoom, _Pill.PillType.EventInOtherRoom].includes(type)) {
return event.getSender() ?? null;
}
return null;
};
/**
* Tries to determine a RoomMember.
*
* @param userId - User Id to get the member for
* @param targetRoom - permalink target room
* @returns RoomMember of the target room if it exists.
* If sharing at least one room with the user, then the result will be the profile fetched via API.
* null in all other cases.
*/
const determineMember = (userId, targetRoom) => {
const targetRoomMember = targetRoom.getMember(userId);
if (targetRoomMember) return targetRoomMember;
const knownProfile = _SDKContext.SdkContextClass.instance.userProfilesStore.getOnlyKnownProfile(userId);
if (knownProfile) {
return createMemberFromProfile(userId, knownProfile);
}
return null;
};
/**
* Hook to get the permalink member
*
* @param type - Permalink type
* @param parseResult - Permalink parse result
* @param targetRoom - Permalink target room {@link ./usePermalinkTargetRoom.ts}
* @param event - Permalink event
* @returns The permalink member:
* - The room member for a user mention
* - The sender for a permalink to an event in the same room
* - Null in other cases or the user cannot be loaded.
*/
const usePermalinkMember = (type, parseResult, targetRoom, event) => {
// User mentions and permalinks to events in the same room require to know the user.
// If it cannot be initially determined, it will be looked up later by a memo hook.
const shouldLookUpUser = type && [_Pill.PillType.UserMention, _Pill.PillType.EventInSameRoom].includes(type);
const userId = determineUserId(type, parseResult, event);
const userInRoom = shouldLookUpUser && userId && targetRoom ? determineMember(userId, targetRoom) : null;
const [member, setMember] = (0, _react.useState)(userInRoom);
(0, _react.useEffect)(() => {
if (!shouldLookUpUser || !userId || member) {
// nothing to do here
return;
}
const doProfileLookup = async () => {
const fetchedProfile = await _SDKContext.SdkContextClass.instance.userProfilesStore.fetchOnlyKnownProfile(userId);
if (fetchedProfile) {
const newMember = createMemberFromProfile(userId, fetchedProfile);
setMember(newMember);
}
};
doProfileLookup();
}, [member, shouldLookUpUser, targetRoom, userId]);
return member;
};
exports.usePermalinkMember = usePermalinkMember;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9yZWFjdCIsIl9QaWxsIiwiX1NES0NvbnRleHQiLCJjcmVhdGVNZW1iZXJGcm9tUHJvZmlsZSIsInVzZXJJZCIsInByb2ZpbGUiLCJtZW1iZXIiLCJSb29tTWVtYmVyIiwibmFtZSIsImRpc3BsYXluYW1lIiwicmF3RGlzcGxheU5hbWUiLCJldmVudHMiLCJnZXRDb250ZW50IiwiYXZhdGFyX3VybCIsImdldERpcmVjdGlvbmFsQ29udGVudCIsImRldGVybWluZVVzZXJJZCIsInR5cGUiLCJwYXJzZVJlc3VsdCIsImV2ZW50IiwiUGlsbFR5cGUiLCJFdmVudEluU2FtZVJvb20iLCJFdmVudEluT3RoZXJSb29tIiwiaW5jbHVkZXMiLCJnZXRTZW5kZXIiLCJkZXRlcm1pbmVNZW1iZXIiLCJ0YXJnZXRSb29tIiwidGFyZ2V0Um9vbU1lbWJlciIsImdldE1lbWJlciIsImtub3duUHJvZmlsZSIsIlNka0NvbnRleHRDbGFzcyIsImluc3RhbmNlIiwidXNlclByb2ZpbGVzU3RvcmUiLCJnZXRPbmx5S25vd25Qcm9maWxlIiwidXNlUGVybWFsaW5rTWVtYmVyIiwic2hvdWxkTG9va1VwVXNlciIsIlVzZXJNZW50aW9uIiwidXNlckluUm9vbSIsInNldE1lbWJlciIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiZG9Qcm9maWxlTG9va3VwIiwiZmV0Y2hlZFByb2ZpbGUiLCJmZXRjaE9ubHlLbm93blByb2ZpbGUiLCJuZXdNZW1iZXIiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZVBlcm1hbGlua01lbWJlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMyBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBJTWF0cml4UHJvZmlsZSwgTWF0cml4RXZlbnQsIFJvb20sIFJvb21NZW1iZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IFBpbGxUeXBlIH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvdmlld3MvZWxlbWVudHMvUGlsbFwiO1xuaW1wb3J0IHsgU2RrQ29udGV4dENsYXNzIH0gZnJvbSBcIi4uL2NvbnRleHRzL1NES0NvbnRleHRcIjtcbmltcG9ydCB7IFBlcm1hbGlua1BhcnRzIH0gZnJvbSBcIi4uL3V0aWxzL3Blcm1hbGlua3MvUGVybWFsaW5rQ29uc3RydWN0b3JcIjtcblxuY29uc3QgY3JlYXRlTWVtYmVyRnJvbVByb2ZpbGUgPSAodXNlcklkOiBzdHJpbmcsIHByb2ZpbGU6IElNYXRyaXhQcm9maWxlKTogUm9vbU1lbWJlciA9PiB7XG4gICAgY29uc3QgbWVtYmVyID0gbmV3IFJvb21NZW1iZXIoXCJcIiwgdXNlcklkKTtcbiAgICBtZW1iZXIubmFtZSA9IHByb2ZpbGUuZGlzcGxheW5hbWUgPz8gdXNlcklkO1xuICAgIG1lbWJlci5yYXdEaXNwbGF5TmFtZSA9IG1lbWJlci5uYW1lO1xuICAgIG1lbWJlci5ldmVudHMubWVtYmVyID0ge1xuICAgICAgICBnZXRDb250ZW50OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBhdmF0YXJfdXJsOiBwcm9maWxlLmF2YXRhcl91cmwgfTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RGlyZWN0aW9uYWxDb250ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKTtcbiAgICAgICAgfSxcbiAgICB9IGFzIE1hdHJpeEV2ZW50O1xuICAgIHJldHVybiBtZW1iZXI7XG59O1xuXG4vKipcbiAqIFRyaWVzIHRvIGRldGVybWluZSB0aGUgdXNlciBJZCBvZiBhIHBlcm1hbGluay5cbiAqIEluIGNhc2Ugb2YgYSB1c2VyIHBlcm1hbGluayBpdCBpcyB0aGUgdXNlciBpZC5cbiAqIEluIGNhc2Ugb2YgYW4gZXZlbnQgcGVybWFsaW5rIGl0IGlzIHRoZSBzZW5kZXIgdXNlciBJZCBvZiB0aGUgZXZlbnQgaWYgdGhhdCBldmVudCBpcyBhdmFpbGFibGUuXG4gKiBPdGhlcndpc2UgcmV0dXJucyBudWxsLlxuICpcbiAqIEBwYXJhbSB0eXBlIC0gcGlsbCB0eXBlXG4gKiBAcGFyYW0gcGFyc2VSZXN1bHQgLSBwZXJtYWxpbmsgcGFyc2UgcmVzdWx0XG4gKiBAcGFyYW0gZXZlbnQgLSBwZXJtYWxpbmsgZXZlbnQsIGlmIGF2YWlsYWJsZVxuICogQHJldHVybnMgcGVybWFsaW5rIHVzZXIgSWQuIG51bGwgaWYgdGhlIElkIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5jb25zdCBkZXRlcm1pbmVVc2VySWQgPSAoXG4gICAgdHlwZTogUGlsbFR5cGUgfCBudWxsLFxuICAgIHBhcnNlUmVzdWx0OiBQZXJtYWxpbmtQYXJ0cyB8IG51bGwsXG4gICAgZXZlbnQ6IE1hdHJpeEV2ZW50IHwgbnVsbCxcbik6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICh0eXBlID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChwYXJzZVJlc3VsdD8udXNlcklkKSByZXR1cm4gcGFyc2VSZXN1bHQudXNlcklkO1xuXG4gICAgaWYgKGV2ZW50ICYmIFtQaWxsVHlwZS5FdmVudEluU2FtZVJvb20sIFBpbGxUeXBlLkV2ZW50SW5PdGhlclJvb21dLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgICAgIHJldHVybiBldmVudC5nZXRTZW5kZXIoKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBUcmllcyB0byBkZXRlcm1pbmUgYSBSb29tTWVtYmVyLlxuICpcbiAqIEBwYXJhbSB1c2VySWQgLSBVc2VyIElkIHRvIGdldCB0aGUgbWVtYmVyIGZvclxuICogQHBhcmFtIHRhcmdldFJvb20gLSBwZXJtYWxpbmsgdGFyZ2V0IHJvb21cbiAqIEByZXR1cm5zIFJvb21NZW1iZXIgb2YgdGhlIHRhcmdldCByb29tIGlmIGl0IGV4aXN0cy5cbiAqICAgICAgICAgIElmIHNoYXJpbmcgYXQgbGVhc3Qgb25lIHJvb20gd2l0aCB0aGUgdXNlciwgdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgdGhlIHByb2ZpbGUgZmV0Y2hlZCB2aWEgQVBJLlxuICogICAgICAgICAgbnVsbCBpbiBhbGwgb3RoZXIgY2FzZXMuXG4gKi9cbmNvbnN0IGRldGVybWluZU1lbWJlciA9ICh1c2VySWQ6IHN0cmluZywgdGFyZ2V0Um9vbTogUm9vbSk6IFJvb21NZW1iZXIgfCBudWxsID0+IHtcbiAgICBjb25zdCB0YXJnZXRSb29tTWVtYmVyID0gdGFyZ2V0Um9vbS5nZXRNZW1iZXIodXNlcklkKTtcblxuICAgIGlmICh0YXJnZXRSb29tTWVtYmVyKSByZXR1cm4gdGFyZ2V0Um9vbU1lbWJlcjtcblxuICAgIGNvbnN0IGtub3duUHJvZmlsZSA9IFNka0NvbnRleHRDbGFzcy5pbnN0YW5jZS51c2VyUHJvZmlsZXNTdG9yZS5nZXRPbmx5S25vd25Qcm9maWxlKHVzZXJJZCk7XG5cbiAgICBpZiAoa25vd25Qcm9maWxlKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNZW1iZXJGcm9tUHJvZmlsZSh1c2VySWQsIGtub3duUHJvZmlsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEhvb2sgdG8gZ2V0IHRoZSBwZXJtYWxpbmsgbWVtYmVyXG4gKlxuICogQHBhcmFtIHR5cGUgLSBQZXJtYWxpbmsgdHlwZVxuICogQHBhcmFtIHBhcnNlUmVzdWx0IC0gUGVybWFsaW5rIHBhcnNlIHJlc3VsdFxuICogQHBhcmFtIHRhcmdldFJvb20gLSBQZXJtYWxpbmsgdGFyZ2V0IHJvb20ge0BsaW5rIC4vdXNlUGVybWFsaW5rVGFyZ2V0Um9vbS50c31cbiAqIEBwYXJhbSBldmVudCAtIFBlcm1hbGluayBldmVudFxuICogQHJldHVybnMgVGhlIHBlcm1hbGluayBtZW1iZXI6XG4gKiAgICAgICAgICAtIFRoZSByb29tIG1lbWJlciBmb3IgYSB1c2VyIG1lbnRpb25cbiAqICAgICAgICAgIC0gVGhlIHNlbmRlciBmb3IgYSBwZXJtYWxpbmsgdG8gYW4gZXZlbnQgaW4gdGhlIHNhbWUgcm9vbVxuICogICAgICAgICAgLSBOdWxsIGluIG90aGVyIGNhc2VzIG9yIHRoZSB1c2VyIGNhbm5vdCBiZSBsb2FkZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2VQZXJtYWxpbmtNZW1iZXIgPSAoXG4gICAgdHlwZTogUGlsbFR5cGUgfCBudWxsLFxuICAgIHBhcnNlUmVzdWx0OiBQZXJtYWxpbmtQYXJ0cyB8IG51bGwsXG4gICAgdGFyZ2V0Um9vbTogUm9vbSB8IG51bGwsXG4gICAgZXZlbnQ6IE1hdHJpeEV2ZW50IHwgbnVsbCxcbik6IFJvb21NZW1iZXIgfCBudWxsID0+IHtcbiAgICAvLyBVc2VyIG1lbnRpb25zIGFuZCBwZXJtYWxpbmtzIHRvIGV2ZW50cyBpbiB0aGUgc2FtZSByb29tIHJlcXVpcmUgdG8ga25vdyB0aGUgdXNlci5cbiAgICAvLyBJZiBpdCBjYW5ub3QgYmUgaW5pdGlhbGx5IGRldGVybWluZWQsIGl0IHdpbGwgYmUgbG9va2VkIHVwIGxhdGVyIGJ5IGEgbWVtbyBob29rLlxuICAgIGNvbnN0IHNob3VsZExvb2tVcFVzZXIgPSB0eXBlICYmIFtQaWxsVHlwZS5Vc2VyTWVudGlvbiwgUGlsbFR5cGUuRXZlbnRJblNhbWVSb29tXS5pbmNsdWRlcyh0eXBlKTtcbiAgICBjb25zdCB1c2VySWQgPSBkZXRlcm1pbmVVc2VySWQodHlwZSwgcGFyc2VSZXN1bHQsIGV2ZW50KTtcbiAgICBjb25zdCB1c2VySW5Sb29tID0gc2hvdWxkTG9va1VwVXNlciAmJiB1c2VySWQgJiYgdGFyZ2V0Um9vbSA/IGRldGVybWluZU1lbWJlcih1c2VySWQsIHRhcmdldFJvb20pIDogbnVsbDtcbiAgICBjb25zdCBbbWVtYmVyLCBzZXRNZW1iZXJdID0gdXNlU3RhdGU8Um9vbU1lbWJlciB8IG51bGw+KHVzZXJJblJvb20pO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKCFzaG91bGRMb29rVXBVc2VyIHx8ICF1c2VySWQgfHwgbWVtYmVyKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmVcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvUHJvZmlsZUxvb2t1cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZldGNoZWRQcm9maWxlID0gYXdhaXQgU2RrQ29udGV4dENsYXNzLmluc3RhbmNlLnVzZXJQcm9maWxlc1N0b3JlLmZldGNoT25seUtub3duUHJvZmlsZSh1c2VySWQpO1xuXG4gICAgICAgICAgICBpZiAoZmV0Y2hlZFByb2ZpbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdNZW1iZXIgPSBjcmVhdGVNZW1iZXJGcm9tUHJvZmlsZSh1c2VySWQsIGZldGNoZWRQcm9maWxlKTtcbiAgICAgICAgICAgICAgICBzZXRNZW1iZXIobmV3TWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkb1Byb2ZpbGVMb29rdXAoKTtcbiAgICB9LCBbbWVtYmVyLCBzaG91bGRMb29rVXBVc2VyLCB0YXJnZXRSb29tLCB1c2VySWRdKTtcblxuICAgIHJldHVybiBtZW1iZXI7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFRQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFFQSxJ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