From 424d33d4b04f925ff91cc16ea5c7727bf0949263 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 30 Jun 2022 15:48:21 +0100 Subject: [PATCH] Fix PlatformSettingsHandler always returning true due to returning a Promise (#8954) * Fix PlatformSettingsHandler always returning true due to returning a Promise * Improve typescript --- src/PlatformPeg.ts | 20 ++++++++----- src/dispatcher/actions.ts | 6 ++++ src/dispatcher/payloads/PlatformSetPayload.ts | 24 +++++++++++++++ .../handlers/PlatformSettingsHandler.ts | 30 ++++++++++++++++++- 4 files changed, 72 insertions(+), 8 deletions(-) create mode 100644 src/dispatcher/payloads/PlatformSetPayload.ts diff --git a/src/PlatformPeg.ts b/src/PlatformPeg.ts index 14714a1d34..ab45f1ab1a 100644 --- a/src/PlatformPeg.ts +++ b/src/PlatformPeg.ts @@ -16,6 +16,9 @@ limitations under the License. */ import BasePlatform from "./BasePlatform"; +import defaultDispatcher from "./dispatcher/dispatcher"; +import { Action } from "./dispatcher/actions"; +import { PlatformSetPayload } from "./dispatcher/payloads/PlatformSetPayload"; /* * Holds the current instance of the `Platform` to use across the codebase. @@ -29,23 +32,26 @@ import BasePlatform from "./BasePlatform"; * object. */ export class PlatformPeg { - platform: BasePlatform = null; + private platform: BasePlatform = null; /** * Returns the current Platform object for the application. * This should be an instance of a class extending BasePlatform. */ - get() { + public get() { return this.platform; } /** - * Sets the current platform handler object to use for the - * application. - * This should be an instance of a class extending BasePlatform. + * Sets the current platform handler object to use for the application. + * @param {BasePlatform} platform an instance of a class extending BasePlatform. */ - set(plaf: BasePlatform) { - this.platform = plaf; + public set(platform: BasePlatform) { + this.platform = platform; + defaultDispatcher.dispatch({ + action: Action.PlatformSet, + platform, + }); } } diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index c400b17574..8f46c9398f 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -315,4 +315,10 @@ export enum Action { * Fired when the client was logged in. No additional payload information required. */ OnLoggedIn = "on_logged_in", + + /** + * Fired when the PlatformPeg gets a new platform set upon it, should only happen once per app load lifecycle. + * Fires with the PlatformSetPayload. + */ + PlatformSet = "platform_set", } diff --git a/src/dispatcher/payloads/PlatformSetPayload.ts b/src/dispatcher/payloads/PlatformSetPayload.ts new file mode 100644 index 0000000000..d8c2a25c3a --- /dev/null +++ b/src/dispatcher/payloads/PlatformSetPayload.ts @@ -0,0 +1,24 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Action } from "../actions"; +import { ActionPayload } from "../payloads"; +import BasePlatform from "../../BasePlatform"; + +export interface PlatformSetPayload extends ActionPayload { + action: Action.PlatformSet; + platform: BasePlatform; +} diff --git a/src/settings/handlers/PlatformSettingsHandler.ts b/src/settings/handlers/PlatformSettingsHandler.ts index ffdc731c2f..df9413e22b 100644 --- a/src/settings/handlers/PlatformSettingsHandler.ts +++ b/src/settings/handlers/PlatformSettingsHandler.ts @@ -16,21 +16,49 @@ limitations under the License. import SettingsHandler from "./SettingsHandler"; import PlatformPeg from "../../PlatformPeg"; +import { SETTINGS } from "../Settings"; +import { SettingLevel } from "../SettingLevel"; +import defaultDispatcher from "../../dispatcher/dispatcher"; +import { ActionPayload } from "../../dispatcher/payloads"; +import { Action } from "../../dispatcher/actions"; /** * Gets and sets settings at the "platform" level for the current device. * This handler does not make use of the roomId parameter. */ export default class PlatformSettingsHandler extends SettingsHandler { + private store: { [settingName: string]: any } = {}; + + constructor() { + super(); + + defaultDispatcher.register(this.onAction); + } + + private onAction = (payload: ActionPayload) => { + if (payload.action === Action.PlatformSet) { + this.store = {}; + // Load setting values as they are async and `getValue` must be synchronous + Object.entries(SETTINGS).forEach(([key, setting]) => { + if (setting.supportedLevels.includes(SettingLevel.PLATFORM) && payload.platform.supportsSetting(key)) { + payload.platform.getSettingValue(key).then(value => { + this.store[key] = value; + }); + } + }); + } + }; + public canSetValue(settingName: string, roomId: string): boolean { return PlatformPeg.get().supportsSetting(settingName); } public getValue(settingName: string, roomId: string): any { - return PlatformPeg.get().getSettingValue(settingName); + return this.store[settingName]; } public setValue(settingName: string, roomId: string, newValue: any): Promise { + this.store[settingName] = newValue; // keep cache up to date for synchronous access return PlatformPeg.get().setSettingValue(settingName, newValue); }