UNPKG

@selfcommunity/react-core

Version:

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

143 lines (141 loc) 5.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); 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 useSCCachingManager_1 = tslib_1.__importDefault(require("./useSCCachingManager")); /** :::info This custom hook is used to manage to manage subscribed incubators. ::: :::tip How to use it: Follow these steps: ```jsx 1. const scUserContext: SCUserContextType = useSCUser(); 2. const scSubscribedIncubatorsManager: SCSubscribedIncubatorsManagerType = scUserContext.managers.incubators; 3. scSubscribedIncubatorsManager.isSubscribed(incubator) ``` ::: */ function useSCSubscribedIncubatorsManager(user) { const { cache, updateCache, emptyCache, data, setData, loading, setLoading, setUnLoading, isLoading } = (0, useSCCachingManager_1.default)(); const authUserId = user ? user.id : null; /** * Memoized refresh all subscribed * It makes a single request to the server and retrieves * all the incubators subscribed by the authenticated user in a single solution * It might be useful for multi-tab sync */ const refresh = (0, react_1.useMemo)(() => () => { emptyCache(); if (user) { // Only if user is authenticated api_services_1.http .request({ url: api_services_1.Endpoints.GetAllIncubators.url({}), method: api_services_1.Endpoints.GetAllIncubators.method, }) .then((res) => { if (res.status >= 300) { return Promise.reject(res); } const incubatorIds = res.data.results.map((i) => i.id); updateCache(incubatorIds); setData(incubatorIds); return Promise.resolve(res.data); }) .catch((e) => { utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, 'Unable to refresh incubators subscribed by the authenticated user.'); utils_1.Logger.error(Errors_1.SCOPE_SC_CORE, e); }); } }, [data, user, cache]); /** * Memoized subscribe/unsubscribe incubator * Toggle action */ const subscribe = (0, react_1.useMemo)(() => (incubator) => { setLoading(incubator.id); return api_services_1.http .request({ url: api_services_1.Endpoints.SubscribeToIncubator.url({ id: incubator.id }), method: api_services_1.Endpoints.SubscribeToIncubator.method, }) .then((res) => { if (res.status >= 300) { return Promise.reject(res); } updateCache([incubator.id]); const isSubscribed = data.includes(incubator.id); setData((prev) => (isSubscribed ? prev.filter((id) => id !== incubator.id) : [...[incubator.id], ...prev])); setUnLoading(incubator.id); return Promise.resolve(res.data); }); }, [data, loading, cache]); /** * Check if the authenticated user has subscribed the incubator * Update the subscribed cached * Update subscribed incubators * @param incubator */ const checkIsIncubatorFollowed = (incubator) => { setLoading(incubator.id); api_services_1.http .request({ url: api_services_1.Endpoints.CheckIncubatorSubscription.url({ id: incubator.id }), method: api_services_1.Endpoints.CheckIncubatorSubscription.method, }) .then((res) => { if (res.status >= 300) { return Promise.reject(res); } updateCache([incubator.id]); setData((prev) => (res.data.subscribed ? [...prev, ...[incubator.id]] : prev.filter((id) => id !== incubator.id))); setUnLoading(incubator.id); return Promise.resolve(res.data); }); }; /** * Bypass remote check if the incubator is subscribed */ const getSubscriptionStatus = (0, react_1.useMemo)(() => (incubator) => { const isSubscribed = incubator.subscribed || false; updateCache([incubator.id]); setData((prev) => (isSubscribed ? [...prev, ...[incubator.id]] : prev)); return isSubscribed; }, [data, cache]); /** * Memoized isSubscribed * If incubator is already in cache -> check if the incubator is in subscribed, * otherwise, check if auth user is subscribed to the incubator */ const isSubscribed = (0, react_1.useMemo)(() => (incubator) => { if (cache.includes(incubator.id)) { return Boolean(data.includes(incubator.id)); } if (authUserId) { if ('subscribed' in incubator) { return getSubscriptionStatus(incubator); } if (!isLoading(incubator)) { checkIsIncubatorFollowed(incubator); } } return false; }, [data, loading, cache, authUserId]); /** * Empty cache on logout */ (0, react_1.useEffect)(() => { if (!authUserId) { emptyCache(); } }, [authUserId]); if (!user) { return { incubators: data, loading, isLoading }; } return { incubators: data, loading, isLoading, subscribe, isSubscribed, refresh, emptyCache }; } exports.default = useSCSubscribedIncubatorsManager;