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, writeKey as ssssWriteKey,
} from "./ssss/index.js"; } from "./ssss/index.js";
import {SecretStorage} from "./ssss/SecretStorage.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 PICKLE_KEY = "DEFAULT_KEY";
const PUSHER_KEY = "pusher"; const PUSHER_KEY = "pusher";
@ -71,6 +71,7 @@ export class Session {
this._olmWorker = olmWorker; this._olmWorker = olmWorker;
this._sessionBackup = null; this._sessionBackup = null;
this._hasSecretStorageKey = new ObservableValue(null); this._hasSecretStorageKey = new ObservableValue(null);
this._observedRoomStatus = new Map();
if (olm) { if (olm) {
this._olmUtil = new olm.Utility(); this._olmUtil = new olm.Utility();
@ -400,6 +401,8 @@ export class Session {
/** @internal */ /** @internal */
addRoomAfterSync(room) { addRoomAfterSync(room) {
this._rooms.add(room.id, room); this._rooms.add(room.id, room);
const statusObservable = this._observedRoomStatus.get(room.id);
statusObservable?.set(RoomStatus.joined);
} }
get invites() { get invites() {
@ -421,16 +424,26 @@ export class Session {
/** @internal */ /** @internal */
addInviteAfterSync(invite) { addInviteAfterSync(invite) {
this._invites.add(invite.id, invite); this._invites.add(invite.id, invite);
const statusObservable = this._observedRoomStatus.get(invite.id);
if (statusObservable) {
statusObservable.set(statusObservable.get().withInvited());
}
} }
/** @internal */ /** @internal */
removeInviteAfterSync(invite) { removeInviteAfterSync(invite) {
this._invites.remove(invite.id); this._invites.remove(invite.id);
const statusObservable = this._observedRoomStatus.get(invite.id);
if (statusObservable) {
statusObservable.set(statusObservable.get().withoutInvited());
}
} }
/** @internal */ /** @internal */
archiveRoomAfterSync(room) { archiveRoomAfterSync(room) {
this._rooms.remove(room.id); this._rooms.remove(room.id);
const statusObservable = this._observedRoomStatus.get(room.id);
statusObservable?.set(RoomStatus.archived);
if (this._archivedRooms) { if (this._archivedRooms) {
this._archivedRooms.add(room.id, room); 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() { export function tests() {