Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions src/components/views/messages/SenderProfile.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@

import DisambiguatedProfile from "./DisambiguatedProfile";
import { useRoomMemberProfile } from "../../../hooks/room/useRoomMemberProfile";

import ModuleApi from "../../../modules/Api";
import { CustomComponentsApi } from "../../../modules/customComponentApi";

Check failure on line 16 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / ESLint

There should be at least one empty line between import groups
import { MessageProfileComponentProps } from "@element-hq/element-web-module-api";

Check failure on line 17 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'MessageProfileComponentProps'.

Check failure on line 17 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / ESLint

`@element-hq/element-web-module-api` import should occur before import of `./DisambiguatedProfile`

Check failure on line 17 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / ESLint

All imports in the declaration are only used as types. Use `import type`
interface IProps {
mxEvent: MatrixEvent;
onClick?(): void;
Expand All @@ -24,17 +26,25 @@
userId: mxEvent.getSender(),
member: mxEvent.sender,
});

if (mxEvent.getContent().msgtype === MsgType.Emote) {
return <></>;
}
const moduleRenderer = ModuleApi.customComponents.messageProfileRenderer;
const renderFn = (moduleProps: MessageProfileComponentProps) => <DisambiguatedProfile

Check failure on line 34 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / ESLint

Missing return type on function
fallbackName={moduleProps.mxEvent.sender ?? ""}

Check failure on line 35 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

MessageComposer › for a Room › when replying to an event › that is a thread › with encryption › should pass the expected placeholder to SendMessageComposer

TypeError: Cannot read properties of null (reading 'sender') at sender (src/components/views/messages/SenderProfile.tsx:35:43) at renderFn (src/components/views/messages/SenderProfile.tsx:49:66) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:23863:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:5529:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:8897:19) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:10522:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:1522:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:15140:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:14956:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:14936:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:14462:44) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:16216:7) at flushActQueue (node_modules/react/cjs/react.development.js:566:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:860:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:478:29) at Object.wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:357:21)

Check failure on line 35 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

MessageComposer › for a Room › when replying to an event › that is a thread › should pass the expected placeholder to SendMessageComposer

TypeError: Cannot read properties of null (reading 'sender') at sender (src/components/views/messages/SenderProfile.tsx:35:43) at renderFn (src/components/views/messages/SenderProfile.tsx:49:66) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:23863:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:5529:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:8897:19) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:10522:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:1522:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:15140:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:14956:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:14936:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:14462:44) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:16216:7) at flushActQueue (node_modules/react/cjs/react.development.js:566:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:860:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:478:29) at Object.wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:357:21)

Check failure on line 35 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

MessageComposer › for a Room › when replying to an event › with a non-thread relation › should pass the expected placeholder to SendMessageComposer

TypeError: Cannot read properties of null (reading 'sender') at sender (src/components/views/messages/SenderProfile.tsx:35:43) at renderFn (src/components/views/messages/SenderProfile.tsx:49:66) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:23863:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:5529:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:8897:19) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:10522:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:1522:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:15140:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:14956:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:14936:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:14462:44) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:16216:7) at flushActQueue (node_modules/react/cjs/react.development.js:566:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:860:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:478:29) at Object.wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:357:21)

Check failure on line 35 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

MessageComposer › for a Room › when replying to an event › with encryption › should pass the expected placeholder to SendMessageComposer

TypeError: Cannot read properties of null (reading 'sender') at sender (src/components/views/messages/SenderProfile.tsx:35:43) at renderFn (src/components/views/messages/SenderProfile.tsx:49:66) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:23863:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:5529:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:8897:19) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:10522:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:1522:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:15140:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:14956:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:14936:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:14462:44) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:16216:7) at flushActQueue (node_modules/react/cjs/react.development.js:566:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:860:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:478:29) at Object.wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:357:21)

Check failure on line 35 in src/components/views/messages/SenderProfile.tsx

View workflow job for this annotation

GitHub Actions / Jest (1)

MessageComposer › for a Room › when replying to an event › without encryption › should pass the expected placeholder to SendMessageComposer

TypeError: Cannot read properties of null (reading 'sender') at sender (src/components/views/messages/SenderProfile.tsx:35:43) at renderFn (src/components/views/messages/SenderProfile.tsx:49:66) at Object.react_stack_bottom_frame (node_modules/react-dom/cjs/react-dom-client.development.js:23863:20) at renderWithHooks (node_modules/react-dom/cjs/react-dom-client.development.js:5529:22) at updateFunctionComponent (node_modules/react-dom/cjs/react-dom-client.development.js:8897:19) at beginWork (node_modules/react-dom/cjs/react-dom-client.development.js:10522:18) at runWithFiberInDEV (node_modules/react-dom/cjs/react-dom-client.development.js:1522:13) at performUnitOfWork (node_modules/react-dom/cjs/react-dom-client.development.js:15140:22) at workLoopSync (node_modules/react-dom/cjs/react-dom-client.development.js:14956:41) at renderRootSync (node_modules/react-dom/cjs/react-dom-client.development.js:14936:11) at performWorkOnRoot (node_modules/react-dom/cjs/react-dom-client.development.js:14462:44) at performWorkOnRootViaSchedulerTask (node_modules/react-dom/cjs/react-dom-client.development.js:16216:7) at flushActQueue (node_modules/react/cjs/react.development.js:566:34) at Object.<anonymous>.process.env.NODE_ENV.exports.act (node_modules/react/cjs/react.development.js:860:10) at node_modules/@testing-library/react/dist/act-compat.js:47:25 at renderRoot (node_modules/@testing-library/react/dist/pure.js:190:26) at render (node_modules/@testing-library/react/dist/pure.js:292:10) at customRender (test/test-utils/jest-matrix-react.tsx:29:18) at wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:478:29) at Object.wrapAndRender (test/unit-tests/components/views/rooms/MessageComposer-test.tsx:357:21)
onClick={moduleProps.onClick}
member={moduleProps.member}
colored={true}
emphasizeDisplayName={true}
withTooltip={withTooltip}
/>;

