mirror of https://github.com/vector-im/riot-web
Make reading settings synchronous
Signed-off-by: Travis Ralston <travpc@gmail.com>pull/21833/head
parent
989bdcf5fb
commit
23d159e21c
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue