Make reading settings synchronous

Signed-off-by: Travis Ralston <travpc@gmail.com>
pull/21833/head
Travis Ralston 2017-10-28 19:45:48 -06:00
parent 989bdcf5fb
commit 23d159e21c
9 changed files with 56 additions and 71 deletions

View File

@ -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();
}
}

View File

@ -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) {

View File

@ -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) {

View File

@ -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) {

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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) {

View File

@ -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) {