const modProps = {
onClick,
mxEvent: CustomComponentsApi.getModuleMatrixEvent(mxEvent)!,
member: member || undefined,
};

return mxEvent.getContent().msgtype !== MsgType.Emote ? (
<DisambiguatedProfile
fallbackName={mxEvent.getSender() ?? ""}
onClick={onClick}
member={member}
colored={true}
emphasizeDisplayName={true}
withTooltip={withTooltip}
/>
) : (
<></>
);
return moduleRenderer ? moduleRenderer(modProps, renderFn) : renderFn(modProps);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import PresenceLabel from "../../rooms/PresenceLabel";
import CopyableText from "../../elements/CopyableText";
import { UserInfoHeaderVerificationView } from "./UserInfoHeaderVerificationView";
import ModuleApi from "../../../../modules/Api";

export interface UserInfoHeaderViewProps {
member: Member;
Expand Down Expand Up @@ -48,6 +49,27 @@
);
}

const moduleRenderer = ModuleApi.customComponents.userInfoRenderer;
let usernameSection;
if (moduleRenderer && vm.userIdentifier) {
usernameSection = moduleRenderer(
{
userId: vm.userIdentifier,
},
(props) => <Text size="sm" weight="semibold" className="mx_UserInfo_profile_mxid">

Check failure on line 59 in src/components/views/right_panel/user_info/UserInfoHeaderView.tsx

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Parameter 'props' implicitly has an 'any' type.
<CopyableText getTextToCopy={() => props.userId} border={false}>
{props.userId}
</CopyableText>
</Text>,
);
} else {
usernameSection = <Text size="sm" weight="semibold" className="mx_UserInfo_profile_mxid">
<CopyableText getTextToCopy={() => vm.userIdentifier} border={false}>
{vm.userIdentifier}
</CopyableText>
</Text>;
}

return (
<React.Fragment>
<div className="mx_UserInfo_avatar">
Expand Down Expand Up @@ -83,11 +105,7 @@
</Flex>
</Tooltip>
)}
<Text size="sm" weight="semibold" className="mx_UserInfo_profile_mxid">
<CopyableText getTextToCopy={() => vm.userIdentifier} border={false}>
{vm.userIdentifier}
</CopyableText>
</Text>
{usernameSection}
</Flex>
{!hideVerificationSection && <UserInfoHeaderVerificationView member={member} devices={devices} />}
</Container>
Expand Down
27 changes: 26 additions & 1 deletion src/modules/customComponentApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
CustomMessageRenderHints as ModuleCustomCustomMessageRenderHints,
MatrixEvent as ModuleMatrixEvent,
CustomRoomPreviewBarRenderFunction,
MessageProfileRenderFunction,

Check failure on line 19 in src/modules/customComponentApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'MessageProfileRenderFunction'.
UserInfoRenderFunction,

Check failure on line 20 in src/modules/customComponentApi.ts

View workflow job for this annotation

GitHub Actions / Typescript Syntax Check

Module '"@element-hq/element-web-module-api"' has no exported member 'UserInfoRenderFunction'.
} from "@element-hq/element-web-module-api";
import type React from "react";

Expand All @@ -42,7 +44,7 @@
* @param mxEvent
* @returns An event object, or `null` if the event was not a message event.
*/
private static getModuleMatrixEvent(mxEvent: MatrixEvent): ModuleMatrixEvent | null {
public static getModuleMatrixEvent(mxEvent: MatrixEvent): ModuleMatrixEvent | null {
const eventId = mxEvent.getId();
const roomId = mxEvent.getRoomId();
const sender = mxEvent.sender;
Expand Down Expand Up @@ -138,6 +140,8 @@
}

private _roomPreviewBarRenderer?: CustomRoomPreviewBarRenderFunction;
private _userInfoRenderer?: UserInfoRenderFunction;
private _messageProfileRenderer?: MessageProfileRenderFunction;

/**
* Get the custom room preview bar renderer, if any has been registered.
Expand All @@ -153,4 +157,25 @@
public registerRoomPreviewBar(renderer: CustomRoomPreviewBarRenderFunction): void {
this._roomPreviewBarRenderer = renderer;
}

/**
* Get the custom user info renderer, if any has been registered.
*/
public get messageProfileRenderer(): MessageProfileRenderFunction | undefined {
return this._messageProfileRenderer;
}

public registerMessageProfile(renderer: MessageProfileRenderFunction): void {
this._messageProfileRenderer = renderer;
}
/**
* Get the custom user info renderer, if any has been registered.
*/
public get userInfoRenderer(): UserInfoRenderFunction | undefined {
return this._userInfoRenderer;
}

public registerUserInfo(renderer: UserInfoRenderFunction): void {
this._userInfoRenderer = renderer;
}
}
Loading