@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
83 lines (82 loc) • 3.03 kB
JavaScript
import { useEffect, useMemo, useState } from 'react';
import { SCOPE_SC_CORE } from '../constants/Errors';
import { UserService } from '@selfcommunity/api-services';
import { Logger } from '@selfcommunity/utils';
import { useSCUser } from '../components/provider/SCUserProvider';
/**
:::info
This custom hook is used to fetch if a user is blocked by another user.
:::
* @param object
* @param object.user
* @param object.blockedByUser
* @param object.sync
*/
export default function useSCFetchUserBlockedBy({ user = null, blockedByUser = null, sync = true, }) {
const [blockedBy, setBlockedBy] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
// CONTEXT
const scUserContext = useSCUser();
/**
* Memoized fetchUserBlockedBy
*/
const fetchUserBlockedBy = useMemo(() => (user, setLoadingStatus = true) => {
setLoadingStatus && setLoading(true);
return UserService.checkUserHiddenBy(user.id)
.then((res) => {
setLoadingStatus && setLoading(false);
setBlockedBy(res.is_hidden_by);
return Promise.resolve(res.is_hidden_by);
})
.catch((e) => {
setLoadingStatus && setLoading(false);
Logger.error(SCOPE_SC_CORE, 'Unable to load user blocked by.');
Logger.error(SCOPE_SC_CORE, e);
setError(e);
});
}, [loading, setBlockedBy]);
/**
* If user attempt to get blocked by
*/
useEffect(() => {
if (user && blockedBy === null) {
// if user && blockedBy === null initialize the component
if (scUserContext.user) {
// authenticated user
if (scUserContext.user.id !== user.id) {
fetchUserBlockedBy(user);
}
else {
setBlockedBy(false);
setLoading(false);
}
}
else if (scUserContext.user === null) {
// anonymous user
setBlockedBy(blockedByUser);
setLoading(false);
}
}
}, [scUserContext.user, user, fetchUserBlockedBy, blockedBy, loading]);
useEffect(() => {
if (!scUserContext.user && blockedBy !== null) {
setBlockedBy(blockedByUser);
}
}, [scUserContext.user, blockedBy, blockedByUser]);
/**
* If sync enabled pull the remote status every 5sec
*/
useEffect(() => {
let interval;
if (scUserContext.user && scUserContext.user.id !== (user === null || user === void 0 ? void 0 : user.id) && blockedBy !== null && sync) {
interval = setInterval(() => {
fetchUserBlockedBy(user, false);
}, 5000);
return () => {
interval && clearInterval(interval);
};
}
}, [scUserContext.user, user, fetchUserBlockedBy, blockedBy]);
return { blockedBy, loading, error };
}