You've already forked element-web
mirror of
https://github.com/element-hq/element-web.git
synced 2025-07-02 06:42:31 +03:00
* Add new custom component api. * Remove context menu, refactor * fix types * Add a test for custom modules. * tidy * Rewrite for new API * Update tests * lint * Allow passing in props to original component * Add hinting * Update tests to be complete * lint a bit more * update docstring * update @element-hq/element-web-module-api to 1.1.0 * fix types * updates * hide jump to bottom button that was causing flakes * lint * lint * Use module matrix event interface instead. * update to new module sdk * adapt custom module sample * Issues caught by Sonar * lint * fix issues * make the comment make sense * fix import
56 lines
1.9 KiB
JavaScript
56 lines
1.9 KiB
JavaScript
/*
|
|
Copyright 2025 New Vector Ltd.
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
export default class CustomComponentModule {
|
|
static moduleApiVersion = "^1.2.0";
|
|
constructor(api) {
|
|
this.api = api;
|
|
this.api.customComponents.registerMessageRenderer(
|
|
(evt) => evt.content.body === "Do not show edits",
|
|
(_props, originalComponent) => {
|
|
return originalComponent();
|
|
},
|
|
{ allowEditingEvent: false },
|
|
);
|
|
this.api.customComponents.registerMessageRenderer(
|
|
(evt) => evt.content.body === "Fall through here",
|
|
(props) => {
|
|
const body = props.mxEvent.content.body;
|
|
return `Fallthrough text for ${body}`;
|
|
},
|
|
);
|
|
this.api.customComponents.registerMessageRenderer(
|
|
(evt) => {
|
|
if (evt.content.body === "Crash the filter!") {
|
|
throw new Error("Fail test!");
|
|
}
|
|
return false;
|
|
},
|
|
() => {
|
|
return `Should not render!`;
|
|
},
|
|
);
|
|
this.api.customComponents.registerMessageRenderer(
|
|
(evt) => evt.content.body === "Crash the renderer!",
|
|
() => {
|
|
throw new Error("Fail test!");
|
|
},
|
|
);
|
|
// Order is specific here to avoid this overriding the other renderers
|
|
this.api.customComponents.registerMessageRenderer("m.room.message", (props, originalComponent) => {
|
|
const body = props.mxEvent.content.body;
|
|
if (body === "Do not replace me") {
|
|
return originalComponent();
|
|
} else if (body === "Fall through here") {
|
|
return null;
|
|
}
|
|
return `Custom text for ${body}`;
|
|
});
|
|
}
|
|
async load() {}
|
|
}
|