From 23d159e21cf2f2c623fe63dcb88468ed3b6a6ff7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 28 Oct 2017 19:45:48 -0600 Subject: [PATCH] Make reading settings synchronous Signed-off-by: Travis Ralston --- src/settings/AccountSettingsHandler.js | 14 ++++---- src/settings/ConfigSettingsHandler.js | 4 +-- src/settings/DefaultSettingsHandler.js | 4 +-- src/settings/DeviceSettingsHandler.js | 12 +++---- src/settings/RoomAccountSettingsHandler.js | 22 ++++++------- src/settings/RoomDeviceSettingsHandler.js | 5 +-- src/settings/RoomSettingsHandler.js | 26 +++++++-------- src/settings/SettingsHandler.js | 2 +- src/settings/SettingsStore.js | 38 +++++++--------------- 9 files changed, 56 insertions(+), 71 deletions(-) diff --git a/src/settings/AccountSettingsHandler.js b/src/settings/AccountSettingsHandler.js index 6352da5ccc..c505afe31d 100644 --- a/src/settings/AccountSettingsHandler.js +++ b/src/settings/AccountSettingsHandler.js @@ -24,13 +24,13 @@ import MatrixClientPeg from '../MatrixClientPeg'; */ export default class AccountSettingHandler extends SettingsHandler { getValue(settingName, roomId) { - const value = MatrixClientPeg.get().getAccountData(this._getEventType(settingName)); - if (!value) return Promise.reject(); - return Promise.resolve(value); + return this._getSettings()[settingName]; } setValue(settingName, roomId, newValue) { - return MatrixClientPeg.get().setAccountData(this._getEventType(settingName), newValue); + const content = this._getSettings(); + content[settingName] = newValue; + return MatrixClientPeg.get().setAccountData("im.vector.web.settings", content); } canSetValue(settingName, roomId) { @@ -41,7 +41,9 @@ export default class AccountSettingHandler extends SettingsHandler { return !!MatrixClientPeg.get(); } - _getEventType(settingName) { - return "im.vector.setting." + settingName; + _getSettings() { + const event = MatrixClientPeg.get().getAccountData("im.vector.web.settings"); + if (!event || !event.getContent()) return {}; + return event.getContent(); } } \ No newline at end of file diff --git a/src/settings/ConfigSettingsHandler.js b/src/settings/ConfigSettingsHandler.js index 8f0cc9041b..5307a1dac1 100644 --- a/src/settings/ConfigSettingsHandler.js +++ b/src/settings/ConfigSettingsHandler.js @@ -25,8 +25,8 @@ import SdkConfig from "../SdkConfig"; export default class ConfigSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { const settingsConfig = SdkConfig.get()["settingDefaults"]; - if (!settingsConfig || !settingsConfig[settingName]) return Promise.reject(); - return Promise.resolve(settingsConfig[settingName]); + if (!settingsConfig || !settingsConfig[settingName]) return null; + return settingsConfig[settingName]; } setValue(settingName, roomId, newValue) { diff --git a/src/settings/DefaultSettingsHandler.js b/src/settings/DefaultSettingsHandler.js index 06937fd957..0a4b8d91d3 100644 --- a/src/settings/DefaultSettingsHandler.js +++ b/src/settings/DefaultSettingsHandler.js @@ -32,9 +32,7 @@ export default class DefaultSettingsHandler extends SettingsHandler { } getValue(settingName, roomId) { - const value = this._defaults[settingName]; - if (!value) return Promise.reject(); - return Promise.resolve(value); + return this._defaults[settingName]; } setValue(settingName, roomId, newValue) { diff --git a/src/settings/DeviceSettingsHandler.js b/src/settings/DeviceSettingsHandler.js index 83cf88bcba..dbb833c570 100644 --- a/src/settings/DeviceSettingsHandler.js +++ b/src/settings/DeviceSettingsHandler.js @@ -35,12 +35,13 @@ export default class DeviceSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { if (this._featureNames.includes(settingName)) { - return Promise.resolve(this._readFeature(settingName)); + return this._readFeature(settingName); } const value = localStorage.getItem(this._getKey(settingName)); - if (!value) return Promise.reject(); - return Promise.resolve(value); + if (!value) return null; + + return JSON.parse(value).value; } setValue(settingName, roomId, newValue) { @@ -51,6 +52,7 @@ export default class DeviceSettingsHandler extends SettingsHandler { if (newValue === null) { localStorage.removeItem(this._getKey(settingName)); } else { + newValue = JSON.stringify({value: newValue}); localStorage.setItem(this._getKey(settingName), newValue); } @@ -79,9 +81,7 @@ export default class DeviceSettingsHandler extends SettingsHandler { } const value = localStorage.getItem("mx_labs_feature_" + featureName); - const enabled = value === "true"; - - return {enabled}; + return value === "true"; } _writeFeature(featureName, enabled) { diff --git a/src/settings/RoomAccountSettingsHandler.js b/src/settings/RoomAccountSettingsHandler.js index 7157d86c34..3c775f3ff0 100644 --- a/src/settings/RoomAccountSettingsHandler.js +++ b/src/settings/RoomAccountSettingsHandler.js @@ -23,18 +23,13 @@ import MatrixClientPeg from '../MatrixClientPeg'; */ export default class RoomAccountSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) return Promise.reject(); - - const value = room.getAccountData(this._getEventType(settingName)); - if (!value) return Promise.reject(); - return Promise.resolve(value); + return this._getSettings(roomId)[settingName]; } setValue(settingName, roomId, newValue) { - return MatrixClientPeg.get().setRoomAccountData( - roomId, this._getEventType(settingName), newValue - ); + const content = this._getSettings(roomId); + content[settingName] = newValue; + return MatrixClientPeg.get().setRoomAccountData(roomId, "im.vector.web.settings", content); } canSetValue(settingName, roomId) { @@ -46,7 +41,12 @@ export default class RoomAccountSettingsHandler extends SettingsHandler { return !!MatrixClientPeg.get(); } - _getEventType(settingName) { - return "im.vector.setting." + settingName; + _getSettings(roomId) { + const room = MatrixClientPeg.get().getRoom(roomId); + if (!room) return {}; + + const event = room.getAccountData("im.vector.settings"); + if (!event || !event.getContent()) return {}; + return event.getContent(); } } \ No newline at end of file diff --git a/src/settings/RoomDeviceSettingsHandler.js b/src/settings/RoomDeviceSettingsHandler.js index fe477564f6..3ee83f2362 100644 --- a/src/settings/RoomDeviceSettingsHandler.js +++ b/src/settings/RoomDeviceSettingsHandler.js @@ -24,14 +24,15 @@ import SettingsHandler from "./SettingsHandler"; export default class RoomDeviceSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { const value = localStorage.getItem(this._getKey(settingName, roomId)); - if (!value) return Promise.reject(); - return Promise.resolve(value); + if (!value) return null; + return JSON.parse(value).value; } setValue(settingName, roomId, newValue) { if (newValue === null) { localStorage.removeItem(this._getKey(settingName, roomId)); } else { + newValue = JSON.stringify({value: newValue}); localStorage.setItem(this._getKey(settingName, roomId), newValue); } diff --git a/src/settings/RoomSettingsHandler.js b/src/settings/RoomSettingsHandler.js index dcd7a76e87..c41a510646 100644 --- a/src/settings/RoomSettingsHandler.js +++ b/src/settings/RoomSettingsHandler.js @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import Promise from 'bluebird'; import SettingsHandler from "./SettingsHandler"; import MatrixClientPeg from '../MatrixClientPeg'; @@ -23,34 +22,33 @@ import MatrixClientPeg from '../MatrixClientPeg'; */ export default class RoomSettingsHandler extends SettingsHandler { getValue(settingName, roomId) { - const room = MatrixClientPeg.get().getRoom(roomId); - if (!room) return Promise.reject(); - - const event = room.currentState.getStateEvents(this._getEventType(settingName), ""); - if (!event || !event.getContent()) return Promise.reject(); - return Promise.resolve(event.getContent()); + return this._getSettings(roomId)[settingName]; } setValue(settingName, roomId, newValue) { - return MatrixClientPeg.get().sendStateEvent( - roomId, this._getEventType(settingName), newValue, "" - ); + const content = this._getSettings(roomId); + content[settingName] = newValue; + return MatrixClientPeg.get().sendStateEvent(roomId, "im.vector.web.settings", content, ""); } canSetValue(settingName, roomId) { const cli = MatrixClientPeg.get(); const room = cli.getRoom(roomId); - const eventType = this._getEventType(settingName); if (!room) return false; - return room.currentState.maySendStateEvent(eventType, cli.getUserId()); + return room.currentState.maySendStateEvent("im.vector.web.settings", cli.getUserId()); } isSupported() { return !!MatrixClientPeg.get(); } - _getEventType(settingName) { - return "im.vector.setting." + settingName; + _getSettings(roomId) { + const room = MatrixClientPeg.get().getRoom(roomId); + if (!room) return {}; + + const event = room.currentState.getStateEvents("im.vector.web.settings"); + if (!event || !event.getContent()) return {}; + return event.getContent(); } } \ No newline at end of file diff --git a/src/settings/SettingsHandler.js b/src/settings/SettingsHandler.js index 7387712367..20f09cb1f2 100644 --- a/src/settings/SettingsHandler.js +++ b/src/settings/SettingsHandler.js @@ -42,7 +42,7 @@ export default class SettingsHandler { * able to set the value prior to calling this. * @param {string} settingName The name of the setting to change. * @param {String} roomId The room ID to set the value in, may be null. - * @param {Object} newValue The new value for the setting, may be null. + * @param {*} newValue The new value for the setting, may be null. * @return {Promise} Resolves when the setting has been saved. */ setValue(settingName, roomId, newValue) { diff --git a/src/settings/SettingsStore.js b/src/settings/SettingsStore.js index eea91345d8..330c2def05 100644 --- a/src/settings/SettingsStore.js +++ b/src/settings/SettingsStore.js @@ -137,7 +137,7 @@ export default class SettingsStore { return yield SettingsStore.getValue(settingName, roomId); })(); - return value.enabled; + return value; } /** @@ -145,7 +145,7 @@ export default class SettingsStore { * be applied to any particular room, otherwise it should be supplied. * @param {string} settingName The name of the setting to read the value of. * @param {String} roomId The room ID to read the setting value in, may be null. - * @return {Promise<*>} Resolves to the value for the setting. May result in null. + * @return {*} The value, or null if not found */ static getValue(settingName, roomId) { const levelOrder = [ @@ -154,36 +154,22 @@ export default class SettingsStore { if (SettingsStore.isFeature(settingName)) { const configValue = SettingsStore._getFeatureState(settingName); - if (configValue === "enable") return Promise.resolve({enabled: true}); - if (configValue === "disable") return Promise.resolve({enabled: false}); + if (configValue === "enable") return true; + if (configValue === "disable") return false; // else let it fall through the default process } const handlers = SettingsStore._getHandlers(settingName); - // This wrapper function allows for iterating over the levelOrder to find a suitable - // handler that is supported by the setting. It does this by building the promise chain - // on the fly, wrapping the rejection from handler.getValue() to try the next handler. - // If the last handler also rejects the getValue() call, then this wrapper will convert - // the reply to `null` as per our contract to the caller. - let index = 0; - const wrapperFn = () => { - // Find the next handler that we can use - let handler = null; - while (!handler && index < levelOrder.length) { - handler = handlers[levelOrder[index++]]; - } + for (let level of levelOrder) { + let handler = handlers[level]; + if (!handler) continue; - // No handler == no reply (happens when the last available handler rejects) - if (!handler) return null; - - // Get the value and see if the handler will reject us (meaning it doesn't have - // a value for us). const value = handler.getValue(settingName, roomId); - return value.then(null, () => wrapperFn()); // pass success through - }; - - return wrapperFn(); + if (!value) continue; + return value; + } + return null; } /** @@ -194,7 +180,7 @@ export default class SettingsStore { * @param {String} roomId The room ID to change the value in, may be null. * @param {"device"|"room-device"|"room-account"|"account"|"room"} level The level * to change the value at. - * @param {Object} value The new value of the setting, may be null. + * @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) {