Skip to content

Commit 3a700ba

Browse files
committed
move WorldReadableRoomView out to its own file and create WorldReadableRoomViewModel right in the RoomViewModelObservable
create a new RoomStatus enum value for WorldReadable and utilise a promise to check whether room is previewable which first UnknownRoomViewModel uses to show UI context and then switches to WorldReadableRoomViewModel to render timeline for preview of messages
1 parent 7bba357 commit 3a700ba

9 files changed

Lines changed: 69 additions & 54 deletions

File tree

src/domain/session/RoomViewModelObservable.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,18 @@ export class RoomViewModelObservable extends ObservableValue {
7676
return this._sessionViewModel._createRoomViewModelInstance(this.id);
7777
} else if (status & RoomStatus.Archived) {
7878
return await this._sessionViewModel._createArchivedRoomViewModel(this.id);
79+
} else if (status & RoomStatus.WorldReadable) {
80+
return await this._sessionViewModel._createWorldReadableRoomViewModel(this.id);
7981
} else {
80-
return this._sessionViewModel._createUnknownRoomViewModel(this.id);
82+
const {session} = this._sessionViewModel._client;
83+
const statusObservable = await session.observeRoomStatus(this.id);
84+
const isWorldReadablePromise = session.isWorldReadableRoom(this.id);
85+
isWorldReadablePromise.then(isWorldReadable => {
86+
if (isWorldReadable) {
87+
statusObservable.set(RoomStatus.WorldReadable);
88+
}
89+
});
90+
return this._sessionViewModel._createUnknownRoomViewModel(this.id, isWorldReadablePromise);
8191
}
8292
}
8393

src/domain/session/SessionViewModel.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,11 @@ export class SessionViewModel extends ViewModel {
232232
return null;
233233
}
234234

