@@ -4,6 +4,7 @@ import { LogoutViewModel } from "hydrogen-web/src/domain/LogoutViewModel";
44import { SegmentType } from "hydrogen-web/src/domain/navigation" ;
55import { SessionLoadViewModel } from "hydrogen-web/src/domain/SessionLoadViewModel" ;
66import { SessionPickerViewModel } from "hydrogen-web/src/domain/SessionPickerViewModel" ;
7+ import { UnknownRoomViewModel } from "hydrogen-web/src/domain/session/room/UnknownRoomViewModel" ;
78import { Options as BaseOptions , ViewModel } from "hydrogen-web/src/domain/ViewModel" ;
89import { Client } from "hydrogen-web/src/matrix/Client.js" ;
910import { 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 ;
0 commit comments