Introduce a Module API to get application settings. (#34278)

* Add a module API to get application settings.

* fix test
This commit is contained in:
Will Hunt
2026-07-15 19:20:21 +00:00
committed by GitHub
parent 8e0ed84eac
commit cc76070639
9 changed files with 132 additions and 0 deletions
+2
View File
@@ -34,6 +34,7 @@ import { WidgetLifecycleApi } from "./WidgetLifecycleApi.ts";
import { WidgetApi } from "./WidgetApi.ts";
import { CustomisationsApi } from "./customisationsApi.ts";
import { ComposerApi } from "./ComposerApi.ts";
import { SettingsApi } from "./SettingsApi.ts";
import defaultDispatcher from "../dispatcher/dispatcher.ts";
const legacyCustomisationsFactory = <T extends object>(baseCustomisations: T) => {
@@ -98,6 +99,7 @@ export class ModuleApi implements Api {
public readonly client = new ClientApi();
public readonly stores = new StoresApi();
public readonly composer = new ComposerApi(defaultDispatcher);
public readonly settings = new SettingsApi();
public createRoot(element: Element): Root {
return createRoot(element);
+27
View File
@@ -0,0 +1,27 @@
/*
Copyright 2026 Element Creations 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.
*/
import { describe, it, expect, vi } from "vitest";
import SettingsStore from "../settings/SettingsStore";
import { SettingsApi } from "./SettingsApi";
describe("SettingsApi", () => {
it("should return the value from SettingsStore.getValue", () => {
const spy = vi.spyOn(SettingsStore, "getValue").mockReturnValue("en" as any);
const api = new SettingsApi();
expect(api.getValue("language")).toBe("en");
expect(spy).toHaveBeenCalledWith("language", undefined, undefined);
});
it("should pass roomId and excludeDefault through to SettingsStore.getValue", () => {
const spy = vi.spyOn(SettingsStore, "getValue").mockReturnValue(null);
const api = new SettingsApi();
api.getValue("m.setting", "!room:example.org", true);
expect(spy).toHaveBeenCalledWith("m.setting", "!room:example.org", true);
});
});
+16
View File
@@ -0,0 +1,16 @@
/*
Copyright 2026 Element Creations 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.
*/
import type { SettingsApi as ISettingsApi } from "@element-hq/element-web-module-api";
import SettingsStore from "../settings/SettingsStore";
export class SettingsApi implements ISettingsApi {
public getValue<T = any>(settingName: string, roomId?: string | null, excludeDefault?: boolean): T | undefined {
//@ts-expect-error: SettingsStore.getValue will throw on an invalid setting name anyway.
return SettingsStore.getValue(settingName, roomId, excludeDefault);
}
}