X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/db4b8c25a0a3418df5645060ccfa9406d20fce62..35ce0164f3863e7117fade1319ed3c2789bc216a:/src/store/auth/auth-action.ts diff --git a/src/store/auth/auth-action.ts b/src/store/auth/auth-action.ts index 5fbfce48d8..15fe3d4d59 100644 --- a/src/store/auth/auth-action.ts +++ b/src/store/auth/auth-action.ts @@ -10,15 +10,18 @@ import { SshKeyResource } from '~/models/ssh-key'; import { User } from "~/models/user"; import { Session } from "~/models/session"; import { Config } from '~/common/config'; -import { cancelLinking } from '~/store/link-account-panel/link-account-panel-actions'; import { matchTokenRoute, matchFedTokenRoute } from '~/routes/routes'; -import { createServices, setAuthorizationHeader, removeAuthorizationHeader } from "~/services/services"; +import { createServices, setAuthorizationHeader } from "~/services/services"; +import { cancelLinking } from '~/store/link-account-panel/link-account-panel-actions'; +import { progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions"; +import { WORKBENCH_LOADING_SCREEN } from '~/store/workbench/workbench-actions'; +import { addRemoteConfig } from './auth-action-session'; export const authActions = unionize({ LOGIN: {}, LOGOUT: ofType<{ deleteLinkData: boolean }>(), - CONFIG: ofType<{ config: Config }>(), - INIT: ofType<{ user: User, token: string }>(), + SET_CONFIG: ofType<{ config: Config }>(), + INIT_USER: ofType<{ user: User, token: string }>(), USER_DETAILS_REQUEST: {}, USER_DETAILS_SUCCESS: ofType(), SET_SSH_KEYS: ofType(), @@ -36,27 +39,39 @@ export const initAuth = (config: Config) => (dispatch: Dispatch, getState: () => // Cancel any link account ops in progress unless the user has // just logged in or there has been a successful link operation const data = services.linkAccountService.getLinkOpStatus(); - if (!matchTokenRoute(location.pathname) && (!matchFedTokenRoute(location.pathname)) && data === undefined) { + if (!matchTokenRoute(location.pathname) && + (!matchFedTokenRoute(location.pathname)) && data === undefined) { dispatch(cancelLinking()).then(() => { dispatch(init(config)); }); - } - else { + } else { dispatch(init(config)); } }; const init = (config: Config) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + const remoteHosts = () => getState().auth.remoteHosts; const token = services.authService.getApiToken(); let homeCluster = services.authService.getHomeCluster(); if (homeCluster && !config.remoteHosts[homeCluster]) { homeCluster = undefined; } - dispatch(authActions.CONFIG({ config })); + dispatch(authActions.SET_CONFIG({ config })); + Object.keys(remoteHosts()).forEach((remoteUuid: string) => { + const remoteHost = remoteHosts()[remoteUuid]; + if (remoteUuid !== config.uuidPrefix) { + dispatch(addRemoteConfig(remoteHost)); + } + }); dispatch(authActions.SET_HOME_CLUSTER(config.loginCluster || homeCluster || config.uuidPrefix)); if (token && token !== "undefined") { - dispatch(saveApiToken(token)); + dispatch(progressIndicatorActions.START_WORKING(WORKBENCH_LOADING_SCREEN)); + dispatch(saveApiToken(token)).then(() => { + dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN)); + }).catch(() => { + dispatch(progressIndicatorActions.STOP_WORKING(WORKBENCH_LOADING_SCREEN)); + }); } }; @@ -70,7 +85,9 @@ export const saveApiToken = (token: string) => (dispatch: Dispatch, getState: () const svc = createServices(config, { progressFn: () => { }, errorFn: () => { } }); setAuthorizationHeader(svc, token); return svc.authService.getUserDetails().then((user: User) => { - dispatch(authActions.INIT({ user, token })); + dispatch(authActions.INIT_USER({ user, token })); + }).catch(() => { + dispatch(authActions.LOGOUT({ deleteLinkData: false })); }); }; @@ -80,8 +97,8 @@ export const login = (uuidPrefix: string, homeCluster: string, loginCluster: str dispatch(authActions.LOGIN()); }; -export const logout = (deleteLinkData: boolean = false) => (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { - dispatch(authActions.LOGOUT({ deleteLinkData })); -}; +export const logout = (deleteLinkData: boolean = false) => + (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => + dispatch(authActions.LOGOUT({ deleteLinkData })); export type AuthAction = UnionOf;