diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index d02d8b23e5..701247bd8b 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -844,8 +844,8 @@ module.exports = React.createClass({ SettingsStore.getLabsFeatures().forEach((featureId) => { // TODO: this ought to be a separate component so that we don't need // to rebind the onChange each time we render - const onChange = (e) => { - SettingsStore.setFeatureEnabled(featureId, e.target.checked); + const onChange = async (e) => { + await SettingsStore.setFeatureEnabled(featureId, e.target.checked); this.forceUpdate(); }; @@ -855,7 +855,7 @@ module.exports = React.createClass({ type="checkbox" id={featureId} name={featureId} - defaultChecked={SettingsStore.isFeatureEnabled(featureId)} + checked={SettingsStore.isFeatureEnabled(featureId)} onChange={onChange} /> diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js index a1b88fb0c2..1da882577f 100644 --- a/src/settings/SettingsStore.js +++ b/src/settings/SettingsStore.js @@ -260,7 +260,7 @@ export default class SettingsStore { * @param {*} value The new value of the setting, may be null. * @return {Promise} Resolves when the setting has been changed. */ - static setValue(settingName, roomId, level, value) { + static async setValue(settingName, roomId, level, value) { // Verify that the setting is actually a setting if (!SETTINGS[settingName]) { throw new Error("Setting '" + settingName + "' does not appear to be a setting."); @@ -275,11 +275,21 @@ export default class SettingsStore { throw new Error("User cannot set " + settingName + " at " + level + " in " + roomId); } - return handler.setValue(settingName, roomId, value).then(() => { - const controller = SETTINGS[settingName].controller; - if (!controller) return; + const controller = SETTINGS[settingName].controller; + if (controller) { + const changeAllowed = await controller.canChangeTo(level, roomId, value); + if (!changeAllowed) { + return false; + } + } + + await handler.setValue(settingName, roomId, value); + + if (controller) { controller.onChange(level, roomId, value); - }); + } + + return true; } /** diff --git a/src/settings/controllers/SettingController.js b/src/settings/controllers/SettingController.js index 0ebe0042e6..6b09c4fc53 100644 --- a/src/settings/controllers/SettingController.js +++ b/src/settings/controllers/SettingController.js @@ -39,6 +39,10 @@ export default class SettingController { return null; // no override } + canChangeTo(level, roomId, newValue) { + return Promise.resolve(true); + } + /** * Called when the setting value has been changed. * @param {string} level The level at which the setting has been modified.