Skip to content

Commit 476875f

Browse files
committed
show unknown room when room is loaded in a single user mode, and creates a guest session if necessary
1 parent 01065ad commit 476875f

File tree

5 files changed

+82
-3
lines changed

5 files changed

+82
-3
lines changed

frontend/iframe/platform/Navigation.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export enum Section {
99
SessionLoading = "loading",
1010
Session = "session",
1111
Error = "error",
12+
UnknownRoom = "unknown-room",
1213
Redirecting = "redirecting",
1314
}
1415

frontend/iframe/viewmodels/RootViewModel.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { LogoutViewModel } from "hydrogen-web/src/domain/LogoutViewModel";
44
import { SegmentType } from "hydrogen-web/src/domain/navigation";
55
import { SessionLoadViewModel } from "hydrogen-web/src/domain/SessionLoadViewModel";
66
import { SessionPickerViewModel } from "hydrogen-web/src/domain/SessionPickerViewModel";
7+
import { UnknownRoomViewModel } from "hydrogen-web/src/domain/session/room/UnknownRoomViewModel";
78
import { Options as BaseOptions, ViewModel } from "hydrogen-web/src/domain/ViewModel";
89
import { Client } from "hydrogen-web/src/matrix/Client.js";
910
import { HomeServerApi } from "hydrogen-web/src/matrix/net/HomeServerApi";
@@ -22,6 +23,7 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
2223
private _sessionPickerViewModel: SessionPickerViewModel | undefined;
2324
private _sessionLoadViewModel: SessionLoadViewModel | undefined;
2425
private _sessionViewModel: SessionViewModel | undefined;
26+
private _unknownRoomViewModel: UnknownRoomViewModel | undefined;
2527
private _pendingClient: Client;
2628
private readonly _singleRoomIdOrAlias: string | undefined;
2729
private _resolvedSingleRoomId: string | undefined;
@@ -46,6 +48,8 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
4648
return Section.SessionLoading;
4749
} else if (this._sessionViewModel) {
4850
return Section.Session;
51+
} else if (this._unknownRoomViewModel) {
52+
return Section.UnknownRoom;
4953
} else {
5054
return Section.Redirecting;
5155
}
@@ -71,6 +75,10 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
7175
return this._sessionLoadViewModel;
7276
}
7377