235-
_createUnknownRoomViewModel(roomIdOrAlias) {
235+
_createUnknownRoomViewModel(roomIdOrAlias, isWorldReadablePromise) {
236236
return new UnknownRoomViewModel(this.childOptions({
237237
roomIdOrAlias,
238238
session: this._client.session,
239+
isWorldReadablePromise: isWorldReadablePromise
239240
}));
240241
}
241242

src/domain/session/room/RoomViewModel.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class RoomViewModel extends ErrorReportViewModel {
4141
this._composerVM = null;
4242
if (room.isArchived) {
4343
this._composerVM = this.track(new ArchivedViewModel(this.childOptions({archivedRoom: room})));
44-
} else {
44+
} else if (!room.isWorldReadable) {
4545
this._recreateComposerOnPowerLevelChange();
4646
}
4747
this._clearUnreadTimout = null;
@@ -218,7 +218,7 @@ export class RoomViewModel extends ErrorReportViewModel {
218218
}
219219
}
220220
}
221-
221+
222222
_sendMessage(message, replyingTo) {
223223
return this.logAndCatch("RoomViewModel.sendMessage", async log => {
224224
let success = false;

src/domain/session/room/UnknownRoomViewModel.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,17 @@ import {ViewModel} from "../../ViewModel";
1919
export class UnknownRoomViewModel extends ViewModel {
2020
constructor(options) {
2121
super(options);
22-
const {roomIdOrAlias, session} = options;
22+
const {roomIdOrAlias, session, isWorldReadablePromise} = options;
2323
this._session = session;
2424
this.roomIdOrAlias = roomIdOrAlias;
2525
this._error = null;
2626
this._busy = false;
27+
28+
this.checkingPreviewCapability = true;
29+
isWorldReadablePromise.then(() => {
30+
this.checkingPreviewCapability = false;
31+
this.emitChange('checkingPreviewCapability');
32+
})
2733
}
2834

2935
get error() {

src/matrix/Session.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1161,7 +1161,7 @@ export class Session {
11611161
});
11621162
}
11631163

1164-
isWorldReadableRoom(roomIdOrAlias, log = null) {
1164+
async isWorldReadableRoom(roomIdOrAlias, log = null) {
11651165
return this._platform.logger.wrapOrRun(log, "isWorldReadableRoom", async log => {
11661166
try {
11671167
let roomId;

src/matrix/room/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export enum RoomStatus {
3535
Joined = 1 << 3,
3636
Replaced = 1 << 4,
3737
Archived = 1 << 5,
38+
WorldReadable = 1 << 6,
3839
}
3940

4041
export enum RoomType {

src/platform/web/ui/session/SessionView.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ limitations under the License.
1717

1818
import {LeftPanelView} from "./leftpanel/LeftPanelView.js";
1919
import {RoomView} from "./room/RoomView.js";
20-
import {UnknownRoomView, WorldReadableRoomView} from "./room/UnknownRoomView.js";
20+
import {UnknownRoomView} from "./room/UnknownRoomView.js";
21+
import {WorldReadableRoomView} from "./room/WorldReadableRoomView.js";
2122
import {RoomBeingCreatedView} from "./room/RoomBeingCreatedView.js";
2223
import {InviteView} from "./room/InviteView.js";
2324
import {LightboxView} from "./room/LightboxView.js";

src/platform/web/ui/session/room/UnknownRoomView.js

Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,12 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import {InlineTemplateView, TemplateView} from "../../general/TemplateView";
18-
import {AvatarView} from "../../AvatarView";
19-
import {TimelineView} from "./TimelineView";
20-
import {TimelineLoadingView} from "./TimelineLoadingView";
17+
import {TemplateView} from "../../general/TemplateView";
2118
import {spinner} from "../../common.js";
22-
import {viewClassForTile} from "./common";
2319

2420
export class UnknownRoomView extends TemplateView {
25-
26-
constructor(vm) {
27-
super(vm);
28-
}
29-
3021
render(t, vm) {
31-
return t.div({className: "UnknownRoomView middle"}, [
22+
return t.main({className: "UnknownRoomView middle"}, t.div([
3223
t.h2([
3324
vm.i18n`You are currently not in ${vm.roomIdOrAlias}.`,
3425
t.br(),
@@ -45,41 +36,6 @@ export class UnknownRoomView extends TemplateView {
4536
t.p(vm.i18n`Checking preview capability...`)
4637
])),
4738
t.if(vm => vm.error, t => t.p({className: "error"}, vm.error))
48-
]);
49-
}
50-
}
51-
52-
export class WorldReadableRoomView extends TemplateView {
53-
54-
constructor(vm) {
55-
super(vm);
56-
}
57-
58-
render(t, vm) {
59-
return t.div({className: "RoomView WorldReadableRoomView middle"}, [
60-
t.div({className: "RoomHeader middle-header"}, [
61-
t.view(new AvatarView(vm, 32)),
62-
t.div({className: "room-description"}, [
63-
t.h2(vm => vm.room.name),
64-
]),
65-
]),
66-
t.div({className: "RoomView_body"}, [
67-
t.div({className: "RoomView_error"}, [
68-
t.if(vm => vm.error, t => t.div([
69-
t.p({}, vm => vm.error),
70-
t.button({className: "RoomView_error_closerButton", onClick: evt => vm.dismissError(evt)})
71-
]))
72-
]),
73-
t.mapView(vm => vm.timelineViewModel, timelineViewModel => {
74-
return timelineViewModel ?
75-
new TimelineView(timelineViewModel, viewClassForTile) :
76-
new TimelineLoadingView(vm); // vm is just needed for i18n
77-
}),
78-
t.div({className: "WorldReadableRoomComposerView"}, [
79-
t.h3(vm => vm.i18n`Join the room to participate`),
80-
t.button({className: "joinRoomButton", onClick: () => vm.join()}, vm.i18n`Join Room`)
81-
])
82-
])
83-
]);
39+
]));
8440
}
8541
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import {TemplateView} from "../../general/TemplateView";
2+
import {TimelineView} from "./TimelineView";
3+
import {viewClassForTile} from "./common";
4+
import {TimelineLoadingView} from "./TimelineLoadingView";
5+
import {AvatarView} from "../../AvatarView";
6+
7+
export class WorldReadableRoomView extends TemplateView {
8+
9+
constructor(vm) {
10+
super(vm);
11+
}
12+
13+
render(t, vm) {
14+
return t.div({className: "RoomView WorldReadableRoomView middle"}, [
15+
t.div({className: "RoomHeader middle-header"}, [
16+
t.view(new AvatarView(vm, 32)),
17+
t.div({className: "room-description"}, [
18+
t.h2(vm => vm.room.name),
19+
]),
20+
]),
21+
t.div({className: "RoomView_body"}, [
22+
t.div({className: "RoomView_error"}, [
23+
t.if(vm => vm.error, t => t.div([
24+
t.p({}, vm => vm.error),
25+
t.button({className: "RoomView_error_closerButton", onClick: evt => vm.dismissError(evt)})
26+
]))
27+
]),
28+
t.mapView(vm => vm.timelineViewModel, timelineViewModel => {
29+
return timelineViewModel ?
30+
new TimelineView(timelineViewModel, viewClassForTile) :
31+
new TimelineLoadingView(vm); // vm is just needed for i18n
32+
}),
33+
t.div({className: "WorldReadableRoomComposerView"}, [
34+
t.h3(vm => vm.i18n`Join the room to participate`),
35+
t.button({className: "joinRoomButton", onClick: () => vm.join()}, vm.i18n`Join Room`)
36+
])
37+
])
38+
]);
39+
}
40+
}

0 commit comments

Comments
 (0)