Skip to content

Commit fe957bb

Browse files
authored
Merge pull request #199 from Automattic/peeking_with_our_fork_dependency
Peeking with our fork dependency
2 parents dcc32d0 + e01c210 commit fe957bb

File tree

8 files changed

+117
-61
lines changed

8 files changed

+117
-61
lines changed

frontend/iframe/platform/HomeserverApi.ts

Lines changed: 0 additions & 33 deletions
This file was deleted.

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/platform/Platform.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ export class Platform extends BasePlatform {
5151
return super.config;
5252
}
5353

54+
get reconnector(): any {
55+
return super.reconnector;
56+
}
57+
5458
get settingsStorage(): SettingsStorage {
5559
return super.settingsStorage;
5660
}

frontend/iframe/viewmodels/RootViewModel.ts

Lines changed: 94 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ 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";
9-
import { HomeserverApi } from "../platform/HomeserverApi";
10+
import { HomeServerApi } from "hydrogen-web/src/matrix/net/HomeServerApi";
1011
import { allSections, Section } from "../platform/Navigation";
12+
import { lookupHomeserver } from "hydrogen-web/src/matrix/well-known";
1113
import { Platform } from "../platform/Platform";
1214
import { SessionViewModel } from "./SessionViewModel";
1315

@@ -21,6 +23,7 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
2123
private _sessionPickerViewModel: SessionPickerViewModel | undefined;
2224
private _sessionLoadViewModel: SessionLoadViewModel | undefined;
2325
private _sessionViewModel: SessionViewModel | undefined;
26+
private _unknownRoomViewModel: UnknownRoomViewModel | undefined;
2427
private _pendingClient: Client;
2528
private readonly _singleRoomIdOrAlias: string | undefined;
2629
private _resolvedSingleRoomId: string | undefined;
@@ -45,6 +48,8 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
4548
return Section.SessionLoading;
4649
} else if (this._sessionViewModel) {
4750
return Section.Session;
51+
} else if (this._unknownRoomViewModel) {
52+
return Section.UnknownRoom;
4853
} else {
4954
return Section.Redirecting;
5055
}
@@ -70,6 +75,10 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
7075
return this._sessionLoadViewModel;
7176
}
7277

78+
public get unknownRoomViewModel(): UnknownRoomViewModel | undefined {
79+
return this._unknownRoomViewModel;
80+
}
81+
7382
public get sessionViewModel(): SessionViewModel | undefined {
7483
return this._sessionViewModel;
7584
}
@@ -100,6 +109,17 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
100109
const sessionId = this.navigation.path.get("session")?.value;
101110
const loginToken = this.navigation.path.get("sso")?.value;
102111

112+
if (this._singleRoomIdOrAlias && !this._resolvedSingleRoomId) {
113+
try {
114+
this._resolvedSingleRoomId = await this.resolveRoomAlias(this._singleRoomIdOrAlias);
115+
} catch (error) {
116+
// Something went wrong when navigating to the room.
117+
// We swallow the error and fallback to non-single-room mode.
118+
console.warn(error);
119+
this._resolvedSingleRoomId = undefined;
120+
}
121+
}
122+
103123
if (isLogin) {
104124
if (this.activeSection !== Section.Login) {
105125
this._showLogin(undefined);
@@ -117,21 +137,7 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
117137
void this._showPicker();
118138
}
119139
} else if (sessionId) {
120-
if (this._singleRoomIdOrAlias && !this._resolvedSingleRoomId) {
121-
// We're in single-room mode but haven't resolved the room alias yet.
122-
try {
123-
this._resolvedSingleRoomId = await this.resolveRoomAlias(sessionId, this._singleRoomIdOrAlias);
124-
} catch (error) {
125-
// Something went wrong when navigating to the room.
126-
// We swallow the error and fallback to non-single-room mode.
127-
console.warn(error);
128-
this._resolvedSingleRoomId = undefined;
129-
this.emitChange("singleRoomMode");
130-
}
131-
}
132-
133140
if (this._resolvedSingleRoomId) {
134-
this.emitChange("singleRoomMode");
135141
this.navigation.push("room", this._resolvedSingleRoomId);
136142
}
137143

@@ -161,6 +167,10 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
161167
if (this.singleRoomMode || !(shouldRestoreLastUrl && this.urlRouter.tryRestoreLastUrl())) {
162168
const sessionInfos = await this.platform.sessionInfoStorage.getAll();
163169
if (sessionInfos.length === 0) {
170+
if (this._resolvedSingleRoomId) {
171+
await this._showUnknownRoom(this._resolvedSingleRoomId);
172+
return;
173+
}
164174
this.navigation.push(Section.Login);
165175
} else if (sessionInfos.length === 1) {
166176
this.navigation.push(Section.Session, sessionInfos[0].id);
@@ -169,23 +179,63 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
169179
}
170180
}
171181
} catch (err) {
182+
console.error(err);
172183
this._setSection(() => this._error = err);
173184
}
174185
}
175186
}
176187

