@datalayer/core
Version:
**Datalayer Core**
94 lines (93 loc) • 3.35 kB
JavaScript
/*
* Copyright (c) 2023-2025 Datalayer, Inc.
* Distributed under the terms of the Modified BSD License.
*/
import { useEffect, useState } from 'react';
import { useCache } from './useCache';
import { coreStore, useIAMStore, useLayoutStore, useOrganizationStore, useSpaceStore } from '../state';
import { asUser, ANONYMOUS_USER, ANONYMOUS_USER_TOKEN } from '../models';
import { requestDatalayerAPI } from '../api';
export const useIAM = (props = { user: undefined, token: undefined }) => {
const { token } = props;
const [iamState, setIAMState] = useState(props);
const iamStore = useIAMStore();
const layoutStore = useLayoutStore();
const organizationStore = useOrganizationStore();
const spaceStore = useSpaceStore();
const { clearAllCaches, whoami } = useCache();
const loginAndNavigate = async (token, logout, refresh, navigate, homeRoute) => {
try {
const resp = await requestDatalayerAPI({
url: `${iamStore.iamRunUrl}/api/iam/v1/login`,
method: 'POST',
body: { token },
});
if (resp.success && resp.token) {
if (resp.is_provided_token_external === true) {
// The provided token is recognized as an external one, so store it as such...
iamStore.setExternalToken(token);
}
const user = asUser(resp.user);
const responseToken = resp.token;
setIAMState({ user, token: responseToken });
refresh(responseToken);
if (navigate && homeRoute) {
navigate(homeRoute);
}
}
else {
throw new Error('Invalid Token.');
}
}
catch (error) {
if (error.name === 'RunResponseError' &&
error.response.status === 401) {
console.log('Datalayer IAM has sent a 401 return code.');
logout();
}
throw error;
}
};
const setLogin = (user, token) => {
iamStore.setLogin(user, token);
setIAMState({
user,
token,
});
};
const logout = () => {
iamStore.logout();
layoutStore.reset();
organizationStore.updateOrganizations([]);
spaceStore.updateSpaces([]);
clearAllCaches();
setIAMState({ user: ANONYMOUS_USER, token: ANONYMOUS_USER_TOKEN });
};
useEffect(() => {
if (token) {
whoami()
.then(resp => {
if (resp.success) {
const user = asUser(resp.profile);
setIAMState({ user, token });
iamStore.setLogin(user, token);
// TODO centralize user settings management.
const aiagentsRunUrl = user.settings?.aiAgentsUrl;
if (aiagentsRunUrl) {
coreStore.getState().setConfiguration({
aiagentsRunUrl,
});
}
}
});
}
}, []);
return {
user: iamState.user,
token: iamState.token,
loginAndNavigate,
setLogin,
logout
};
};
export default useIAM;