diff options
Diffstat (limited to 'packages/merchant-backoffice-ui/src/context/session.ts')
-rw-r--r-- | packages/merchant-backoffice-ui/src/context/session.ts | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/packages/merchant-backoffice-ui/src/context/session.ts b/packages/merchant-backoffice-ui/src/context/session.ts index 98cb27400..7a5ef33d7 100644 --- a/packages/merchant-backoffice-ui/src/context/session.ts +++ b/packages/merchant-backoffice-ui/src/context/session.ts @@ -39,7 +39,6 @@ export type SessionState = LoggedIn | LoggedOut | Expired; interface LoggedIn { status: "loggedIn"; - backendUrl: string; isAdmin: boolean; instance: string; token: AccessToken | undefined; @@ -52,7 +51,6 @@ interface Impersonate { } interface Expired { status: "expired"; - backendUrl: string; isAdmin: boolean; instance: string; token?: undefined; @@ -60,7 +58,6 @@ interface Expired { } interface LoggedOut { status: "loggedOut"; - backendUrl: string; instance: string; isAdmin: boolean; token?: undefined; @@ -69,7 +66,6 @@ interface LoggedOut { export const codecForSessionStateLoggedIn = (): Codec<LoggedIn> => buildCodecForObject<LoggedIn>() .property("status", codecForConstString("loggedIn")) - .property("backendUrl", codecForString()) .property("instance", codecForString()) .property("impersonate", codecOptional(codecForImpresonate())) .property("token", codecOptional(codecForString() as Codec<AccessToken>)) @@ -79,7 +75,6 @@ export const codecForSessionStateLoggedIn = (): Codec<LoggedIn> => export const codecForSessionStateExpired = (): Codec<Expired> => buildCodecForObject<Expired>() .property("status", codecForConstString("expired")) - .property("backendUrl", codecForString()) .property("instance", codecForString()) .property("impersonate", codecOptional(codecForImpresonate())) .property("isAdmin", codecForBoolean()) @@ -88,7 +83,6 @@ export const codecForSessionStateExpired = (): Codec<Expired> => export const codecForSessionStateLoggedOut = (): Codec<LoggedOut> => buildCodecForObject<LoggedOut>() .property("status", codecForConstString("loggedOut")) - .property("backendUrl", codecForString()) .property("instance", codecForString()) .property("isAdmin", codecForBoolean()) .build("SessionState.LoggedOut"); @@ -121,7 +115,6 @@ export const defaultState = (url: URL): SessionState => { return { status: "loggedIn", instance, - backendUrl: url.href, isAdmin: instance === DEFAULT_ADMIN_USERNAME, token: undefined, impersonate: undefined, @@ -151,7 +144,7 @@ export interface SessionStateHandler { * from loggedIn to impersonate * @param info */ - impersonate(info: { instance: string; token?: AccessToken }): void; + impersonate(info: { instance: string; baseUrl: URL, token?: AccessToken }): void; } const SESSION_STATE_KEY = buildStorageKey( @@ -169,20 +162,19 @@ export const INSTANCE_ID_LOOKUP = /\/instances\/([^/]*)\/?$/; * base URL. */ export function useSessionContext(): SessionStateHandler { - const { url } = useMerchantApiContext(); + const { url: merchantUrl, changeBackend } = useMerchantApiContext(); const { value: state, update } = useLocalStorage( SESSION_STATE_KEY, - defaultState(url), + defaultState(merchantUrl), ); return { state, logOut() { - const instance = inferInstanceName(url); + const instance = inferInstanceName(merchantUrl); const nextState: SessionState = { status: "loggedOut", - backendUrl: url.href, instance, isAdmin: instance === DEFAULT_ADMIN_USERNAME, }; @@ -196,9 +188,10 @@ export function useSessionContext(): SessionStateHandler { if (state.impersonate === undefined) { return; } + const newURL = new URL(`/`, state.impersonate.originalBackendUrl); + changeBackend(newURL); const nextState: SessionState = { status: "loggedIn", - backendUrl: state.impersonate.originalBackendUrl, isAdmin: state.impersonate.originalInstance === DEFAULT_ADMIN_USERNAME, instance: state.impersonate.originalInstance, token: state.impersonate.originalToken, @@ -211,16 +204,15 @@ export function useSessionContext(): SessionStateHandler { // can't impersonate if not loggedin return; } + changeBackend(info.baseUrl); const nextState: SessionState = { status: "loggedIn", - backendUrl: new URL(`instances/${info.instance}`, state.backendUrl) - .href, isAdmin: info.instance === DEFAULT_ADMIN_USERNAME, instance: info.instance, // FIXME: bank and merchant should have consistent behavior token: info.token?.substring("secret-token:".length) as AccessToken, impersonate: { - originalBackendUrl: state.backendUrl, + originalBackendUrl: merchantUrl.href, originalToken: state.token, originalInstance: state.instance, }, |