Files
ThreadNet-Web/modules/banner/element-web/src/index.tsx
T
2026-03-31 13:17:57 +01:00

57 lines
1.8 KiB
TypeScript

/*
Copyright 2025 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import { ThemeProvider } from "styled-components";
import compound from "@vector-im/compound-web/dist/style.css" with { type: "css" };
import type { Module, Api, ModuleFactory } from "@element-hq/element-web-module-api";
import Translations from "./translations.json";
import { ModuleConfig, CONFIG_KEY } from "./config";
import Banner from "./Banner";
import { name as ModuleName } from "../package.json";
import style from "./style.css" with { type: "css" };
class BannerModule implements Module {
public static readonly moduleApiVersion = "^1.0.0";
private config?: ModuleConfig;
public constructor(private api: Api) {}
public async load(): Promise<void> {
document.adoptedStyleSheets.push(compound);
document.adoptedStyleSheets.push(style);
this.api.i18n.register(Translations);
try {
this.config = ModuleConfig.parse(this.api.config.get(CONFIG_KEY));
} catch (e) {
console.error("Failed to init module", e);
throw new Error(`Errors in module configuration for "${ModuleName}"`);
}
const div = document.createElement("div");
div.dataset.testid = "banner";
this.api.rootNode.before(div);
const root = this.api.createRoot(div);
root.render(
<ThemeProvider theme={this.config.theme}>
<Banner
api={this.api}
logoUrl={this.config.logo_url}
href={this.config.logo_link_url}
menu={this.config.menu}
/>
</ThemeProvider>,
);
}
}
export default BannerModule satisfies ModuleFactory;