UNPKG

matrix-react-sdk

Version:
112 lines (106 loc) 14.5 kB
"use strict"; 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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