177-
private async resolveRoomAlias(sessionId: string, roomIdOrAlias: string): Promise<string> {
188+
private async resolveRoomAlias(roomIdOrAlias: string, sessionId?: string): Promise<string> {
189+
if (roomIdOrAlias.startsWith('!')) {
190+
return roomIdOrAlias;
191+
}
192+
193+
let sessionInfo;
194+
if (sessionId) {
195+
sessionInfo = await this.platform.sessionInfoStorage.get(sessionId);
196+
}
197+
let homeserver: string;
198+
let accessToken: string;
199+
if (sessionInfo) {
200+
homeserver = sessionInfo.homeserver;
201+
accessToken = sessionInfo.accessToken;
202+
} else {
203+
homeserver = await lookupHomeserver(roomIdOrAlias.split(':')[1], this.platform.request);
204+
accessToken = '';
205+
}
206+
207+
const homeserverApi = new HomeServerApi({
208+
homeserver: homeserver,
209+
request: this.platform.request,
210+
accessToken: accessToken,
211+
reconnector: this.platform.reconnector,
212+
});
213+
214+
let response = await homeserverApi.resolveRoomAlias(roomIdOrAlias).response();
215+
return response.room_id;
216+
}
217+
218+
private async isWorldReadableRoom(roomId: string, sessionId: string): Promise<boolean> {
178219
const sessionInfo = await this.platform.sessionInfoStorage.get(sessionId);
179220
if (!sessionInfo) {
180-
throw new Error(`Could not find session for id ${sessionId}`);
221+
console.error(`Could not find session for id ${sessionId}`);
222+
return false;
181223
}
182224

183-
const homeserverApi = new HomeserverApi({
184-
homeserver: sessionInfo.homeserver,
185-
request: this.platform.request
225+
const homeserver = await lookupHomeserver(roomId.split(':')[1], this.platform.request);
226+
const homeserverApi = new HomeServerApi({
227+
homeserver: homeserver,
228+
request: this.platform.request,
229+
accessToken: sessionInfo.accessToken,
230+
reconnector: this.platform.reconnector,
186231
});
187232

188-
return await homeserverApi.resolveRoomAlias(roomIdOrAlias);
233+
return homeserverApi.state(roomId, 'm.room.history_visibility', '').response().then(
234+
response => response.history_visibility === 'world_readable'
235+
).catch(err => {
236+
console.error(err);
237+
return false;
238+
});
189239
}
190240

191241
private _showLogin(loginToken: string | undefined) {
@@ -255,6 +305,29 @@ export class RootViewModel extends ViewModel<SegmentType, Options> {
255305
});
256306
}
257307

308+
private async _showUnknownRoom(roomId: string) {
309+
const client = new Client(this.platform);
310+
let chosenSession;
311+
312+
let sessionInfos = await this.platform.sessionInfoStorage.getAll();
313+
if (sessionInfos.length === 0) {
314+
const homeserver = await lookupHomeserver(roomId.split(':')[1], this.platform.request);
315+
await client.doGuestLogin(homeserver);
316+
} else {
317+
await client.startWithExistingSession(chosenSession.id);
318+
}
319+
320+
this._setSection(() => {
321+
this._unknownRoomViewModel = new UnknownRoomViewModel(this.childOptions({
322+
roomIdOrAlias: roomId,
323+
session: client.session,
324+
isWorldReadablePromise: this.isWorldReadableRoom(roomId, client.sessionId),
325+
}));
326+
});
327+
328+
this.navigation.push("session", client.sessionId);
329+
}
330+
258331
private _setSection(setter: Function) {
259332
// Clear all members the activeSection depends on.
260333
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" }, [

frontend/iframe/views/SessionView.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { SessionView as BaseSessionView } from "hydrogen-web/src/platform/web/ui
1414
import { SettingsView } from "hydrogen-web/src/platform/web/ui/session/settings/SettingsView";
1515
import { SessionViewModel } from "../viewmodels/SessionViewModel";
1616
import { RoomView } from "./RoomView";
17+
import { WorldReadableRoomView } from "hydrogen-web/src/platform/web/ui/session/room/WorldReadableRoomView";
1718

1819
export class SessionView extends BaseSessionView {
1920
constructor(value?: SessionViewModel) {
@@ -46,6 +47,8 @@ export class SessionView extends BaseSessionView {
4647
return new RoomView(vm.currentRoomViewModel, viewClassForTile);
4748
} else if (vm.currentRoomViewModel.kind === "roomBeingCreated") {
4849
return new RoomBeingCreatedView(vm.currentRoomViewModel);
50+
} else if (vm.currentRoomViewModel.kind === "preview") {
51+
return new WorldReadableRoomView(vm.currentRoomViewModel);
4952
} else {
5053
return new UnknownRoomView(vm.currentRoomViewModel);
5154
}

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": "vector-im/hydrogen-web#v0.3.8",
41+
"hydrogen-web": "Automattic/hydrogen-web#chatrix-0.7.0",
4242
"node-html-parser": "^4.0.0"
4343
},
4444
"resolutions": {

yarn.lock

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3801,11 +3801,16 @@ core-js-pure@^3.25.1, core-js-pure@^3.8.1:
38013801
resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.3.tgz#66ac5bfa5754b47fdfd14f3841c5ed21c46db608"
38023802
integrity sha512-T/7qvgv70MEvRkZ8p6BasLZmOVYKzOaWNBEHAU8FmveCJkl4nko2quqPQOmy6AJIp5MBanhz9no3A94NoRb0XA==
38033803

3804-
core-js@^3.19.1, core-js@^3.6.5:
3804+
core-js@^3.19.1:
38053805
version "3.25.3"
38063806
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.25.3.tgz#cbc2be50b5ddfa7981837bd8c41639f27b166593"
38073807
integrity sha512-y1hvKXmPHvm5B7w4ln1S4uc9eV/O5+iFExSRUimnvIph11uaizFR8LFMdONN8hG3P2pipUfX4Y/fR8rAEtcHcQ==
38083808

3809+
core-js@^3.6.5:
3810+
version "3.29.0"
3811+
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.0.tgz#0273e142b67761058bcde5615c503c7406b572d6"
3812+
integrity sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==
3813+
38093814
core-util-is@~1.0.0:
38103815
version "1.0.3"
38113816
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
@@ -4243,9 +4248,9 @@ domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3:
42434248
domelementtype "^2.3.0"
42444249

42454250
dompurify@^2.3.0:
4246-
version "2.4.0"
4247-
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.0.tgz#c9c88390f024c2823332615c9e20a453cf3825dd"
4248-
integrity sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==
4251+
version "2.4.5"
4252+
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.5.tgz#0e89a27601f0bad978f9a924e7a05d5d2cccdd87"
4253+
integrity sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==
42494254

42504255
domutils@^2.8.0:
42514256
version "2.8.0"
@@ -5715,9 +5720,9 @@ human-signals@^2.1.0:
57155720
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
57165721
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
57175722

5718-
hydrogen-web@vector-im/hydrogen-web#v0.3.8:
5723+
hydrogen-web@Automattic/hydrogen-web#chatrix-0.7.0:
57195724
version "0.3.8"
5720-
resolved "https://codeload.github.com/vector-im/hydrogen-web/tar.gz/8c74e54f9d644a6de47b4a7927396911510df80e"
5725+
resolved "https://codeload.github.com/Automattic/hydrogen-web/tar.gz/c50ff3faca14628b98457b91f3b8be133d28c761"
57215726
dependencies:
57225727
"@matrix-org/olm" "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz"
57235728
another-json "^0.2.0"

0 commit comments

Comments
 (0)