diff --git a/src/matrix/Session.js b/src/matrix/Session.js index 93088df3..fdf6b487 100644 --- a/src/matrix/Session.js +++ b/src/matrix/Session.js @@ -16,6 +16,7 @@ limitations under the License. */ import {Room} from "./room/Room.js"; +import {RoomStatus} from "./room/RoomStatus.js"; import {Invite} from "./room/Invite.js"; import {Pusher} from "./push/Pusher.js"; import { ObservableMap } from "../observable/index.js"; @@ -597,6 +598,31 @@ export class Session { const serverPushers = (serverPushersData?.pushers || []).map(data => new Pusher(data)); return serverPushers.some(p => p.equals(myPusher)); } + + async getRoomStatus(roomId) { + const isJoined = !!this._rooms.get(roomId); + if (isJoined) { + return RoomStatus.joined; + } else { + const isInvited = !!this._invites.get(roomId); + let isArchived; + if (this._archivedRooms) { + isArchived = !!this._archivedRooms.get(roomId); + } else { + const txn = await this._storage.readTxn([this._storage.storeNames.archivedRoomSummary]); + isArchived = await txn.archivedRoomSummary.has(roomId); + } + if (isInvited && isArchived) { + return RoomStatus.invitedAndArchived; + } else if (isInvited) { + return RoomStatus.invited; + } else if (isArchived) { + return RoomStatus.archived; + } else { + return RoomStatus.none; + } + } + } } export function tests() { diff --git a/src/matrix/room/RoomStatus.js b/src/matrix/room/RoomStatus.js new file mode 100644 index 00000000..b03b3177 --- /dev/null +++ b/src/matrix/room/RoomStatus.js @@ -0,0 +1,51 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +export class RoomStatus { + constructor(joined, invited, archived) { + this.joined = joined; + this.invited = invited; + this.archived = archived; + } + + withInvited() { + if (this.invited) { + return this; + } else if (this.archived) { + return RoomStatus.invitedAndArchived; + } else { + return RoomStatus.invited; + } + } + + withoutInvited() { + if (!this.invited) { + return this; + } else if (this.joined) { + return RoomStatus.joined; + } else if (this.archived) { + return RoomStatus.archived; + } else { + return RoomStatus.none; + } + } +} + +RoomStatus.joined = new RoomStatus(true, false, false); +RoomStatus.archived = new RoomStatus(false, false, true); +RoomStatus.invited = new RoomStatus(false, true, false); +RoomStatus.invitedAndArchived = new RoomStatus(false, true, true); +RoomStatus.none = new RoomStatus(false, false, false); diff --git a/src/matrix/storage/idb/stores/RoomSummaryStore.js b/src/matrix/storage/idb/stores/RoomSummaryStore.js index a445cd99..f4ae4431 100644 --- a/src/matrix/storage/idb/stores/RoomSummaryStore.js +++ b/src/matrix/storage/idb/stores/RoomSummaryStore.js @@ -42,6 +42,11 @@ export class RoomSummaryStore { return this._summaryStore.put(summary); } + async has(roomId) { + const fetchedKey = await this._summaryStore.getKey(roomId); + return roomId === fetchedKey; + } + remove(roomId) { return this._summaryStore.delete(roomId); }