@@ -89,6 +89,7 @@ export interface AuthContext {
89
89
sshKey ?: TypesGen . GitSSHKey
90
90
getSSHKeyError ?: Error | unknown
91
91
regenerateSSHKeyError ?: Error | unknown
92
+ host ?: TypesGen . GetAppHostResponse [ "host" ]
92
93
}
93
94
94
95
export type AuthEvent =
@@ -159,6 +160,13 @@ export const authMachine =
159
160
} ,
160
161
} ,
161
162
} ,
163
+ signedOutAllDomains : {
164
+ on : {
165
+ SIGN_IN : {
166
+ target : "signingIn" ,
167
+ } ,
168
+ } ,
169
+ } ,
162
170
signingIn : {
163
171
entry : "clearAuthError" ,
164
172
invoke : {
@@ -416,10 +424,44 @@ export const authMachine =
416
424
} ,
417
425
on : {
418
426
SIGN_OUT : {
419
- target : "signingOut " ,
427
+ target : "checkingAppHost " ,
420
428
} ,
421
429
} ,
422
430
} ,
431
+ checkingAppHost : {
432
+ invoke : {
433
+ src : "checkHost" ,
434
+ id : "checkHost" ,
435
+ onDone : [
436
+ {
437
+ cond : "hasHost" ,
438
+ actions : [ "assignHost" ] ,
439
+ target : "signingOutAndRedirecting" ,
440
+ } ,
441
+ {
442
+ target : "signingOut" ,
443
+ } ,
444
+ ] ,
445
+ }
446
+ } ,
447
+ signingOutAndRedirecting : {
448
+ invoke : {
449
+ src : "signOutAndRedirect" ,
450
+ id : "signOutAndRedirect" ,
451
+ onDone : [
452
+ {
453
+ actions : [ "unassignMe" , "clearAuthError" ] ,
454
+ target : "signedOutAllDomains" ,
455
+ } ,
456
+ ] ,
457
+ onError : [
458
+ {
459
+ actions : "assignAuthError" ,
460
+ target : "signedIn" ,
461
+ } ,
462
+ ] ,
463
+ }
464
+ } ,
423
465
signingOut : {
424
466
invoke : {
425
467
src : "signOut" ,
@@ -469,24 +511,27 @@ export const authMachine =
469
511
signIn : async ( _ , event ) => {
470
512
return await API . login ( event . email , event . password )
471
513
} ,
472
- signOut : async ( ) => {
514
+ checkHost : async ( ) => {
515
+ const appHost = await API . getApplicationsHost ( )
516
+ return appHost . host
517
+ } ,
518
+ signOutAndRedirect : async ( context ) => {
473
519
// Get app hostname so we can see if we need to log out of app URLs.
474
520
// We need to load this before we log out of the API as this is an
475
521
// authenticated endpoint.
476
- const appHost = await API . getApplicationsHost ( )
477
522
await API . logout ( )
478
-
479
- if ( appHost . host ) {
523
+ if ( context . host ) {
480
524
const redirect_uri = encodeURIComponent ( window . location . href )
481
525
// The path doesn't matter but we use /api because the dev server
482
526
// proxies /api to the backend.
483
- const uri = `${ window . location . protocol } //${ appHost . host . replace (
527
+ const uri = `${ window . location . protocol } //${ context . host . replace (
484
528
"*" ,
485
529
"coder-logout" ,
486
530
) } /api/logout?redirect_uri=${ redirect_uri } `
487
531
window . location . replace ( uri )
488
532
}
489
533
} ,
534
+ signOut : API . logout ,
490
535
getMe : API . getUser ,
491
536
getMethods : API . getAuthMethods ,
492
537
updateProfile : async ( context , event ) => {
@@ -594,9 +639,13 @@ export const authMachine =
594
639
notifySuccessSSHKeyRegenerated : ( ) => {
595
640
displaySuccess ( Language . successRegenerateSSHKey )
596
641
} ,
642
+ assignHost : ( ) => assign ( {
643
+ host : ( _ , event ) => event
644
+ } )
597
645
} ,
598
646
guards : {
599
647
isTrue : ( _ , event ) => event . data ,
648
+ hasHost : ( _ , event ) => Boolean ( event ) ,
600
649
} ,
601
650
} ,
602
651
)
0 commit comments