UNPKG

@selfcommunity/react-core

Version:

React Core Components useful for integrating UI Community components (react-ui).

109 lines (107 loc) 3.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const react_1 = require("react"); const api_services_1 = require("@selfcommunity/api-services"); const utils_1 = require("@selfcommunity/utils"); const Errors_1 = require("../constants/Errors"); const api_services_2 = require("@selfcommunity/api-services"); /** :::info This custom hook is used to manage blocked users. ::: :::tip How to use it: Follow these steps: ```jsx 1. const scUserContext: SCUserContextType = useSCUser(); 2. const scBlockedUsersManager: SCBlockedUsersManagerType = scUserContext.manager.blockedUsers; 3. scBlockedUsersManager.isBlocked(user) ``` ::: */ function useSCBlockedUsersManager(user) { const [loading, setLoading] = (0, react_1.useState)(false); const [data, setData] = (0, react_1.useState)([]); // CONST const authUserId = user ? user.id : null; /** * Memoized isLoading */ const isLoading = (0, react_1.useMemo)(() => () => { return loading; }, [loading]); /** * Memoized refresh all blocked users * It makes a single request to the server and retrieves * all blocked users by the authenticated user in a single solution * It might be useful for multi-tab sync */ const refresh = (0, react_1.useMemo)(() => (setLoadingStatus = false) => { if (user) { setLoadingStatus && setLoading(true); // Only if user is authenticated return api_services_2.UserService.getHiddenUsersId() .then((res) => { setData(res); setLoadingStatus && setLoading(false); return Promise.resolve(res); }) .catch((e) => { utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, 'Unable to load blocked users.'); utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, e); setLoadingStatus && setLoading(false); return Promise.reject(e); }); } return Promise.reject(); }, [data, user]); /** * Memoized block/unblock User * Toggle action */ const block = (0, react_1.useMemo)(() => (user) => { setLoading(true); return api_services_1.http .request({ url: api_services_1.Endpoints.UserShowHide.url({ id: user.id }), method: api_services_1.Endpoints.UserShowHide.method, }) .then((res) => { if (res.status >= 300) { return Promise.reject(res); } const isBlocked = data.includes(user.id); const _data = isBlocked ? [...data.filter((id) => id !== user.id)] : [...[user.id], ...data]; setData(_data); setLoading(false); return Promise.resolve(!isBlocked); }); }, [loading, data.length, setLoading]); /** * Memoized isBlocked * If user is already in cache -> check if the user is blocked, * otherwise, check if authenticathed user has block the user */ const isBlocked = (0, react_1.useMemo)(() => (user) => { if (authUserId) { return data.includes(user.id); } return false; }, [data]); /** * Refresh cache on login * Empty cache on logout */ (0, react_1.useEffect)(() => { if (authUserId) { refresh(true); } else { setData([]); } }, [authUserId]); if (!user) { return { blocked: data, loading, isLoading }; } return { blocked: data, loading, isLoading, block, isBlocked, refresh }; } exports.default = useSCBlockedUsersManager;