@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
79 lines (78 loc) • 2.74 kB
JavaScript
import { useEffect, useMemo, useState } from 'react';
import { SCOPE_SC_CORE } from '../constants/Errors';
import { http, Endpoints } from '@selfcommunity/api-services';
import { Logger, objectWithoutProperties } from '@selfcommunity/utils';
import { useSCUser } from '../components/provider/SCUserProvider';
/**
:::info
This custom hook is used to fetch a user object.
:::
* @param object
* @param object.id
* @param object.user
*/
export default function useSCFetchUser({ id = null, user = null }) {
// CONTEXT
const scUserContext = useSCUser();
const authUserId = scUserContext.user ? scUserContext.user.id : null;
const __user = useMemo(() => (authUserId ? user : objectWithoutProperties(user, ['connection_status'])), [user]);
const [scUser, setSCUser] = useState(__user);
const [error, setError] = useState(null);
const [refreshing, setRefreshing] = useState(false);
/**
* Memoized fetchUser
*/
const fetchUser = useMemo(() => () => {
return http
.request({
url: Endpoints.User.url({ id: user ? user.id : id }),
method: Endpoints.User.method,
})
.then((res) => {
if (res.status >= 300) {
return Promise.reject(res);
}
return Promise.resolve(res.data);
});
}, [id, user]);
/**
* Memoized refresh
*/
const refresh = useMemo(() => () => {
if (!refreshing) {
setRefreshing(true);
return fetchUser()
.then((obj) => {
setRefreshing(false);
setSCUser(authUserId ? obj : objectWithoutProperties(obj, ['connection_status']));
})
.catch((err) => {
setRefreshing(false);
setError(`Unable to refresh user with id ${id}`);
Logger.error(SCOPE_SC_CORE, `Unable to refresh user with id ${id}`);
Logger.error(SCOPE_SC_CORE, err.message);
});
}
return Promise.reject();
}, [fetchUser, refreshing]);
/**
* If id resolve the obj
*/
useEffect(() => {
if (id) {
fetchUser()
.then((obj) => {
setSCUser(authUserId ? obj : objectWithoutProperties(obj, ['connection_status']));
})
.catch((err) => {
setError(`User with id ${id} not found`);
Logger.error(SCOPE_SC_CORE, `User with id ${id} not found`);
Logger.error(SCOPE_SC_CORE, err.message);
});
}
else {
setSCUser(__user);
}
}, [id, __user]);
return { scUser, setSCUser, refresh, refreshing, error };
}