Have LocalEchoWrapper emit updates so the app can react faster (#7358)
This commit is contained in:
parent
feea80dfd5
commit
9ed771ad7a
8 changed files with 30 additions and 16 deletions
|
@ -28,7 +28,7 @@ import { _t } from '../languageHandler';
|
||||||
import dis from '../dispatcher/dispatcher';
|
import dis from '../dispatcher/dispatcher';
|
||||||
import { IFeature, ISetting, LabGroup, SETTINGS } from "./Settings";
|
import { IFeature, ISetting, LabGroup, SETTINGS } from "./Settings";
|
||||||
import LocalEchoWrapper from "./handlers/LocalEchoWrapper";
|
import LocalEchoWrapper from "./handlers/LocalEchoWrapper";
|
||||||
import { WatchManager, CallbackFn as WatchCallbackFn } from "./WatchManager";
|
import { CallbackFn as WatchCallbackFn, WatchManager } from "./WatchManager";
|
||||||
import { SettingLevel } from "./SettingLevel";
|
import { SettingLevel } from "./SettingLevel";
|
||||||
import SettingsHandler from "./handlers/SettingsHandler";
|
import SettingsHandler from "./handlers/SettingsHandler";
|
||||||
import { SettingUpdatedPayload } from "../dispatcher/payloads/SettingUpdatedPayload";
|
import { SettingUpdatedPayload } from "../dispatcher/payloads/SettingUpdatedPayload";
|
||||||
|
@ -50,21 +50,20 @@ for (const key of Object.keys(SETTINGS)) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only wrap the handlers with async setters in a local echo wrapper
|
||||||
const LEVEL_HANDLERS = {
|
const LEVEL_HANDLERS = {
|
||||||
[SettingLevel.DEVICE]: new DeviceSettingsHandler(featureNames, defaultWatchManager),
|
[SettingLevel.DEVICE]: new DeviceSettingsHandler(featureNames, defaultWatchManager),
|
||||||
[SettingLevel.ROOM_DEVICE]: new RoomDeviceSettingsHandler(defaultWatchManager),
|
[SettingLevel.ROOM_DEVICE]: new RoomDeviceSettingsHandler(defaultWatchManager),
|
||||||
[SettingLevel.ROOM_ACCOUNT]: new RoomAccountSettingsHandler(defaultWatchManager),
|
[SettingLevel.ROOM_ACCOUNT]: new LocalEchoWrapper(
|
||||||
[SettingLevel.ACCOUNT]: new AccountSettingsHandler(defaultWatchManager),
|
new RoomAccountSettingsHandler(defaultWatchManager),
|
||||||
[SettingLevel.ROOM]: new RoomSettingsHandler(defaultWatchManager),
|
SettingLevel.ROOM_ACCOUNT,
|
||||||
|
),
|
||||||
|
[SettingLevel.ACCOUNT]: new LocalEchoWrapper(new AccountSettingsHandler(defaultWatchManager), SettingLevel.ACCOUNT),
|
||||||
|
[SettingLevel.ROOM]: new LocalEchoWrapper(new RoomSettingsHandler(defaultWatchManager), SettingLevel.ROOM),
|
||||||
[SettingLevel.CONFIG]: new ConfigSettingsHandler(featureNames),
|
[SettingLevel.CONFIG]: new ConfigSettingsHandler(featureNames),
|
||||||
[SettingLevel.DEFAULT]: new DefaultSettingsHandler(defaultSettings, invertedDefaultSettings),
|
[SettingLevel.DEFAULT]: new DefaultSettingsHandler(defaultSettings, invertedDefaultSettings),
|
||||||
};
|
};
|
||||||
|
|
||||||
// Wrap all the handlers with local echo
|
|
||||||
for (const key of Object.keys(LEVEL_HANDLERS)) {
|
|
||||||
LEVEL_HANDLERS[key] = new LocalEchoWrapper(LEVEL_HANDLERS[key]);
|
|
||||||
}
|
|
||||||
|
|
||||||
export const LEVEL_ORDER = [
|
export const LEVEL_ORDER = [
|
||||||
SettingLevel.DEVICE,
|
SettingLevel.DEVICE,
|
||||||
SettingLevel.ROOM_DEVICE,
|
SettingLevel.ROOM_DEVICE,
|
||||||
|
|
|
@ -36,10 +36,14 @@ const ANALYTICS_EVENT_TYPE = "im.vector.analytics";
|
||||||
* This handler does not make use of the roomId parameter.
|
* This handler does not make use of the roomId parameter.
|
||||||
*/
|
*/
|
||||||
export default class AccountSettingsHandler extends MatrixClientBackedSettingsHandler {
|
export default class AccountSettingsHandler extends MatrixClientBackedSettingsHandler {
|
||||||
constructor(private watchers: WatchManager) {
|
constructor(public readonly watchers: WatchManager) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get level(): SettingLevel {
|
||||||
|
return SettingLevel.ACCOUNT;
|
||||||
|
}
|
||||||
|
|
||||||
public initMatrixClient(oldClient: MatrixClient, newClient: MatrixClient) {
|
public initMatrixClient(oldClient: MatrixClient, newClient: MatrixClient) {
|
||||||
if (oldClient) {
|
if (oldClient) {
|
||||||
oldClient.removeListener("accountData", this.onAccountData);
|
oldClient.removeListener("accountData", this.onAccountData);
|
||||||
|
|
|
@ -33,7 +33,7 @@ export default class DeviceSettingsHandler extends SettingsHandler {
|
||||||
* @param {string[]} featureNames The names of known features.
|
* @param {string[]} featureNames The names of known features.
|
||||||
* @param {WatchManager} watchers The watch manager to notify updates to
|
* @param {WatchManager} watchers The watch manager to notify updates to
|
||||||
*/
|
*/
|
||||||
constructor(private featureNames: string[], private watchers: WatchManager) {
|
constructor(private featureNames: string[], public readonly watchers: WatchManager) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import SettingsHandler from "./SettingsHandler";
|
import SettingsHandler from "./SettingsHandler";
|
||||||
|
import { SettingLevel } from "../SettingLevel";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A wrapper for a SettingsHandler that performs local echo on
|
* A wrapper for a SettingsHandler that performs local echo on
|
||||||
|
@ -32,8 +33,9 @@ export default class LocalEchoWrapper extends SettingsHandler {
|
||||||
/**
|
/**
|
||||||
* Creates a new local echo wrapper
|
* Creates a new local echo wrapper
|
||||||
* @param {SettingsHandler} handler The handler to wrap
|
* @param {SettingsHandler} handler The handler to wrap
|
||||||
|
* @param {SettingLevel} level The level to notify updates at
|
||||||
*/
|
*/
|
||||||
constructor(private handler: SettingsHandler) {
|
constructor(private readonly handler: SettingsHandler, private readonly level: SettingLevel) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,8 +56,13 @@ export default class LocalEchoWrapper extends SettingsHandler {
|
||||||
const cacheRoomId = roomId ? roomId : "UNDEFINED"; // avoid weird keys
|
const cacheRoomId = roomId ? roomId : "UNDEFINED"; // avoid weird keys
|
||||||
bySetting[cacheRoomId] = newValue;
|
bySetting[cacheRoomId] = newValue;
|
||||||
|
|
||||||
|
const currentValue = this.handler.getValue(settingName, roomId);
|
||||||
const handlerPromise = this.handler.setValue(settingName, roomId, newValue);
|
const handlerPromise = this.handler.setValue(settingName, roomId, newValue);
|
||||||
return Promise.resolve(handlerPromise).finally(() => {
|
this.handler.watchers?.notifyUpdate(settingName, roomId, this.level, newValue);
|
||||||
|
return Promise.resolve(handlerPromise).catch(() => {
|
||||||
|
// notify of a rollback
|
||||||
|
this.handler.watchers?.notifyUpdate(settingName, roomId, this.level, currentValue);
|
||||||
|
}).finally(() => {
|
||||||
delete bySetting[cacheRoomId];
|
delete bySetting[cacheRoomId];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ const ALLOWED_WIDGETS_EVENT_TYPE = "im.vector.setting.allowed_widgets";
|
||||||
* Gets and sets settings at the "room-account" level for the current user.
|
* Gets and sets settings at the "room-account" level for the current user.
|
||||||
*/
|
*/
|
||||||
export default class RoomAccountSettingsHandler extends MatrixClientBackedSettingsHandler {
|
export default class RoomAccountSettingsHandler extends MatrixClientBackedSettingsHandler {
|
||||||
constructor(private watchers: WatchManager) {
|
constructor(public readonly watchers: WatchManager) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ import { WatchManager } from "../WatchManager";
|
||||||
* room.
|
* room.
|
||||||
*/
|
*/
|
||||||
export default class RoomDeviceSettingsHandler extends SettingsHandler {
|
export default class RoomDeviceSettingsHandler extends SettingsHandler {
|
||||||
constructor(private watchers: WatchManager) {
|
constructor(public readonly watchers: WatchManager) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ import { WatchManager } from "../WatchManager";
|
||||||
* Gets and sets settings at the "room" level.
|
* Gets and sets settings at the "room" level.
|
||||||
*/
|
*/
|
||||||
export default class RoomSettingsHandler extends MatrixClientBackedSettingsHandler {
|
export default class RoomSettingsHandler extends MatrixClientBackedSettingsHandler {
|
||||||
constructor(private watchers: WatchManager) {
|
constructor(public readonly watchers: WatchManager) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,11 +15,15 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { WatchManager } from "../WatchManager";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the base class for all level handlers. This class performs no logic
|
* Represents the base class for all level handlers. This class performs no logic
|
||||||
* and should be overridden.
|
* and should be overridden.
|
||||||
*/
|
*/
|
||||||
export default abstract class SettingsHandler {
|
export default abstract class SettingsHandler {
|
||||||
|
public readonly watchers?: WatchManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the value for a particular setting at this level for a particular room.
|
* Gets the value for a particular setting at this level for a particular room.
|
||||||
* If no room is applicable, the roomId may be null. The roomId may not be
|
* If no room is applicable, the roomId may be null. The roomId may not be
|
||||||
|
|
Loading…
Reference in a new issue