@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
86 lines (85 loc) • 3.29 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const react_1 = require("react");
const Errors_1 = require("../constants/Errors");
const api_services_1 = require("@selfcommunity/api-services");
const utils_1 = require("@selfcommunity/utils");
const SCUserProvider_1 = require("../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
*/
function useSCFetchUserBlockedBy({ user = null, blockedByUser = null, sync = true, }) {
const [blockedBy, setBlockedBy] = (0, react_1.useState)(null);
const [loading, setLoading] = (0, react_1.useState)(true);
const [error, setError] = (0, react_1.useState)(null);
// CONTEXT
const scUserContext = (0, SCUserProvider_1.useSCUser)();
/**
* Memoized fetchUserBlockedBy
*/
const fetchUserBlockedBy = (0, react_1.useMemo)(() => (user, setLoadingStatus = true) => {
setLoadingStatus && setLoading(true);
return api_services_1.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);
utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, 'Unable to load user blocked by.');
utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, e);
setError(e);
});
}, [loading, setBlockedBy]);
/**
* If user attempt to get blocked by
*/
(0, react_1.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]);
(0, react_1.useEffect)(() => {
if (!scUserContext.user && blockedBy !== null) {
setBlockedBy(blockedByUser);
}
}, [scUserContext.user, blockedBy, blockedByUser]);
/**
* If sync enabled pull the remote status every 5sec
*/
(0, react_1.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 };
}
exports.default = useSCFetchUserBlockedBy;
;