@selfcommunity/react-core
Version:
React Core Components useful for integrating UI Community components (react-ui).
143 lines (141 loc) • 5.55 kB
JavaScript
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;
;