From 2bea8457e9050782da88fffed0bf3b45b943976c Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 16 Sep 2020 12:55:04 +0100 Subject: [PATCH] UI Feature Flag: Communities --- .../settings/tabs/user/PreferencesUserSettingsTab.js | 9 +++------ src/settings/Settings.ts | 8 ++++++++ src/settings/SettingsStore.ts | 5 +++++ src/settings/UIFeature.ts | 1 + src/settings/controllers/SettingController.ts | 7 +++++++ src/settings/controllers/UIFeatureController.ts | 10 +++++++--- 6 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js index d5dafe146a..b3a5d06707 100644 --- a/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js +++ b/src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js @@ -23,7 +23,6 @@ import Field from "../../../elements/Field"; import * as sdk from "../../../../.."; import PlatformPeg from "../../../../../PlatformPeg"; import {SettingLevel} from "../../../../../settings/SettingLevel"; -import {UIFeature} from "../../../../../settings/UIFeature"; export default class PreferencesUserSettingsTab extends React.Component { static ROOM_LIST_SETTINGS = [ @@ -138,12 +137,10 @@ export default class PreferencesUserSettingsTab extends React.Component { }; _renderGroup(settingIds) { - if (!SettingsStore.getValue(UIFeature.URLPreviews)) { - settingIds = settingIds.filter(i => i !== 'urlPreviewsEnabled'); - } - const SettingsFlag = sdk.getComponent("views.elements.SettingsFlag"); - return settingIds.map(i => ); + return settingIds.filter(SettingsStore.isEnabled).map(i => { + return ; + }); } render() { diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index c57394d970..5c4dc2e4d0 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -337,6 +337,8 @@ export const SETTINGS: {[setting: string]: ISetting} = { displayName: _td('Enable Community Filter Panel'), default: true, invertedSettingName: 'TagPanel.disableTagPanel', + // We force the value to true because the invertedSettingName causes it to flip + controller: new UIFeatureController(UIFeature.Communities, true), }, "theme": { supportedLevels: LEVELS_ACCOUNT_SETTINGS, @@ -621,5 +623,11 @@ export const SETTINGS: {[setting: string]: ISetting} = { [UIFeature.Flair]: { supportedLevels: LEVELS_UI_FEATURE, default: true, + // Disable Flair when Communities are disabled + controller: new UIFeatureController(UIFeature.Communities), + }, + [UIFeature.Communities]: { + supportedLevels: LEVELS_UI_FEATURE, + default: true, }, }; diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 9e146ad799..498a2d269d 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -257,6 +257,11 @@ export default class SettingsStore { return SETTINGS[settingName].isFeature; } + public static isEnabled(settingName: string) { + if (!SETTINGS[settingName]) return false; + return SETTINGS[settingName].controller ? !SETTINGS[settingName].controller.settingDisabled : true; + } + /** * Gets the value of a setting. The room ID is optional if the setting is not to * be applied to any particular room, otherwise it should be supplied. diff --git a/src/settings/UIFeature.ts b/src/settings/UIFeature.ts index 8cbf7c207b..3bd7e0f25b 100644 --- a/src/settings/UIFeature.ts +++ b/src/settings/UIFeature.ts @@ -18,4 +18,5 @@ limitations under the License. export enum UIFeature { URLPreviews = "UIFeature.urlPreviews", Flair = "UIFeature.flair", + Communities = "UIFeature.communities", } diff --git a/src/settings/controllers/SettingController.ts b/src/settings/controllers/SettingController.ts index d90eba1e9e..ba78597da7 100644 --- a/src/settings/controllers/SettingController.ts +++ b/src/settings/controllers/SettingController.ts @@ -55,4 +55,11 @@ export default abstract class SettingController { public onChange(level: SettingLevel, roomId: string, newValue: any) { // do nothing by default } + + /** + * Gets whether the setting has been disabled due to this controller. + */ + public get settingDisabled() { + return false; + } } diff --git a/src/settings/controllers/UIFeatureController.ts b/src/settings/controllers/UIFeatureController.ts index ed6598a6e8..2748eec16a 100644 --- a/src/settings/controllers/UIFeatureController.ts +++ b/src/settings/controllers/UIFeatureController.ts @@ -26,7 +26,7 @@ import SettingsStore from "../SettingsStore"; * Settings using this controller are assumed to return `false` when disabled. */ export default class UIFeatureController extends SettingController { - public constructor(private uiFeatureName: string) { + public constructor(private uiFeatureName: string, private forcedValue = false) { super(); } @@ -36,10 +36,14 @@ export default class UIFeatureController extends SettingController { calculatedValue: any, calculatedAtLevel: SettingLevel, ): any { - if (!SettingsStore.getValue(this.uiFeatureName)) { + if (this.settingDisabled) { // per the docs: we force a disabled state when the feature isn't active - return false; + return this.forcedValue; } return null; // no override } + + public get settingDisabled(): boolean { + return !SettingsStore.getValue(this.uiFeatureName); + } }