aboutsummaryrefslogtreecommitdiff
path: root/packages/merchant-backoffice-ui/src/context
diff options
context:
space:
mode:
Diffstat (limited to 'packages/merchant-backoffice-ui/src/context')
-rw-r--r--packages/merchant-backoffice-ui/src/context/session.ts24
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,
},