import { useEffect } from 'react';
import useAuthProvider from './useAuthProvider';
import { UserIdentity } from '../types';
import { useSafeSetState } from '../util/hooks';
const defaultIdentity = {
id: '',
fullName: null,
};
/**
* Return the current user identity by calling authProvider.getIdentity() on mount
*
* The return value updates according to the call state:
*
* - mount: { isLoading: true }
* - success: { identity: Identity, isLoading: false }
* - error: { error: Error, isLoading: false }
*
* The implementation is left to the authProvider.
*
* @returns The current user identity. Destructure as { identity, error, isLoading }.
*
* @example
*
* import { useGetIdentity, useGetOne } from 'react-admin';
*
* const PostDetail = ({ id }) => {
* const { data: post, isLoading: postLoading } = useGetOne('posts', { id });
* const { identity, isLoading: identityLoading } = useGetIdentity();
* if (postLoading || identityLoading) return <>Loading...>;
* if (!post.lockedBy || post.lockedBy === identity.id) {
* // post isn't locked, or is locked by me
* return
* } else {
* // post is locked by someone else and cannot be edited
* return
* }
* }
*/
const useGetIdentity = () => {
const [state, setState] = useSafeSetState({
isLoading: true,
});
const authProvider = useAuthProvider();
useEffect(() => {
if (authProvider && typeof authProvider.getIdentity === 'function') {
const callAuthProvider = async () => {
try {
const identity = await authProvider.getIdentity();
setState({
isLoading: false,
identity: identity || defaultIdentity,
});
} catch (error) {
setState({
isLoading: false,
error,
});
}
};
callAuthProvider();
} else {
setState({
isLoading: false,
identity: defaultIdentity,
});
}
}, [authProvider, setState]);
return state;
};
interface State {
isLoading: boolean;
identity?: UserIdentity;
error?: any;
}
export default useGetIdentity;