2021-05-07 13:10:35 +02:00
|
|
|
/*
|
|
|
|
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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
import {ObservableValue} from "../../observable/ObservableValue.js";
|
|
|
|
|
|
|
|
/**
|
|
|
|
Depending on the status of a room (invited, joined, archived, or none),
|
|
|
|
we want to show a different view with a different view model
|
|
|
|
when showing a room. Furthermore, this logic is needed both in the
|
|
|
|
single room view and in the grid view. So this logic is extracted here,
|
|
|
|
and this observable updates with the right view model as the status for
|
|
|
|
a room changes.
|
|
|
|
|
|
|
|
To not have to track the subscription manually in the SessionViewModel and
|
|
|
|
the RoomGridViewModel, all subscriptions are removed in the dispose method.
|
|
|
|
Only when transferring a RoomViewModelObservable between the SessionViewModel
|
|
|
|
and RoomGridViewModel, unsubscribeAll should be called prior to doing
|
|
|
|
the transfer, so either parent view model don't keep getting updates for
|
|
|
|
the now transferred child view model.
|
|
|
|
|
|
|
|
This is also why there is an explicit initialize method, see comment there.
|
|
|
|
*/
|
|
|
|
export class RoomViewModelObservable extends ObservableValue {
|
|
|
|
constructor(sessionViewModel, roomId) {
|
|
|
|
super(null);
|
2021-05-18 11:06:48 +02:00
|
|
|
this._statusSubscription = null;
|
2021-05-07 13:10:35 +02:00
|
|
|
this._sessionViewModel = sessionViewModel;
|
|
|
|
this.id = roomId;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
Separate initialize method rather than doing this onSubscribeFirst because
|
|
|
|
we don't want to run this again when transferring this value between
|
|
|
|
SessionViewModel and RoomGridViewModel, as onUnsubscribeLast and onSubscribeFirst
|
|
|
|
are called in that case.
|
|
|
|
*/
|
|
|
|
async initialize() {
|
|
|
|
const {session} = this._sessionViewModel._sessionContainer;
|
2021-05-18 11:06:48 +02:00
|
|
|
const statusObservable = await session.observeRoomStatus(this.id);
|
|
|
|
this.set(await this._statusToViewModel(statusObservable.get()));
|
|
|
|
this._statusSubscription = statusObservable.subscribe(async status => {
|
2021-05-11 16:39:33 +02:00
|
|
|
// first dispose existing VM, if any
|
|
|
|
this.get()?.dispose();
|
2021-05-07 13:10:35 +02:00
|
|
|
this.set(await this._statusToViewModel(status));
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async _statusToViewModel(status) {
|
|
|
|
if (status.invited) {
|
|
|
|
return this._sessionViewModel._createInviteViewModel(this.id);
|
|
|
|
} else if (status.joined) {
|
|
|
|
return this._sessionViewModel._createRoomViewModel(this.id);
|
|
|
|
} else if (status.archived) {
|
2021-05-11 13:11:38 +02:00
|
|
|
return await this._sessionViewModel._createArchivedRoomViewModel(this.id);
|
2021-05-18 11:07:19 +02:00
|
|
|
} else {
|
|
|
|
return this._sessionViewModel._createUnknownRoomViewModel(this.id);
|
2021-05-07 13:10:35 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
dispose() {
|
|
|
|
if (this._statusSubscription) {
|
|
|
|
this._statusSubscription = this._statusSubscription();
|
|
|
|
}
|
|
|
|
this.unsubscribeAll();
|
|
|
|
this.get()?.dispose();
|
|
|
|
}
|
|
|
|
}
|