allow observing the room status

This commit is contained in:
Bruno Windels 2021-05-07 13:09:38 +02:00
parent 243d105aad
commit 1b83ae7d8a

View file

@ -39,7 +39,7 @@ import {
writeKey as ssssWriteKey,
} from "./ssss/index.js";
import {SecretStorage} from "./ssss/SecretStorage.js";
import {ObservableValue} from "../observable/ObservableValue.js";
import {ObservableValue, RetainedObservableValue} from "../observable/ObservableValue.js";
const PICKLE_KEY = "DEFAULT_KEY";
const PUSHER_KEY = "pusher";
@ -71,6 +71,7 @@ export class Session {
this._olmWorker = olmWorker;
this._sessionBackup = null;
this._hasSecretStorageKey = new ObservableValue(null);
this._observedRoomStatus = new Map();
if (olm) {
this._olmUtil = new olm.Utility();
@ -400,6 +401,8 @@ export class Session {
/** @internal */
addRoomAfterSync(room) {
this._rooms.add(room.id, room);
const statusObservable = this._observedRoomStatus.get(room.id);
statusObservable?.set(RoomStatus.joined);
}
get invites() {
@ -421,16 +424,26 @@ export class Session {
/** @internal */
addInviteAfterSync(invite) {
this._invites.add(invite.id, invite);
const statusObservable = this._observedRoomStatus.get(invite.id);
if (statusObservable) {
statusObservable.set(statusObservable.get().withInvited());
}
}
/** @internal */
removeInviteAfterSync(invite) {
this._invites.remove(invite.id);
const statusObservable = this._observedRoomStatus.get(invite.id);
if (statusObservable) {
statusObservable.set(statusObservable.get().withoutInvited());
}
}
/** @internal */
archiveRoomAfterSync(room) {
this._rooms.remove(room.id);
const statusObservable = this._observedRoomStatus.get(room.id);
statusObservable?.set(RoomStatus.archived);
if (this._archivedRooms) {
this._archivedRooms.add(room.id, room);
}
@ -623,6 +636,18 @@ export class Session {
}
}
}
async observeRoomStatus(roomId) {
let observable = this._observedRoomStatus.get(roomId);
if (!observable) {
const status = await this.getRoomStatus(roomId);
observable = new RetainedObservableValue(status, () => {
this._observedRoomStatus.delete(roomId);
});
this._observedRoomStatus.set(roomId, observable);
}
return observable;
}
}
export function tests() {