78+
public get unknownRoomViewModel(): UnknownRoomViewModel | undefined {
79+
return this._unknownRoomViewModel;
80+
}
81+
7482
public get sessionViewModel(): SessionViewModel | undefined {
7583
return this._sessionViewModel;
7684
}
@@ -157,6 +165,22 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
157165
this._showLogin(loginToken);
158166
}
159167
} else {
168+
if (this._singleRoomIdOrAlias) {
169+
// No active session but we're in single-room mode.
170+
if (!this._resolvedSingleRoomId) {
171+
try {
172+
this._resolvedSingleRoomId = await this.resolveRoomAlias(this._singleRoomIdOrAlias);
173+
} catch (error) {
174+
console.warn(error);
175+
}
176+
}
177+
178+
if (this._resolvedSingleRoomId) {
179+
await this._showUnknownRoom(this._resolvedSingleRoomId);
180+
return;
181+
}
182+
}
183+
160184
try {
161185
if (!(shouldRestoreLastUrl && this.urlRouter.tryRestoreLastUrl())) {
162186
const sessionInfos = await this.platform.sessionInfoStorage.getAll();
@@ -204,6 +228,29 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
204228
return response.room_id;
205229
}
206230

231+
private async isWorldReadableRoom(roomId: string, sessionId: string): Promise<boolean> {
232+
const sessionInfo = await this.platform.sessionInfoStorage.get(sessionId);
233+
if (!sessionInfo) {
234+
console.error(`Could not find session for id ${sessionId}`);
235+
return false;
236+
}
237+
238+
const homeserver = await lookupHomeserver(roomId.split(':')[1], this.platform.request);
239+
const homeserverApi = new HomeServerApi({
240+
homeserver: homeserver,
241+
request: this.platform.request,
242+
accessToken: sessionInfo.accessToken,
243+
reconnector: this.platform.reconnector,
244+
});
245+
246+
return homeserverApi.state(roomId, 'm.room.history_visibility', '').response().then(
247+
response => response.history_visibility === 'world_readable'
248+
).catch(err => {
249+
console.error(err);
250+
return false;
251+
});
252+
}
253+
207254
private _showLogin(loginToken: string | undefined) {
208255
this._setSection(() => {
209256
const options = this.childOptions({
@@ -271,6 +318,34 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
271318
});
272319
}
273320

321+
private async _showUnknownRoom(roomId: string) {
322+
const client = new Client(this.platform);
323+
let chosenSession;
324+
325+
let sessionInfos = await this.platform.sessionInfoStorage.getAll();
326+
if (sessionInfos.length === 0) {
327+
const homeserver = await lookupHomeserver(roomId.split(':')[1], this.platform.request);
328+
await client.doGuestLogin(homeserver);
329+
sessionInfos = await this.platform.sessionInfoStorage.getAll();
330+
chosenSession = sessionInfos[0];
331+
} else {
332+
chosenSession = sessionInfos[0];
333+
await client.startWithExistingSession(chosenSession.id);
334+
}
335+
console.info('chosenSession',chosenSession);
336+
// @TODO need to stop/prevent sync for guest account (when creating a new one or reusing an existing one)
337+
338+
this._setSection(() => {
339+
this._unknownRoomViewModel = new UnknownRoomViewModel(this.childOptions({
340+
roomIdOrAlias: roomId,
341+
session: chosenSession,
342+
isWorldReadablePromise: this.isWorldReadableRoom(roomId, chosenSession.id),
343+
}));
344+
});
345+
346+
this.navigation.push("session", chosenSession.id);
347+
}
348+
274349
private _setSection(setter: Function) {
275350
// Clear all members the activeSection depends on.
276351
this._error = undefined;

frontend/iframe/views/RootView.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { TemplateView } from "hydrogen-web/src/platform/web/ui/general/TemplateV
44
import { LoginView } from "hydrogen-web/src/platform/web/ui/login/LoginView";
55
import { SessionLoadView } from "hydrogen-web/src/platform/web/ui/login/SessionLoadView";
66
import { SessionPickerView } from "hydrogen-web/src/platform/web/ui/login/SessionPickerView";
7+
import { UnknownRoomView } from "hydrogen-web/src/platform/web/ui/session/room/UnknownRoomView";
78
import { LogoutView } from "hydrogen-web/src/platform/web/ui/LogoutView";
89
import { Section } from "../platform/Navigation";
910
import { RootViewModel } from "../viewmodels/RootViewModel";
@@ -36,6 +37,8 @@ export class RootView extends TemplateView<RootViewModel> {
3637
return new StaticView(t => t.p("Redirecting..."));
3738
case Section.SessionLoading:
3839
return new SessionLoadView(vm.sessionLoadViewModel);
40+
case Section.UnknownRoom:
41+
return new UnknownRoomView(vm.unknownRoomViewModel);
3942
case Section.Error:
4043
return new StaticView(t => {
4144
return t.div({ className: "StatusView" }, [

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"dependencies": {
3939
"@wordpress/compose": "^5.17.0",
4040
"bs58": "^5.0.0",
41-
"hydrogen-web": "Automattic/hydrogen-web#peeking_unknown_rooms",
41+
"hydrogen-web": "Automattic/hydrogen-web#peeking_with_guest_login",
4242
"node-html-parser": "^4.0.0"
4343
},
4444
"resolutions": {

yarn.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5715,9 +5715,9 @@ human-signals@^2.1.0:
57155715
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
57165716
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
57175717

5718-
hydrogen-web@Automattic/hydrogen-web#peeking_unknown_rooms:
5718+
hydrogen-web@Automattic/hydrogen-web#peeking_with_guest_login:
57195719
version "0.3.8"
5720-
resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/07cce3857a163c17ee68aa86b304bd4430de9bfd"
5720+
resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/8b71ac900e683da110077d9ae87e6902dfb73399"
57215721
dependencies:
57225722
"@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz"
57235723
another-json "^0.2.0"

0 commit comments

Comments
 (0)